[
  {
    "path": ".browserslistrc",
    "content": "Last 2 versions\n"
  },
  {
    "path": ".eslintignore",
    "content": "public\nstatic\n.cache\ncontent"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"extends\": [\"airbnb\"],\n  \"plugins\": [\"react\", \"jsx-a11y\", \"import\"],\n  \"rules\": {\n    \"react/prefer-stateless-function\": \"off\",\n    \"react/prop-types\": \"off\",\n    \"react/no-danger\": \"off\",\n    \"jsx-a11y/no-noninteractive-element-to-interactive-role\": \"off\",\n    \"jsx-a11y/anchor-is-valid\": [ \"error\", { \"components\": [ \"Link\" ], \"specialLink\": [ \"to\" ] } ]\n  },\n  \"settings\": {\n    \"import/core-modules\": []\n  },\n  \"env\": {\n    \"browser\": true\n  }\n}\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "Hello! Thank you for choosing to help contribute to one of the SendGrid open source libraries. There are many ways you can contribute and help is always welcome. We simply ask that you follow the following contribution policies.\n\nAll third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.\n\n* [Content Request](#feature-request)\n* [Improvements to the Codebase](#improvements-to-the-codebase)\n* [Local Setup](#install-and-run-locally)\n\t* [Dependencies](#dependencies)\n\t* [Setup Steps](#setup-steps)\n\t* [Configure Jekyll](#configure-jekyll)\n\t* [Running](#running)\n\t* [View Your Install](#view-your-install)\n* [Config](#config)\n\t* [Pages](#pages)\n\t\t* [SEO](#seo)\n\t* [Custom Liquid Tags](#tags)\n\t\t* [Anchors](#anchors)\n\t\t* [Info blocks](#info_blocks)\n\t\t* [API Examples](#api)\n* [JS and CSS, etc.](#js_and_css)\n* [Creating a Pull Request](#creating-a-pull-request)\n\nFeel free to grab an issue you want to work on. Please indicate that you have begun work on it to avoid collisions. Once a PR is made, community review, comments, suggestions, and additional PRs are welcomed and encouraged.\n\n**Submit all pull requests to the develop branch.**\n\nThere are a few ways to contribute, which we'll enumerate below:\n\n<a name=\"feature-request\"></a>\n## Content Request\n\nIf you'd like to make a content request, please read this section.\n\nThe GitHub issue tracker is the preferred channel for docs content requests, but please respect the following restrictions:\n\n- Please **search for existing issues** in order to ensure we don't have duplicate bugs/content requests.\n- Please be respectful and considerate of others when commenting on issues.\n\n<a name=\"improvements-to-the-codebase\"></a>\n## Improvements to the Codebase\n\nWe welcome direct contributions to the SendGrid docs code base. Thank you!\n\n\n<a name=\"local\"></a>\n## Local Setup\n\n<a name=\"dependencies\"></a>\n### Dependencies\n\n* Required:\n    * Git\n    * Rvm\n    * Homebrew\n    * npm\n    * Gatsby\n\n<a name=\"setup-steps\"></a>\n### Setup Steps\n\n* Install Git for:\n\t* [Mac](https://git-scm.com/download/mac) \n\t* [Windows](https://git-scm.com/download/win) \n\t* [Linux](https://git-scm.com/download/linux)\n\n* Install RVM\n\n\t`$ \\curl -sSL https://get.rvm.io | bash -s stable --ruby`\n\n* Install Homebrew (if you don't have it)\n\n\t`$ ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"`\n\n* Install npm\n\n\t`$ brew install npm`\n\n**Note:** You may need to use 'sudo' before the command to get it to work as intended. \n\n\n* Set your Node version\n\n\t`$ npm install -g n`\n\n\t`$ n 8.4.0`\n\n* clone repo\n\n\t`$ git clone https://github.com/sendgrid/docs.git`\n\n\n* Go to your docs directory\n\n\t`$ cd docs`\n\n* switch to develop branch to make changes\n\n\t`$ git checkout develop`\n\n* Install Gatsby\n\n    `npm ci`\n\n* Build the local site\n\n    `gatsby develop`\n    Gatsby starts a hot-reloading development environment accessible at [localhost:8000](localhost:8000)\n\n<a name=\"config\"></a>\n## Config\n\nThe gatsby config is defined in [gatsby-config.js](../gatsby-config.js).\nThe site config is defined in [data/SiteConfig.js](../data/SiteConfig.js)\nwhich you usually don't have to modify but are helpful to know about.\n\n<a name=\"pages\"></a>\n### Pages\n\nYou can write pages in markdown, HTML, or HAML. They all get converted to HTML when the site is generated.\n\nPages have a block of YAML at the top that sets a few options. They are pretty self-explanatory; here's an example\n\n```\n---\nlayout: page\nweight: 0\ntitle: Docs Home\nicon: icon-home\nshowTitle: false\nnavigation:\n  show: true\n---\n```\n\nWeights are same as the folder weights - the higher numbers move higher up the tree. Icons are based on the CSS icon class names from Twitter Bootstrap. showTitle and navigation[\"show\"] both default to true if not specified.\n\n<a name=\"seo\"></a>\n#### SEO\nVarious fields pertinent to SEO can be controlled through the YAML front matter. Here's an example:\n\n```\n---\nseo:\n  title: Really Great Documentation - SendGrid Documentation | SendGrid\n  override: true\n  description: This is some really great documentation! I hope you like it!\n  canonical: https://sendgrid.com/docs/really-great-docs\n---\n```\n\nBy default `<title>` tags follow the template `{Page Title} {Site Title}`. However the page title can be changed for the purpose of the tag by using `seo[\"title\"]`. `seo[\"override\"]` will override the entire template, instead making the title page `{seo[\"title\"]}`. `description` and `canonical` change their respective tags.\n\n<a name=\"tags\"></a>\n### Custom Liquid Tags\nThere are some custom plugins (look in the `plugins` folder) that define new liquid blocks for use in pages.\n\n<a name=\"anchors\"></a>\n#### Anchors\n\nYou can create anchor tags that will have named anchors generated for them automatically with links on hover.\nThe parameter is the wrapping element to use.\n\n```\n{% anchor h2 %}\nSome Anchor Text\n{% endanchor %}\n```\n<a name=\"info_blocks\"></a>\n#### Info blocks\n\nSimilarly you can create info and warning blocks:\n\n```\n{% info %}\nSome info for a breakout block.\n{% endinfo %}\n\n{% warning %}\n...And a warning breakout.\n{% endwarning %}\n```\n\n<a name=\"api\"></a>\n#### API Examples\n\nIf you are working on API reference docs, you can generate XML and JSON nav tabs and the corresponding example calls and responses like so:\n\n```\n{% apiexample identifier GET http://some.endpoint.url var1=stuff&var2=junk %}\n  {% response json %}\n{ \"foo\": \"bar\" }\n  {% endresponse %}\n\n  {% response xml %}\n<foo>bar</foo>\n  {% endresponse %}\n{% endapiexample %}\n```\n\nThe parameters for the `apiexample` block are: unique identifier, HTTP\nmethod, the url (excluding .json or .xml extension), and the data\npayload in querystring format.\n\n<a name=\"js_and_css\"></a>\n## JS and CSS, etc\n\nJavaScript and CSS are minified and combined. The files to be packaged and their orders are specified in `_includes/head.html` and <code>CssMinify.yml</code>. Preprocessing and options can be specified\nvia `_plugins/jekyll_asset_pipeline.rb`.\n\n<a name=\"creating-a-pull-request\"></a>\n## Creating a Pull Request\n\n1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your fork,\n   and configure the remotes:\n\n   ```bash\n   # Clone your fork of the repo into the current directory\n   $ git clone https://github.com/sendgrid/docs\n   # Navigate to the newly cloned directory\n   $ cd docs\n   # Assign the original repo to a remote called \"upstream\"\n   $ git remote add upstream https://github.com/sendgrid/docs\n   ```\n\n2. If you cloned a while ago, get the latest changes from upstream:\n\n   ```bash\n   $ git checkout <dev-branch>\n   $ git pull upstream <dev-branch>\n   ```\n\n3. Create a new topic branch (off the project development branch) to\n   contain your feature, change, or fix:\n\n   ```bash\n   $ git checkout -b <topic-branch-name>\n   ```\n\n4. Commit your changes in logical chunks. Please adhere to these [git commit\n   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)\n   or your code is unlikely to be merged into the main project. Use Git's\n   [rebase](https://help.github.com/articles/about-git-rebase/)\n   feature to tidy up your commits before making them public.\n\n   4a. Create tests.\n\n   4b. Create or update the example code that demonstrates the functionality of this change to the code.\n\n5. Locally merge (or rebase) the upstream development branch into your topic branch:\n\n   ```bash\n   $ git pull [--rebase] upstream main\n   ```\n\n6. Push your topic branch up to your fork:\n\n   ```bash\n   $ git push origin <topic-branch-name>\n   ```\n\n7. [Open a Pull Request](https://help.github.com/articles/about-pull-requests/)\n    with a clear title and description against the `develop` branch. All tests must be passing before we will review the PR.\n\nIf you have any additional questions, please feel free to [email](mailto:dx@sendgrid.com) us or create an issue in this repo.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE",
    "content": "\n<!-- \nPlease avoid submitting support questions here. You can contact our support team at https://support.sendgrid.com.\n\nIf you are able to login to https://support.sendgrid.com:\n1. Click \"Login & Contact Support.\"\n2. Then, select \"Contact Support\" to see your contact options.\n\nIf you are unable to login to https://support.sendgrid.com:\n1. Click \"Trouble Logging in?\"\n2. Then, select \"I am having a different login issue.\"\n\nIf you are reporting an issue with our docs, thanks for letting us know!\n-->\n\n## Expected content\n\n\n## Actual content\n\n**Link to page**:\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE",
    "content": "### Checklist\n**Required**\n- [x] I acknowledge that all my contributions will be made under the project's license.\n\n### PR Details\n**Description of the change**:\n**Reason for the change**:\n**Link to original source**:\n\n<!-- \nIf this pull request closes an issue, add the issue number here:  \n-->\nCloses #\n"
  },
  {
    "path": ".gitignore",
    "content": ".vagrant/\n.jekyll_indextank/\n.rvmrc\n_config.yml\n_config.dev.yml\n_config.deploy.yml\n.bundle\n.DS_Store\n.sass-cache\n.gist-cache\n.idea\n.pygments-cache\n_deploy\nsass.old\nsource.old\nsource/_stash\nsource/stylesheets/screen.css\nvendor\nnode_modules\npdf\npublic\nlinklint_logs\nbower_components\nsource/_assets/bower_components\nsource/.asset_pipeline\nnpm-debug.log\n.cache"
  },
  {
    "path": ".nvmrc",
    "content": "12.*"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"trailingComma\": \"es5\"\n}\n"
  },
  {
    "path": ".stylelintrc",
    "content": "{\n  \"extends\": \"stylelint-config-standard\",\n  \"plugins\": [\n    \"stylelint-selector-bem-pattern\"\n  ],\n  \"rules\": {\n    \"indentation\": 2,\n    \"at-rule-no-unknown\": null,\n    \"plugin/selector-bem-pattern\": {\n      \"componentName\": \"(([a-z0-9]+(?!-$)-?)+)\",\n      \"componentSelectors\": {\n        \"initial\": \"\\\\.{componentName}(((__|--)(([a-z0-9\\\\[\\\\]'=]+(?!-$)-?)+))+)?$\"\n      },\n      \"ignoreSelectors\": [\n        \".*\\\\.no-js.*\",\n        \".*\\\\.js-.*\",\n        \".*\\\\.lt-ie.*\"\n      ]\n    }\n  }\n}"
  },
  {
    "path": ".travis.yml",
    "content": "sudo: required\ndist: focal\nlanguage: node_js\nbranches:\n  only:\n    - main\n    - develop\nnode_js:\n  - 12.16.*\ncache:\n  - pip\n  - npm\ninstall:\n  - pip install --user awscli\nbefore_script:\n  - npm ci\nscript: ./travis/build.sh\ndeploy:\n  - provider: script\n    script: ./travis/deploy.sh\n    skip_cleanup: true\n    on:\n      repo: sendgrid/docs\n      all_branches: true\n      condition: $TRAVIS_BRANCH = develop || $TRAVIS_BRANCH = main\n  - provider: script\n    script: ./travis/deploy_open_source.sh\n    skip_cleanup: true\n    on:\n      repo: sendgrid/docs\n      all_branches: true\n      condition: $TRAVIS_BRANCH = develop\nafter_deploy: ./travis/after_deploy.sh\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": true\n  },\n  \"eslint.enable\": true,\n  \"editor.tabSize\": 2,\n  \"editor.insertSpaces\": true,\n  \"eslint.options\": {\n    \"config\": \".eslintrc.json\",\n    \"configFile\": \".eslintrc.json\"\n  }\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# SendGrid Community Code of Conduct\n\nThe SendGrid open source community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences successes and continued growth. When you're working with members of the community, we encourage you to follow these guidelines, which help steer our interactions and strive to maintain a positive, successful, and growing community.\n\n### Be Open\nMembers of the community are open to collaboration, whether it's on pull requests, code reviews, approvals, issues or otherwise. We're receptive to constructive comments and criticism, as the experiences and skill sets of all members contribute to the whole of our efforts. We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate, and everyone can make a difference.\n\n### Be Considerate\nMembers of the community are considerate of their peers, which include other contributors and users of SendGrid. We're thoughtful when addressing the efforts of others, keeping in mind that often the labor was completed with the intent of the good of the community. We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views.\n\n### Be Respectful\nMembers of the community are respectful. We're respectful of others, their positions, their skills, their commitments and their efforts. We're respectful of the volunteer efforts that permeate the SendGrid community. We're respectful of the processes outlined in the community, and we work within them. When we disagree, we are courteous in raising our issues. Overall, we're good to each other. We contribute to this community not because we have to, but because we want to. If we remember that, these guidelines will come naturally.\n\n## Additional Guidance \n\n### Disclose Potential Conflicts of Interest\nCommunity discussions often involve interested parties. We expect participants to be aware when they are conflicted due to employment or other projects they are involved in and disclose those interests to other project members. When in doubt, over-disclose. Perceived conflicts of interest are important to address so that the community’s decisions are credible even when unpopular, difficult or favorable to the interests of one group over another.\n\n### Interpretation\nThis Code is not exhaustive or complete. It is not a rulebook; it serves to distill our common understanding of a collaborative, shared environment and goals. We expect it to be followed in spirit as much as in the letter. When in doubt, try to abide by [SendGrid’s cultural values](https://sendgrid.com/blog/employee-engagement-the-4h-way) defined by our “4H’s”: Happy, Hungry, Humble, and Honest. \n\n### Enforcement\nMost members of the SendGrid community always comply with this Code, not because of the existence of this Code, but because they have long experience participating in open source communities where the conduct described above is normal and expected. However, failure to observe this Code may be grounds for suspension, reporting the user for abuse or changing permissions for outside contributors.\n\n## If you have concerns about someone’s conduct\n**Initiate Direct Contact** - It is always appropriate to email a community member (if contact information is available), mention that you think their behavior was out of line, and (if necessary) point them to this Code.\n\n**Discuss Publicly** - Discussing publicly is always acceptable. Note, though, that approaching the person directly may be better, as it tends to make them less defensive, and it respects the time of other community members, so you probably want to try direct contact first.\n\n**Contact the Moderators** - You can reach the SendGrid moderators by emailing dx@sendgrid.com.\n\n## Submission to SendGrid Repositories\nFinally, just a reminder, changes to the SendGrid repositories will only be accepted upon completion of the [SendGrid Contributor Agreement](https://cla.sendgrid.com). \n\n## Attribution\n\nSendGrid thanks the following, on which it draws for content and inspiration:\n\n* [Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/)  \n* [Open Source Initiative General Code of Conduct](https://opensource.org/codeofconduct) \n* [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct.html) \n\n\n\n\n"
  },
  {
    "path": "README.md",
    "content": "![SendGrid Logo](https://uiux.s3.amazonaws.com/2016-logos/email-logo%402x.png)\n\n\n**THIS REPOSITORY WILL NO LONGER BE MONITORED AFTER JUNE 15, 2021**\n\n# SendGrid Documentation\n\n[![Build Status](https://travis-ci.org/sendgrid/docs.svg?branch=develop)](https://travis-ci.org/sendgrid/docs)\n[![Twitter Follow](https://img.shields.io/twitter/follow/sendgrid.svg?style=social&label=Follow)](https://twitter.com/sendgrid)\n[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./license)\n\n## Introduction\n\nThis is a Gatsby site.\n\nThe develop branch is merged to production weekly (unless we need to do a release sooner than that).\n\nThe main branch is continuously deployed to production.\n\n- **_Please_, feel free to make any contributions you feel will make SendGrid Documentation better.**\n  - **Familiarize yourself with our [Styleguide](styleguide.md)**\n- **Submit all pull requests to the develop branch**\n\n- **All third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.**\n  - **When making contributions, be sure to place an \"x\" in the brackets of the PR description where it says \"[ ] I acknowledge that all my contributions will be made under the project's license.\"**\n\n## Table of Contents\n\n- [Local Dependency Setup](#local-dependency-setup)\n  - [Mac](#mac)\n  - [Windows](#windows)\n  - [Linux](#linux)\n- [Local Repository Setup](#local-repository-setup)\n- [About](#about)\n- [License](#license)\n\n## Local Dependency Setup\n\n### Dependencies\n\n- Required:\n  - [Git](https://git-scm.com)\n  - [npm](https://www.npmjs.com)\n  - [Gatsby](https://www.gatsbyjs.org)\n\n**Note:** Dependencies differ for work on the `old-develop` branch. If you need to work on `old-develop`, please see the README file after checking out that branch. This is uncommon.\n\n## Setup Steps\n\n#### Mac\n\n- Install Git\n  - [Git for Mac](https://git-scm.com/download/mac)\n\nWe recommend using [Homebrew](https://brew.sh/) to install and manage packages on a MacOS.\n\n- Install Homebrew:\n\n  ```shell\n  $ ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n  ```\n\n- Install npm:\n\n  ```shell\n  $ brew install npm\n  ```\n\n- Set your Node.js version to 12\n\n  ```shell\n  $ npm install -g n\n\n  $ n 12.16.1\n  ```\n\n#### Windows\n\n- Install Git\n\n  - [Git for Windows](https://git-scm.com/download/win)\n\n- Install npm\n\n  - To install Node.js and npm on Windows, you can download the installer here:\n    - https://nodejs.org/en/#home-downloadhead\n  - Use Node.js version 12, the current Long Term Support (LTS) version.\n\n#### Linux\n\n- Install Git:\n\n  - [Git for Linux](https://git-scm.com/download/linux)\n\n- Install npm:\n\n  - To install Node.js and npm on Linux, select the package and instillation appropriate for your Linux distribution. You can find help here:\n    - https://nodejs.org/en/download/package-manager/\n  - Use Node.js version 12, the current Long Term Support (LTS) version.\n\n## Local Repository Setup\n\n**Note:** When working on Windows, you may need to run Command Prompt or PowerShell as an Administrator.\n\n**Note:** When working on Mac or Linux, you may need to run some commands using \"sudo.\"\n\n- Clone the SendGrid Docs Repo\n\n  - SSH:\n\n    ```shell\n    $ git clone git@github.com:sendgrid/docs.git\n    ```\n\n  - HTTPS:\n\n    ```shell\n    $ git clone https://github.com/sendgrid/docs.git\n    ```\n\n- Go to your docs directory\n\n  ```shell\n  $ cd docs\n  ```\n\n- Switch to develop branch to make changes\n\n  ```shell\n  $ git checkout develop\n  ```\n\n- Install the Gatsby CLI\n\n  ```shell\n  $ npm install -g gatsby-cli\n  ```\n\n- Install npm package dependencies\n\n  ```shell\n  $ npm ci\n  ```\n\n- Build the local site\n  - With the Gatsby CLI installed globally, you can run:\n    ```shell\n    $ gatsby develop\n    ```\n  - Alternatively, you can run:\n    ```shell\n    $ npm run develop\n    ```\n  - Either of the above commands should start a hot-reloading development environment accessible at [localhost:8000](localhost:8000)\n\n## About\n\nSendGrid is guided and supported by the SendGrid [Developer Experience Team](mailto:dx@sendgrid.com).\nIt is maintained and funded by SendGrid, Inc. The names and logos are trademarks of SendGrid, Inc.\n\n## License\n\nSendGrid Documentation is licensed under the **[MIT License (MIT)](https://github.com/sendgrid/docs/blob/develop/license)**\n"
  },
  {
    "path": "content/docs/examples.md",
    "content": "---\ntitle: Markdown Examples\nslug: markdown-examples\nnavigation:\n  show: true\n---\n\n## Callout Link\n\n```html\n<call-out-link linktext=\"Go To Course\" img=\"/img/search-darth-vader.gif\" link=\"https://rise.articulate.com/share/uGIBV4dMNFn-HzrIMDW_s2Kh4dxMH0vr#/\">\n\n### I'm a course call out title\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out-link>\n```\n\n<call-out-link linktext=\"Go To Course\" img=\"/img/search-darth-vader.gif\" link=\"https://rise.articulate.com/share/uGIBV4dMNFn-HzrIMDW_s2Kh4dxMH0vr#/\">\n\n### I'm a course call out title\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out-link>\n\n## Callouts\n\n### Callout Info\n\n```html\n<call-out>\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n```\n\n<call-out>\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n\n### Callout Warning\n\n```html\n<call-out type=\"warning\">\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n```\n\n<call-out type=\"warning\">\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n\n### Callout Beta\n\n```html\n<call-out type=\"beta\">\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n```\n\n<call-out type=\"beta\">\n\nMontes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.\n\n</call-out>\n\n## Code Group\n\n````html\n<code-group langs=\"Html, JavaScript, Go\">\n\n```html\n  <div class=\"yay-html\">Yay HTML</div>\n```\n\n```javascript\n  consol.log('Yay, JavaScript!')\n```\n\n```go\n  print('Yay, Go!');\n```\n</code-group>\n````\n\n\n<code-group langs=\"Html, JavaScript, Go\">\n\n```html\n  <div class=\"yay-html\">Yay HTML</div>\n```\n\n```javascript\n  consol.log('Yay, JavaScript!')\n```\n\n```go\n  print('Yay, Go!');\n```\n</code-group>\n\n"
  },
  {
    "path": "content/docs/for-developers/parsing-email/inbound-email.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Inbound Email Parse Webhook\ngroup: inbound-parse\nnavigation:\n  show: true\n---\n\nSendGrid can parse the attachments and contents of incoming emails. Application examples include receiving uploads and posting blog articles via email.\n\nThe Parse API will POST the parsed email to a URL that you specify. If a POST is unsuccessful, SendGrid automatically queues and retries any POSTs that respond with a 5XX status. This prevents data loss for customers who have misconfigured their website or POST URL.\n\n<call-out>\n\nRespond with a 2xx status to the POST request to stop the email from retrying.\n\n</call-out>\n\nTo avoid returning an error your link must return a 2xx HTTP code when the email is received. This response lets our system know that your link has received the email. It is then removed from our send queue. If we do **not** get a valid 2xx HTTP response, our servers will believe they have failed to deliver your message. Messages that cannot be delivered after 3 days will be dropped.\n\n## \tSetup\n\nThe following steps are required to begin parsing email:\n\n-   Point the MX Record of a Domain/Hostname or Subdomain to **mx.sendgrid.net**\n-   Associate the Domain/Hostname and the URL in the [Parse API settings page](https://sendgrid.com/developer/reply/).\n\n<call-out type=\"warning\">\n\nThe Inbound Parse Webhook will not follow redirects. Please make sure to use the correct URL, or posting will fail.\n\n</call-out>\n\nYou must ensure that the subdomain-domain combination for your receiving domain is unique.\n\n<call-out type=\"warning\">\n\nOnly authenticated domains may be used when configuring Inbound Parse!\n\n</call-out>\n\nSee [Setting Up The Inbound Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) for step-by-step instructions.\n\n<call-out>\n\nThe total message size limit, including the message itself and any number of attachments, is 20MB. Be aware that other mail handlers will have their own limitations, and some ISPs and companies may either dramatically limit the size and/or type of attachments, or even block them altogether.\n\n</call-out>\n\n## \tCharacter Sets and Header Decoding\n\nIf you receive an email which is not in ASCII only format, you will want to read this section.\n\nMessages and their headers can have character set data associated with them. In order to simplify the parsing of messages for the end user, SendGrid will decode the to, from, cc, and subject headers if needed. All headers will be converted to UTF-8 for uniformity since technically a header can be in many different character sets.\n\nThe charsets variable will contain a JSON encoded hash of the header / field name and its respective character set. For instance, it may look like:\n\n```ruby\n[charsets] => {\"to\":\"UTF-8\",\"cc\":\"UTF-8\",\"subject\":\"UTF-8\",\"from\":\"UTF-8\",\"text\":\"iso-8859-1\"}\n```\n\nThis shows that all headers should be treated as UTF-8, and the text body is latin1.\n"
  },
  {
    "path": "content/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook.md",
    "content": "---\nseo:\n  title: Setting Up The Inbound Parse Webhook\n  description: How to set up the Inbound Parse Webhook to process and parse incoming email\n  keywords: Inbound Parse, Inbound Parse Webhook, Email Processing\ntitle: Setting Up The Inbound Parse Webhook\ngroup: inbound-parse\nweight: 90\nlayout: page\nnavigation:\n  show: true\n---\n\nAs you’re probably aware, SendGrid is great at sending your email, but SendGrid can also help you process email using the Inbound Parse Webhook. The Inbound Parse Webhook processes all incoming email for a domain or subdomain, parses the contents and attachments then POSTs multipart/form-data to a URL that you choose.\n\n<call-out>\n\nXML is only available in v2.\n\n</call-out>\n\nWhat your application does with this parsed data is up to you. For some ideas of what the Inbound Parse Webhook can do, check out this [blog post](https://sendgrid.com/blog/parse-api-oh-what-you-can-do/).\n\n<call-out>\n\nCheck out some pre-made integrations for the SendGrid Inbound Parse Webhook in the [Library Index]({{root_url}}/for-developers/sending-email/libraries/#web-api-libraries).\n\n</call-out>\n\n## Setup\n\nTo begin processing email using SendGrid's Inbound Parse Webhook, you will have to setup MX Records, choose the hostname (or receiving domain) that will be receiving the emails you want to parse, and define the URL where you want to POST your parsed emails.\n\n### Setting up an MX Record\n\n1. Navigate to the MX Records page on your hosting provider’s website. If you’re unsure who your hosting or DNS provider is, please contact your website administrator.\n\n2. Create a new MX record for the subdomain (e.g. parse.yourdomain.com) you want to process incoming email.\n\n<call-out>\n\nThis hostname should be used exclusively to parse your incoming email.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDo not change the MX record for your domain. If you do, you will no longer receive email.\n\n</call-out>\n\n3. Assign the MX record a priority of 10, and point it to the address: `mx.sendgrid.net.`\n\nIt should look something like this:\n\n![]({{root_url}}/images/Inbound_Parse_01_MX_Record.png)\n\n<call-out>\n\nIf there is no field for priority, type 10 before the address. e.g. `10 mx.sendgrid.net.`\n\n</call-out>\n\n### Pointing to a Hostname and URL\n\n1.  From your SendGrid Dashboard click **Settings**, and then click **Inbound Parse**.\n\nYou are now on the Inbound Parse page.\n\n2.  Click **Add Host & URL**.\n\nHere you will specify the subdomain and root domain of the receiving domain (or hostname). All emails sent to this receiving domain will be parsed.\n\nIf you use the same return path (subdomain) as your authenticated domain, you must have Automatic Security disabled on the authenticated domain. Otherwise, those messages will bounce due to an infinite CNAME>MX loop.\n\n<call-out>\n\nThe URL must be accessible from the public web.\n\n</call-out>\n\n3. Enter the subdomain (for example, \"parse\") and select the authenticated root domain for your receiving domain. Enter the public URL where you would like the parsed data to be POSTed.\n\n![]({{root_url}}/images/setting_up_inbound_parse_1.png)\n\n4. (Optional) Check **Spam Check** if you want Inbound Parse to check incoming email for spam. Checking this box will also include the spam report and spam score in the payload.\n\n5. (Optional) Check **Send Raw** if you would prefer to receive the full MIME message URL encoded in multipart/form-data.\n\n<call-out type=\"warning\">\n\nIf you do not check **Send Raw**, the post will be multipart/form-data with the email content URL encoded, but the attachments will be in multipart/form-data. If your code is only set up to read URL encoding, attachments could be dropped.\n\n</call-out>\n\n6. Click Save.\n\nYou have just finished configuring Inbound Parse!\n\n## Testing\n\nTo test if everything is working, send an email from your email account to example@example.com.\n\n<call-out>\n\nThe local-part (i.e. anything before @) can be any word or combination because all email for the domain or subdomain will be processed.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nRemember to direct your incoming email to your hostname (for example, example@example.com). If you do not, your incoming email will not be parsed.\n\n</call-out>\n\n## Default Parameters\n\n<table class=\"table\">\n  <colgroup>\n  <col class=\"table-col-200\">\n  <col>\n  </colgroup>\n   <tbody>\n      <tr>\n         <th>headers</th>\n         <td>The raw headers of the email.</td>\n      </tr>\n      <tr>\n         <th>dkim</th>\n         <td>A string containing the verification results of any DKIM and domain keys signatures in the message.</td>\n      </tr>\n      <tr>\n         <th>content-ids</th>\n         <td>A string containing the number of attachments. </td>\n      </tr>\n      <tr>\n         <th>to</th>\n         <td>Email recipient field, as taken from the message headers.</td>\n      </tr>\n      <tr>\n         <th>Text</th>\n         <td>Email body in plaintext formatting.</td>\n      </tr>\n      <tr>\n         <th>html</th>\n         <td>HTML body of email. If not set, email did not have an HTML body.</td>\n      </tr>\n      <tr>\n         <th>from</th>\n         <td>Email sender, as taken from the message headers.</td>\n      </tr>\n      <tr>\n         <th>sender_ip</th>\n         <td>A string of the sender’s ip address.</td>\n      </tr>\n     <tr>\n         <th>spam_report</th>\n         <td>Spam Assassin’s spam report.</td>\n      </tr>\n      <tr>\n         <th>envelope</th>\n         <td>A string containing the SMTP envelope. This will have 2 variables: <code>to</code>, which is a single-element array containing the address that we received the email to, and <code>from</code>, which is the return path for the message.</td>\n      </tr>\n      <tr>\n         <th>attachments</th>\n         <td>Number of attachments included in email.</td>\n      </tr>\n      <tr>\n         <th>subject</th>\n         <td>Email Subject.</td>\n      </tr>\n      <tr>\n         <th>spam_score</th>\n         <td>Spam Assassin’s rating for whether or not this is spam.</td>\n      </tr>\n      <tr>\n         <th>attachment-info</th>\n         <td>A JSON map where the keys are named attachment{X}. Each attachment key points to a JSON object containing three fields, <code>filename</code>, <code>type</code>, and <code>content-id</code>. The <code>filename</code> field is the name of the file (if it was provided). The <code>type</code> field is the <a href=\"http://en.wikipedia.org/wiki/Internet_media_type\">media type</a> of the file. <code>X</<code> is the total number of attachments. For example, if the number of attachments is 0, there will be no attachment files. If the number of attachments is 3, parameters attachment1, attachment2, and attachment3 will have file uploads. </td>\n      </tr>\n      <tr>\n         <th>charsets</th>\n         <td>A string containing the character sets of the fields extracted from the message.</td>\n      </tr>\n      <tr>\n         <th>SPF</th>\n         <td>The results of the Sender Policy Framework verification of the message sender and receiving IP address.</td>\n      </tr>\n      </tbody>\n</table>\n\n## Example Default Payload\n\n```\n[Date] array(16) {\n  [\"headers\"]=>\n  string(1970) \"Received: by mx0047p1mdw1.sendgrid.net with SMTP id 6WCVv7KAWn Wed, 27 Jul 2016 20:53:06 +0000 (UTC)\nReceived: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by mx0047p1mdw1.sendgrid.net (Postfix) with ESMTPS id AA9FFA817F2 for <example@example.comom>; Wed, 27 Jul 2016 20:53:06 +0000 (UTC)\nReceived: by mail-io0-f169.google.com with SMTP id b62so81593819iod.3 for <example@example.comom>; Wed, 27 Jul 2016 13:53:06 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=GH5YTxjt6r4HoTa+94w6ZGQszFQSgegF+Jlv69YV76OLycJI4Gxdwfh6Wlqfez5yID 5dsWuqaVJZQyMq/Dy/c2gHSqVo60BKG56YrynYeSrMPy8abE/6/muPilYxDoPoEyIr/c UXH5rhOKjmJ7nICKu1o99Tfl0cXyCskE7ERW0=\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=Sq6LVHbmywBdt3sTBn19U8VOmelfoJltz8IcnvcETZsYwk96RBxN+RKMN5fOZSKw4j 15HrgdIFfyDmp67YK0ygvOITlTvZ6XY5I0PtnvDtAQt79kS3tKjI3QKJoEp/ZjIjSzlL KG7agl6cxFgBbIN0yHWBOvy3O+ZXY8tZdom1yOvULjmjW1U9JkdOs+aJ6zq4qhZX/RM/ tIgLB461eJ5V95iQDDc5Ibj9Cvy4vJfXLQRO0nLVQAT2Yz58tkEO1bDZpWOPAyUNneIL yhIWp+SpbuqhMA68mq0krG1PjmWalUbpVcGJIGuOKB9mQFFo/MqdrUCjvYnyo1jPLPeX psdQ==\nX-Gm-Message-State: AEkoousvdxmDoxLlTUYJ1AOmCGJv77xRBBlfKv6YrthH0M2NueMwlOxUD6t8nidE9uonXbdJ/DQy/chmHUnN//a4\nX-Received: by 10.107.6.101 with SMTP id 98mr38024553iog.41.1469652785829; Wed, 27 Jul 2016 13:53:05 -0700 (PDT)\nMIME-Version: 1.0\nReceived: by 10.107.48.17 with HTTP; Wed, 27 Jul 2016 13:53:05 -0700 (PDT)\nFrom: Sender Name <example@example.com>\nDate: Wed, 27 Jul 2016 14:53:05 -0600\nMessage-ID: <CAN_P_JMvV7ZpAQhOnDienypLrJmuhN=LQWweu4yScw4jQyXY2w@mail.gmail.com>\nSubject: Different File Types\nTo: example@example.comom\nContent-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c\n\"\n  [\"dkim\"]=>\n  string(22) \"{@sendgrid.com : pass}\"\n  [\"content-ids\"]=>\n  string(37) \"{\"ii_1562e2169c132d83\":\"attachment1\"}\"\n  [\"to\"]=>\n  string(26) \"example@example.comom\"\n  [\"html\"]=>\n  string(479) \"<div dir=\"ltr\">Here&#39;s an email with multiple attachments<div><br></div><div><img src=\"cid:ii_1562e2169c132d83\" alt=\"Inline image 1\" width=\"455\" height=\"544\"><br clear=\"all\"><div><br></div>-- <br><div class=\"gmail_signature\" data-smartmail=\"gmail_signature\"><div dir=\"ltr\"><img src=\"https://sendgrid.com/brand/sg-logo-email.png\" width=\"96\" height=\"17\"><br><div><br></div></div></div>\n</div></div>\n\"\n  [\"from\"]=>\n  string(33) \"Sender Name example@example.com\"\n  [\"text\"]=>\n  string(139) \"Here's an email with multiple attachments\n\"\n  [\"sender_ip\"]=>\n  string(14) \"209.85.223.169\"\n  [\"spam_report\"]=>\n  string(844) \"Spam detection software, running on the system \"mx0047p1mdw1.sendgrid.net\", has\nidentified this incoming email as possible spam. The original message\nhas been attached to this so you can view it (if it isn't spam) or label\nsimilar future email. If you have any questions, see\n@@CONTACT_ADDRESS@@ for details.\n\nContent preview:  Here's an email with multiple attachments [image: Inline image\n   1] -- [...]\n\nContent analysis details:   (2.6 points, 5.0 required)\n\n pts rule name              description\n---- ---------------------- --------------------------------------------------\n 0.8 HTML_IMAGE_RATIO_02    BODY: HTML has a low ratio of text to image area\n 0.0 HTML_MESSAGE           BODY: HTML included in message\n 1.8 HTML_IMAGE_ONLY_08     BODY: HTML: images with 400-800 bytes of words\n 0.0 T_MIME_NO_TEXT         No text body parts\n\n\"\n  [\"envelope\"]=>\n  string(66) \"{\"to\":[\"example@example.comom\"],\"from\":\"example@example.com\"}\"\n  [\"attachments\"]=>\n  string(1) \"2\"\n  [\"subject\"]=>\n  string(20) \"Different File Types\"\n  [\"spam_score\"]=>\n  string(5) \"2.597\"\n  [\"attachment-info\"]=>\n  string(287) \"{\"attachment2\":{\"filename\":\"DockMcWordface.docx\",\"name\":\"DockMcWordface.docx\",\"type\":\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"},\"attachment1\":{\"filename\":\"MG_2359.jpg\",\"name\":\"_MG_2359.jpg\",\"type\":\"image/jpeg\",\"content-id\":\"ii_1562e2169c132d83\"}}\"\n  [\"charsets\"]=>\n  string(77) \"{\"to\":\"UTF-8\",\"html\":\"UTF-8\",\"subject\":\"UTF-8\",\"from\":\"UTF-8\",\"text\":\"UTF-8\"}\"\n  [\"SPF\"]=>\n  string(4) \"pass\"\n}\n\n\n```\n\n## Raw Parameters\n\n<table class=\"table table-bordered table-striped\">\n  <colgroup>\n  <col class=\"table-col-200\">\n  </colgroup>\n   <tbody>\n      <tr>\n         <th>dkim</th>\n         <td>A string containing the verification results of any DKIM and domain keys signatures in the message.</td>\n      </tr>\n      <tr>\n         <th>Email</th>\n         <td>A string containing the email headers, date, body, and attachments</td>\n      </tr>\n      <tr>\n         <th>To</th>\n         <td>Email recipient field as taken from the message headers.</td>\n      </tr>\n      <tr>\n         <th>cc</th>\n         <td>Email cc field, as taken from the message headers.</td>\n      </tr>\n      <tr>\n         <th>From</th>\n         <td>Email sender, as taken from the message headers.</td>\n      </tr>\n      <tr>\n         <th>Text</th>\n         <td>Email body in plaintext formatting.</td>\n      </tr>\n      <tr>\n         <th>html</th>\n         <td>HTML body of email. If not set, email did not have an HTML body.</td>\n      </tr>\n      <tr>\n      <tr>\n         <th>Sender IP</th>\n         <td>Email sender IP address.</td>\n      </tr>\n      <tr>\n         <th>Spam Report</th>\n         <td>Spam Assassin’s spam report.</td>\n      </tr>\n      <tr>\n         <th>Envelope</th>\n         <td>A string containing the SMTP envelope. This will have 2 variables: <code>to</code>, which is an single-element array containing the addresses that received the email, and <code>from</code>, which is the return path for the message.</td>\n      </tr>\n      <tr>\n         <th>Subject</th>\n         <td>Email subject.</td>\n      </tr>\n      <tr>\n         <th>Spam_Score</th>\n         <td>Spam Assassin’s rating for whether or not this is spam.</td>\n      </tr>\n      <tr>\n         <th>Charsets</th>\n         <td>A string containing the character sets of the fields extracted from the message.</td>\n      </tr>\n      <tr>\n         <th>SPF</th>\n         <td>The results of the Sender Policy Framework verification of the message sender and receiving IP address.</td>\n      </tr>\n    </tbody>\n</table>\n\n<call-out>\n\nWe recommend limiting the total size of your message, including the message itself and all attachments, to 30MB. Be aware that other mail handlers will have their own limitations, and some ISPs and companies may either dramatically limit the size and/or type of attachments, or even block them altogether.\n\n</call-out>\n\n## Example Raw Payload\n\n```\narray(11) {\n  [\"dkim\"]=>\n  string(22) \"{@sendgrid.com : pass}\"\n  [\"email\"]=>\n  string(8879) \"Received: by mx0032p1mdw1.sendgrid.net with SMTP id rOkt2xLLKV Tue, 19 Jul 2016 15:06:29 +0000 (UTC)\nReceived: from mail-it0-f45.google.com (mail-it0-f45.google.com [209.85.214.45]) by mx0032p1mdw1.sendgrid.net (Postfix) with ESMTPS id 26D6080397 for <parse@parse.yourdomain>; Tue, 19 Jul 2016 15:06:22 +0000 (UTC)\nReceived: by mail-it0-f45.google.com with SMTP id f6so93587860ith.1 for <example@example.comom>; Tue, 19 Jul 2016 08:06:22 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=c1I/LcqHEJklmAThWr9Z8NKlTPHUlE/8sDSpK382fJtIQcGdUtczG0pijnUHegrFVt FDr4NehtJDD9KFvXLXboLCtObsu5HTN99ckUCCZTibZseA+J8U3jjCqTdj1fmUage5C7 //Iwi0Ndioonzhm18J7KStap66yZ69ED7UxPk=\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=lgmLXnmmpNcQMckjshsZsa2/8OjFZzntWYSG5XZo0fi32KHLuBLSHuNDFXn0V4ICp1 1xuT2fZCyhBSgNBiWNbjqFspdemzrBjaI1Tgm/Zz8Fv6wW2XdjpoANNQzJxfdhnecPd5 HvZ5P8+KTqjr4tAa9RmLthDc3UqhV9NRnCnhbW/AZaVQLB8eoJus92tD1GeXpBQml5XF m6vPUGrWGZWNugINkRKxIpk+2uECglAjNm4NpZIi9j7N94CxA18RC4NJ59WIsSybtIer hbCgT1Q13rvGEzvnp6FfFQVbE3DOibNqd0bh/EvZCagFVbnenNc/Q+qHtU9KqFlisSOp xh0w==\nX-Gm-Message-State: ALyK8tINVaZIP8YCgQbpg5ya8EnqQo76uxkXUPpDnM+kAyAQQzehFU10EgyuAe2fAmWf/muBiFDy0JDU74Eclp1/\nX-Received: by 10.36.76.16 with SMTP id a16mr4479786itb.77.1468940781988; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)\nMIME-Version: 1.0\nReceived: by 10.107.48.17 with HTTP; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)\nFrom: Sender Name <example@example.com>\nDate: Tue, 19 Jul 2016 09:06:21 -0600\nMessage-ID: <CAN_P_JNa25--hzm5=-ES9cnxgWa+h+E49OOAS7sPpV0gsoXCOw@mail.gmail.com>\nSubject: Hello\nTo: example@example.comom\nContent-Type: multipart/mixed; boundary=001a11447dc881e40f0537fe6d5a\n\n--001a11447dc881e40f0537fe6d5a\nContent-Type: multipart/alternative; boundary=001a11447dc881e40b0537fe6d58\n\n--001a11447dc881e40b0537fe6d58\nContent-Type: text/plain; charset=UTF-8\n\nThis is a test email with 1 attachment.\n\n--001a11447dc881e40b0537fe6d58\nContent-Type: text/html; charset=UTF-8\nContent-Transfer-Encoding: quoted-printable\n\n<div dir=3D\"ltr\">This is a test email with 1 attachment.<br clear=3D\"all\"><=\ndiv><br></div>-- <br><div class=3D\"gmail_signature\" data-smartmail=3D\"gmail=\n_signature\"><div dir=3D\"ltr\"><img src=3D\"https://sendgrid.com/brand/sg-logo=\n-email.png\" width=3D\"96\" height=3D\"17\"><br><div><br></div></div></div>\n</div>\n\n--001a11447dc881e40b0537fe6d58--\n\n--001a11447dc881e40f0537fe6d5a\nContent-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;\n\tname=\"DockMcWordface.docx\"\nContent-Disposition: attachment; filename=\"DockMcWordface.docx\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_iqtleujy0\n\nUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAASAAAAd29yZC9udW1iZXJpbmcu\neG1spZJBboMwEEVP0Dsg7xNIF1WFQrNo1G66a3uAiTFgxfZYYwPN7euEAC2V\nKkpXCMb//e/hb3cfWkWNICfRZGyzTlgkDMdcmjJj729Pq3sWOQ8mB4VGZOwk\nHNs93Gzb1NT6ICiciwLCuFTzjFXe2zSOHa+EBrdGK0wYFkgafHilMtZAx9qu\nOGoLXh6kkv4U3ybJHbtiMGM1mfSKWGnJCR0W/ixJsSgkF9dHr6A5vp1kj7zW\nwviLY0xChQxoXCWt62l6KS0Mqx7S/HaJRqv+XGvnuOUEbdizVp1Ri5RbQi6c\nC1/33XAgbpIZCzwjBsWcCN89+yQapBkw53ZMQIP3Onhfl3ZBjRcZd+HUnCDd\n6EUeCOj0MwUs2OdXvZWzWjwhBJWvaSjkEgSvgHwPUEsICvlR5I9gGhjKnJez\n6jwh5RJKAj2W1P3pz26SSV1eK7BipJX/oz0T1pbFD59QSwcIJ5yx3VgBAAC7\nBAAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAARAAAAd29yZC9zZXR0aW5n\ncy54bWyllMFuozAQhp9g3wH5nkCqardCJZXaqnvZPaV9gIltwIrtscYGNm+/\nJgTYZqWKpieMx/P94/GvuX/4Y3TSSvIKbcE264wl0nIUylYFe3t9Wd2xxAew\nAjRaWbCj9Oxh++2+y70MIZ7ySSRYnxtesDoEl6ep57U04NfopI3BEslAiL9U\npQbo0LgVR+MgqL3SKhzTmyz7zs4YLFhDNj8jVkZxQo9l6FNyLEvF5fkzZtAS\n3SHlGXljpA0nxZSkjjWg9bVyfqSZa2kxWI+Q9qNLtEaP5zq3RE0QdLHRRg9C\nHZJwhFx6H3efh+BE3GQLGtgjpowlJbzXHCsxoOyE6c1xAZq011H73LQTar7I\n3AuvlxQyhH6pPQEd/68Crujnv/lOLXLxBSFmhYYmQ16D4DVQGAH6GoJGfpDi\nCWwLk5lFtcjOFyShoCIws0n9p152k13YZVeDkzOt+hrtJ2Hj2DYOIKG803B8\nBH6o4qYVJ6Gky1uIXtqw9HRIltDo8Ar7XUA3Bn/cZEN4GETzajcMtQlyy+LS\ngonmfjezfqOQfaghtfw6vWQ6a6bzDN3+BVBLBwiI6qJIqQEAAIgFAABQSwME\nFAAICAgAdz7zSAAAAAAAAAAAAAAAABIAAAB3b3JkL2ZvbnRUYWJsZS54bWyl\nlE1OwzAQhU/AHSLv26QsEIqaVogKNuyAA0wdJ7Fqe6yxk9Db4zZ/UCQUysqK\nJ+974/GT19sPraJGkJNoMrZaJiwShmMuTZmx97enxT2LnAeTg0IjMnYUjm03\nN+s2LdB4FwW5canmGau8t2kcO14JDW6JVphQLJA0+PBJZayBDrVdcNQWvNxL\nJf0xvk2SO9ZjMGM1mbRHLLTkhA4Lf5KkWBSSi34ZFDTHt5PskNdaGH92jEmo\n0AMaV0nrBpq+lhaK1QBpfjtEo9XwX2vnuOUEbbgLrTqjFim3hFw4F3Z3XXEk\nrpIZAzwhRsWcFr57Dp1okGbEnJJxARq9l8G7H9oZNR1kmoVTcxrpSi9yT0DH\nn13AFfP8qrdyVoovCEHlaxoDeQ2CV0B+AKhrCAr5QeSPYBoYw5yXs+J8Qcol\nlAR6Cqn7082ukou4vFZgxUQr/0d7Jqwt2/SvT9SmBnSI3gNJUCzerOP+Wdp8\nAlBLBwhpMWDsagEAANgEAABQSwMEFAAICAgAdz7zSAAAAAAAAAAAAAAAAA8A\nAAB3b3JkL3N0eWxlcy54bWzdV+1u2jAUfYK9A8r/NiEEhlBphai6Taq6ae0e\nwDgO8XBsy3ag7OlnJ04CCZkyoKMa/Eh8r++518fHH7m5e01Ib42ExIxOnf61\n5/QQhSzEdDl1frw8XI2dnlSAhoAwiqbOFknn7vbDzWYi1ZYg2dPxVE4SOHVi\npfjEdSWMUQLkNeOIamfERAKUboqlmwCxSvkVZAkHCi8wwWrr+p43ciwMmzqp\noBMLcZVgKJhkkTIhExZFGCL7KCJEl7x5yD2DaYKoyjK6AhFdA6MyxlwWaMmx\naNoZFyDrPw1inZCi34Z3yRYKsNGTkZA80YaJkAsGkZTaep87S8S+14FAA1FG\ndClhP2dRSQIwLWGMNGpAZe5rnduSlkFVA6m4kKRLIbnrES8EENtmFeAIPnfj\nOe6k4hqCjlKpKAV5DASMgVAFADkGgTC4QuEc0DUoxRwuO8m5hhRisBQgqUQq\n/2pm+15NLs8x4KhCW56G9kmwlDu3evsJGbxHEUiJkqYpvgnbtK3s8cCokr3N\nBEiI8dSZCQy05DYTKHcaCEg1kxjsmOIZlWV/10AttHUNtEq9vI1rbZkAQuaA\ny7pdCbxCNSNkhInSlv1s71+F1fcLy1zWbWlhoHpLzk16B1czgpe0cC2ARATn\nbtcS4tZp4vWWeawQ4k/oVdVqNuZHDVgf4AaHbDPXPAtGClff1s4B1HNm+I8U\nEiZEvy+QVh+yDVOiHtjHUdH4nhJtAKlilmcaGg+KlI0QeBkX7xEWUj1mELaa\nn7CowYTYwXM7+N3hug0FZeeZjlZbrvE4EGYd8NjkyVxfwqnzZNZNppAwjzRj\nNcEUJKialaxTnjsLbcIrsCBoD/rFWDrhZz17Tx2yHB7EZwTM8d4EjnNHz06f\nkVD4tVRUlVBH7ehj194ioX6LhNp00vf3lBJ4Xps8oBaeTpQC8lyCVNBuWZHd\nEKr1FXjN9ZXbdlbLMbT6rbT674zWwehctNY3x4rmwYFtLLedSPOglebBpWke\n77PsvxXLe6dIMDD/xikyPnCKjM9Af9BKf/C+6PfH56J/j+5R9mvQHRygOzgD\n3cNWuofvjO7gX9Ldekc6ke5RK92j/5VuXEt8EfpfsNK3osZ9J7NemPfR4bvr\n2e4jwwNkDk8i8zldqIN8lo4LUzrw34TTM3701T/yOiyKwYF75aDlXlm8ydvf\nUEsHCCJgqpxzAwAAhxMAAFBLAwQUAAgICAB3PvNIAAAAAAAAAAAAAAAAEQAA\nAHdvcmQvZG9jdW1lbnQueG1spZXfbtsgFMafYO8QcZ/YibKpsur0YlF3s01R\n2z0AAWyjAAcdcNLs6Qf+2yVV5WW+QZzD+X2f4QjuH161mh0FOgkmJ8tFSmbC\nMODSlDn59fI4vyMz56nhVIEROTkLRx42n+5PGQdWa2H8LBCMyzTLSeW9zZLE\nsUpo6hZghQnJAlBTH6ZYJpriobZzBtpSL/dSSX9OVmn6hXQYyEmNJusQcy0Z\ngoPCx5IMikIy0Q19BU7RbUu2neVGMUGhggcwrpLW9TR9Ky0kqx5y/Ognjlr1\n6052ihpHegrHoVUrdALkFoEJ50J02yYH4jKdsIERMVRMsfC3Zu9EU2kGTGyO\nC9CgvQja3aY1qPFHxr1waoqRNvVd7pHi+doFvWE/39ZbOamLLwihytc4NOQt\nCFZR9D1A3UJQwA6Cf6XmSIdm5uWkdr4gcUlLpHpsUvdPJ7tML9rluaJWjLTy\n/2jfEGpLNuEC2lN2KMPM8NkpY6Ag3ASPzUeSJg/8HEcb0uF+4085SbuPdKGt\nUNfB3XXoaSsKWiv/TmaHb4KN3A7jwMB48eprqp4tZcF4KDjSKBfdJcM6/MjK\nO5avBbEDeXUp0WTi2ArGVU4w36635fPvUFCFW//z3brhh7tguVqt03b/bPmD\nRnd78B5CIy3X7SoPdpwoUfhxhrKs+mnH+Fnrl7MVIRmeEYzJzlzvJOlPKhnf\nlM0fUEsHCOH0LWYNAgAAmAYAAFBLAwQUAAgICAB3PvNIAAAAAAAAAAAAAAAA\nHAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHOtkktqAzEMhk/QOxjt\nO54kpZQSTzYlkG2ZHsCZ0TyILRtLKZ3b1xTyghC6mKV+o0+fkNebH+/UNyYe\nAxlYFCUopCa0I/UGvurt8xsoFkutdYHQwIQMm+pp/YnOSu7hYYysMoTYwCAS\n37XmZkBvuQgRKb90IXkruUy9jrY52B71sixfdbpmQHXDVLvWQNq1C1D1FPE/\n7NB1Y4MfoTl6JLkzQjOK5MU4M23qUQyckiKzQN9XWM6p0AWS2u4dXhzO0SOJ\n1ZwSdPR7THnvi8Q5eiTxMusxZHJ4fYq/+jRe33yw6hdQSwcIY4WdHeEAAACo\nAgAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAALAAAAX3JlbHMvLnJlbHON\nzzsOwjAMBuATcIfIO03LgBBq0gUhdUXlAFHiphHNQ0l49PZkYADEwGj792e5\n7R52JjeMyXjHoKlqIOikV8ZpBufhuN4BSVk4JWbvkMGCCTq+ak84i1x20mRC\nIgVxicGUc9hTmuSEVqTKB3RlMvpoRS5l1DQIeREa6aautzS+G8A/TNIrBrFX\nDZBhCfiP7cfRSDx4ebXo8o8TX4kii6gxM7j7qKh6tavCAuUt/XiRPwFQSwcI\nLWjPIrEAAAAqAQAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAATAAAAW0Nv\nbnRlbnRfVHlwZXNdLnhtbLWTTU7DMBCFT8AdIm9R4sICIdS0C36WwKIcYOpM\nWgv/yTMp7e2ZtCGLqkiwyM7jN/Pe55E8X+69K3aYycZQq5tqpgoMJjY2bGr1\nsXop71VBDKEBFwPW6oCklour+eqQkAoZDlSrLXN60JrMFj1QFRMGUdqYPbCU\neaMTmE/YoL6dze60iYExcMm9h1rMn7CFznHxeLrvrWsFKTlrgIVLi5kqnvci\nnjD7Wv9hbheaM5hyAKkyumMPbW2i6/MAUalPeJPNZNvgvyJi21qDTTSdl5Hq\nK+Ym5WiQSJbqXUXILKch9R0yv4IXW9136h+1Gh45DQIfHP4GcNQmjW/FawVr\nh5cJRnlSiND5NWY5X4YY5UkhRsWDDZdBxpaBQx+/3uIbUEsHCAD+7s4fAQAA\nugMAAFBLAQIUABQACAgIAHc+80gnnLHdWAEAALsEAAASAAAAAAAAAAAAAAAA\nAAAAAAB3b3JkL251bWJlcmluZy54bWxQSwECFAAUAAgICAB3PvNIiOqiSKkB\nAACIBQAAEQAAAAAAAAAAAAAAAACYAQAAd29yZC9zZXR0aW5ncy54bWxQSwEC\nFAAUAAgICAB3PvNIaTFg7GoBAADYBAAAEgAAAAAAAAAAAAAAAACAAwAAd29y\nZC9mb250VGFibGUueG1sUEsBAhQAFAAICAgAdz7zSCJgqpxzAwAAhxMAAA8A\nAAAAAAAAAAAAAAAAKgUAAHdvcmQvc3R5bGVzLnhtbFBLAQIUABQACAgIAHc+\n80jh9C1mDQIAAJgGAAARAAAAAAAAAAAAAAAAANoIAAB3b3JkL2RvY3VtZW50\nLnhtbFBLAQIUABQACAgIAHc+80hjhZ0d4QAAAKgCAAAcAAAAAAAAAAAAAAAA\nACYLAAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzUEsBAhQAFAAICAgA\ndz7zSC1ozyKxAAAAKgEAAAsAAAAAAAAAAAAAAAAAUQwAAF9yZWxzLy5yZWxz\nUEsBAhQAFAAICAgAdz7zSAD+7s4fAQAAugMAABMAAAAAAAAAAAAAAAAAOw0A\nAFtDb250ZW50X1R5cGVzXS54bWxQSwUGAAAAAAgACAD/AQAAmw4AAAAA\n\n--001a11447dc881e40f0537fe6d5a--\n\"\n  [\"to\"]=>\n  string(22) \"example@example.comom\"\n  [\"from\"]=>\n  string(33) \"Sender Name <example@example.com>\"\n  [\"sender_ip\"]=>\n  string(13) \"209.85.214.45\"\n  [\"spam_report\"]=>\n  string(798) \"Spam detection software, running on the system \"mx0032p1mdw1.sendgrid.net\", has\nidentified this incoming email as possible spam. The original message\nhas been attached to this so you can view it (if it isn't spam) or label\nsimilar future email. If you have any questions, see\n@@CONTACT_ADDRESS@@ for details.\n\nContent preview:  This is a test email with 1 attachment.\nContent analysis details:   (0.4 points, 5.0 required)\n\n pts rule name              description\n---- ---------------------- --------------------------------------------------\n 0.0 HTML_MESSAGE           BODY: HTML included in message\n 0.3 HTML_IMAGE_ONLY_04     BODY: HTML: images with 0-400 bytes of words\n 0.0 T_MIME_NO_TEXT         No text body parts\n\n\"\n  [\"envelope\"]=>\n  string(73) \"{\"to\":[\"example@example.comom\"],\"from\":\"example@example.com\"}\"\n  [\"subject\"]=>\n  string(5) \"Hello\"\n  [\"spam_score\"]=>\n  string(5) \"0.353\"\n  [\"charsets\"]=>\n  string(47) \"{\"to\":\"UTF-8\",\"subject\":\"UTF-8\",\"from\":\"UTF-8\"}\"\n  [\"SPF\"]=>\n  string(4) \"pass\"\n}\n```\n\n## Other Inbound Parse Documentation\n\n- [Parse API](https://sendgrid.api-docs.io/v3.0/settings-inbound-parse/create-a-parse-setting) -\n  Manage Inbound Parse Webhook settings using the Parse API (Web API v3).\n- [Parse Settings Subuser](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/parse_settings) -\n  Get current Parse settings and create, edit, and delete entries using the Subuser API (Web API v2).\n- [Reseller API Parse Settings](https://www.twilio.com/docs/sendgrid/api/v2/reseller_api/parse_settings) -\n  Get current Parse settings and create, edit, and delete entries using the Reseller API (Web API v2).\n- [Reseller Customer Subuser Parse Settings](https://www.twilio.com/docs/sendgrid/api/v2/reseller_api/reseller_customer_subuser_api/customer_subuser_parse_settings) -\n  Get current Parse settings and create, edit, and delete entries using the Reseller Customer Subuser API (Web API v2).\n\n## Statistics\n\nSendGrid provides [statistics](https://app.sendgrid.com/statistics/parse_webhook) of how many emails are parsed over time. You can specify what is displayed on the graph by adjusting the statistics filters.\n\nFor more information, please see [Parse Webhook Stats](https://sendgrid.api-docs.io/v3.0/webhooks/retrieves-inbound-parse-webhook-statistics).\n"
  },
  {
    "path": "content/docs/for-developers/partners/account-migration.md",
    "content": "---\nseo:\n  title: Migrating from a partner account\n  description: Sometimes if a SendGrid partner no longer supports SendGrid core functionality, you may want to migrate your account to a regular SendGrid account.\n  keywords: migrate, partner sunset\ntitle: Migrating from a partner account\ngroup: partner-migration\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you are setting up a new account directly with SendGrid but have previously had an account through one of our partners, there are several things to keep in mind - make sure to stop sending mail until you migrate to a new, warmed up account, and make sure export data from your old account, and clean up the data described here so that you can import it into your new account.\n\n## Before you begin\n\n- Pause sending email on your old account.\n- Login to app.sendgrid.com with your current SendGrid username and password.\n\n## Update sender authentication\n\nYou cannot export and import sender authentication data - you need to set this up manually in your new account after you delete the current authentication records from your [DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html#-DNS) provider.\n\nIf you have a domain, link, and IP authentication set up, remove 5 CNAME or MX/TXT records and 1 A record from your domain’s DNS. To verify the records delete from your DNS, go to the [Sender Authentication page](https://app.sendgrid.com/settings/sender_auth) in the UI and check the DNS column:\n\n![]({{root_url}}/img/dns-records.jpg \"Where to find your existing DNS records\")\n\nTo set up sender authentication in your new account, check out [Setting up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html), [Setting up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html), and [Setting up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html).\n\n## Migrate unsubscribes\n\nTo download your unsubscribes, on the [Global unsubscribes page](https://app.sendgrid.com/suppressions/global_unsubscribes), select the action menu, and then click **Download a CSV**.\n\nTo set up your unsubscribes in your new account, copy them into the UI by going to [Global](https://app.sendgrid.com/suppressions/global_unsubscribes) or [Group](https://app.sendgrid.com/suppressions/group_unsubscribes) Unsubscribes page, selecting the action menu and then adding them to the list. You can add them with the API by using the [Suppressions methods](https://sendgrid.api-docs.io/v3.0/suppressions-global-suppressions/add-recipient-addresses-to-the-global-suppression-group)\n\n## Migrate templates\n\nFrom the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) and the [Transactional templates](https://sendgrid.com/dynamic_templates) pages in the UI, export the HTML of any templates you want to migrate.\n\nTo add your templates in the new account, navigate to either the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) or the [Transactional templates](https://sendgrid.com/dynamic_templates) page in the UI, create a new template, select to [use the code editor]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html), and paste the HTML of the exported template into the editor.\n\n## Migrate Marketing Campaigns Contacts\n\nFrom the [Marketing Campaigns contacts](https://sendgrid.com/marketing_campaigns/ui/contacts) page, click into your [Global All Contacts](https://sendgrid.com/marketing_campaigns/ui/all_contacts) list. Then export a CSV of your contacts.\n\nTo upload your contacts into your new account, from the [Contacts page](https://sendgrid.com/marketing_campaigns/ui/contacts), click **Add contacts** and then *Upload CSV*.\n\n## Review existing API keys\n\nIf you are using the SendGrid API, double check your accounts [list of API keys](https://app.sendgrid.com/settings/api_keys). API keys are not exportable, but it's good to make sure that you're aware of all of the existing API keys in your account so that you can create new ones to match in your new account and update your integrations with the new API keys.\n\n## Delete teammates\n\nTeammate names have to be unique across SendGrid, so if you want to continue to use your teammate name, delete it from your original account to add it to your new account.\n\n## Create new subusers\n\nIf you are using subusers, navigate to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI and click **Export data** to download all of the information on your current subusers.\n\nTo add subusers to your new account, go to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI, and click **Create a new subuser**. Use the data from the exported CSV to create a new subuser.\n\n## Migrate dedicated IPs\n\nIf you are using a dedicated IP, our support team can migrate your dedicated IP for you. Access support contact options by logging into https://support.sendgrid.com. Provide us with: your current and new usernames, the IP addresses, and your preferred time for the IP transfer - we can migrate IPs between 7 am and 5 pm MST on Monday through Friday.\n\nBe sure to set up reverse DNS and rewarm up your transferred IP before you start sending on it in your new account. You also need to reassign it to subusers if needed.\n\n## Download statistics and email activity\n\nOn all of the statistics pages and on the email activity page, click **Export CSV** to download your statistics for your records. Your new account cannot import this data.\n\n\n"
  },
  {
    "path": "content/docs/for-developers/partners/amazon-marketplace.md",
    "content": "---\nlayout: page\nweight: 90\ntitle: Amazon Marketplace\ngroup: platform-partners\nnavigation:\n  show: true\n---\nSendGrid has partnered with Amazon to offer our email services on the [Amazon Marketplace](https://aws.amazon.com/marketplace/pp/B074CQY6KB). Built by developers for developers, SendGrid offers developers simple SMTP and API integrations to start sending in minutes. Non-technical users can leverage Marketing Campaign's intuitive interface to create, send, and analyze marketing emails.\n\nOnce you have an AWS account, you can to [subscribe to SendGrid](https://aws.amazon.com/marketplace/pp/B074CQY6KB) and access it directly from the [AWS Management Console](https://console.aws.amazon.com/). Once you’ve subscribed to SendGrid, you have access to the [SendGrid application](https://app.sendgrid.com/) and the APIs. Use the AWS Management Console if you want to reset your password, cancel your account, or manage bills.\n\n## \tGetting started\n\n*To quickly get started with SendGrid:*\n\n- See [Getting Started With Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) for all of the tools you need to get started sending with the SendGrid application.\n- Look at the [API Reference]({{root_url}}/api-reference/) for all of the API endpoints as well as information about using SMTP and the Webhooks.\n- See the [API Libraries]({{root_url}}/for-developers/sending-email/libraries/) page for information about using the SendGrid code libraries in C#, Go, Java, Node.js, PHP, Python, and Ruby.\n\n<call-out>\n\nIf you are using SendGrid through AWS, you cannot change your SendGrid username.\n\n</call-out>\n\n<call-out>\n\n**Warm up your sending** - Since ISP spam filters look at volume as a significant factor when determining whether or not you are sending spam, we recommend that you begin sending a low to moderate volume, eventually working your way up to larger volumes. This gives the receiving email providers a chance to closely observe your sending habits and the way your customers treat the emails they receive from you. For more information, see [IP Warmup](https://sendgrid.com/docs/glossary/ip-warmup/).\n\n</call-out>\n\n### Pricing\n\nThere are two plans: AWS Basic and AWS Pro. These plans are billed on your AWS invoice. For more information, check out our [AWS Marketplace page](https://aws.amazon.com/marketplace/pp/B074CQY6KB). Here's a monthly view of cost:\n\n![]({{root_url}}/images/aws_pricing.png \"AWS pricing\")\n\n### Adding a dedicated IP address\n\nYou can purchase IP addresses dedicated to your account. Since you are the only one sending email over this IP, your sending practices determine the sender reputation associated with this IP. You can purchase up to 3 IP addresses per month. If you need more than 3 IPs, then you should [contact support](https://support.sendgrid.com/hc/en-us).\n\nYou can only add a Dedicated IP Address if you are on an AWS Pro plan. To upgrade your plan, see [Upgrading or Downgrading Your Account](#upgrading-or-downgrading-your-account).\n\n*To add a dedicated IP Address*:\n\n1. Navigate to the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing) in the SendGrid UI.\n2. Click **Add a Dedicated IP**.\n   ![]({{root_url}}/images/dedicated_ip_button.png \"Dedicated IP button\")\n   This takes you to the Dedicated IP Addresses page\n3. Next, click **Add an IP Address**.\n4. Select the number of IP Addresses to add, and select whether you want to warm up your IP automatically. Warming up an IP gradually increases the amount of email sent over this IP over time to improve your email deliverability. For more information, see [Warming Up IPs]({{root_url}}/ui/sending-email/warming-up-an-ip-address/).\n5. Click **Add**.\n\n### Adding domain authentication and link branding\n\nSender authentication shows email providers that SendGrid has your permission to send emails on your behalf. Domain authentication works by pointing DNS entries from your domain registrar to SendGrid, which drastically increases your ability to deliver email and allows you to begin building a sender reputation for your domain and for your IP addresses. For more information on domain authentication, see [How to Set Up Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).\n\n### Adding subusers\n\nYou can only add Subusers if you are on an AWS Pro plan. To upgrade your plan, see [Upgrading or Downgrading Your Account](#upgrading-or-downgrading-your-account). Subusers are SendGrid accounts that belong to a parent account. They have their permissions and credit limits, which you assign as you create the Subusers. Subusers help you segment your email sending and API activity.\n\nTo get started with using Subusers, see the [Subusers overview]({{root_url}}/ui/account-and-settings/subusers/).\n\n### Upgrading or downgrading your account\n\nYou can upgrade or downgrade your account from the [SendGrid UI](https://app.sendgrid.com/settings/billing).\n\n*To change your account plan:*\n\n1. Navigate to the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing) in the SendGrid UI.\n1. Select Upgrade to AWS Pro, or Downgrade to AWS Basic.\n\n![]({{root_url}}/images/aws_upgrade.png \"AWS upgrading or downgrading\")\n\n### Managing billing options\n\nManage your billing options from the [AWS Billing & Cost Management Dashboard](https://console.aws.amazon.com/billing/).\n\n### Canceling your SendGrid subscription\n\n*To remove SendGrid from your AWS account:*\n\n1. Navigate to your [Software Subscriptions page](https://aws.amazon.com/marketplace/library?productType=saas&ref_=lbr_tab_saas) on AWS.\n1. Click **Cancel Subscription** in the SendGrid section.\n\n![]({{root_url}}/images/aws_cancel.png \"AWS cancel button\")\n\n### Troubleshooting\n\nIf you run into issues with your AWS SendGrid account, you can contact our support team by [logging in here](https://support.sendgrid.com) and opening a support ticket.\n"
  },
  {
    "path": "content/docs/for-developers/partners/azure.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Building an iOS App on Windows Azure\nnavigation:\n  show: true\n---\n\n## \tPoint and click setup in Microsoft Azure\n\nYou can control a website, mobile backend and SendGrid all from within the Microsoft Azure management portal. We will cover all 3 of these in this tutorial.\n\nTo start, create a SendGrid account from the management portal:\n\n1.\tClick **New** at the bottom left.\n\n\n![]({{root_url}}/images/azure_1.png)\n\n\n2.\tClick **Store** to load up the list of Add-ons.\n\n3.\tSelect **SendGrid**.\n\n![]({{root_url}}/images/azure_2.png)\n\n4.\tThen click the arrow at the lower right to go to step 2.\n5.\tChoose the Free plan for now for 25,000 free emails per month.\n\n![]({{root_url}}/images/azure_3.png)\n\n6.\tProceed to step 3 and click **Purchase**.\n\n*To create a Windows Azure Website:*\n\n1.\tClick **New** at the bottom left.\n2.\tSelect **Website**, then **Quick Create**.\n\n\n![]({{root_url}}/images/azure_4.png)\n\n3.\tSet the URL, such as `website.azurewebsites.net`.\n4.\tClick **Create Web Site** on the bottom right.\n\nThat’s it! You now have a website running on Azure. Now let’s create something cool.\n\n## \tConnect to the SendGrid Inbound Parse API\n\nSendGrid can both send and receive an email for your domain name. The playlist app uses incoming mail, which means setting up DNS at your domain registrar or host. The process to do this is going to be different depending on who controls your DNS. This tutorial will walk through the Azure and SendGrid part of this process, but you may need to ask for help on changing DNS in your system.\n\nIt’s a good idea to choose a subdomain like playlist.example.com, rather than a domain itself. That’s because the Inbound Parse API must collect all mail and you don’t want to interrupt another email for your domain. To use custom domains in Windows Azure, your website will need to run in either Shared mode or the Standard tier; however, Shared mode is currently not available.\n\nFind your IP address and note the further instructions in the management portal:\n\n1.\tSelect your website from the list and then click SCALE on the top menu bar.\n\n![Select]({{root_url}}/images/azure_5.png)\n\n2.\tChange the Web Site Mode to Shared, click **Save**, then select **Yes**.\n3.\tClick **Configure** at the top menu bar, then scroll down to click **Manage Domains**.\n4.\tAdd your full subdomain plus domain, like playlist.example.com and click the check mark\n\n![Add]({{root_url}}/images/azure_6.png)\n\n5.\tNote the IP address and the instructions on this page. You’ll use these at your host or registrar when you modify your DNS settings.\n\nNow you need to update your own DNS settings outside of the Windows Azure interface. This points your domain’s web traffic to Microsoft Azure and your email to SendGrid. How you change your DNS depends on where your DNS is administered, which could be your host or domain registrar.\n\nYou’ll need to make 3 updates to your DNS:\n\n1.\tCreate an A record for playlist.example.com that points to the IP noted above\n2.\tCreate a CNAME record according to the instructions on the screen where you obtained the IP Address\n3.\tCreate an MX record pointing to mx.sendgrid.net.\n\nDNS changes can take an hour or more to propagate. Back at Windows Azure’s domain management page, wait for the red exclamation point to become a green checkmark.\n\nWhile you're waiting for DNS to be ready, you can prepare your SendGrid Incoming Parse API webhook. From the Windows Azure interface:\n\n1.\tClick the **SendGrid App Service** from your all items list.\n2.\tIn the management section, select  **Go to the SendGrid website for next steps**.\n\n![Click]({{root_url}}/images/azure_7.png)\n\n3.\tNow you’re looking at the SendGrid interface--click **Developers** at the top.\n4.\tClick PARSE INCOMING EMAILS on the right and you’ll see some fields to fill out\n![Click]({{root_url}}/images/azure_8.png)\n5.\tFill in the values you’ve used for your hostname and URL. For example:\n\n\t* Hostname: `playlist.example.com`\n\n\t* URL: `http://website.azurewebsites.net/email`\n6.\tClick **Add Host & URL**.\n\nOnce the DNS has propagated, you’ll be able to receive an email to any email address `@playlist.example.com`. In the next step, we’ll make sure your website on Microsoft Azure is ready to accept those emails.\n\n## \tPrepare the code to run on Microsoft Azure\n\nBefore you can put the code in place, you need to prepare your source control system, which will be Git in this case. Make sure you have Git installed on your local machine before proceeding. There are downloads for Windows, Mac, Linux, and Solaris.\nNow set up your repository within the Windows Azure interface:\n\n1.\tClick the website name from your all items list.\n2.\tUnder quick glance, click **Set up deployment from source control**.\n3.\tChoose **local git repository**.\n4.\tCopy the Git URL to your clipboard--you will need it later, and it should look similar to `https://username@subdomain.scm.azurewebsites.net/playlist.git`\n\nNow you need to set some environment variables, so you don’t expose these credentials in your code. Follow these steps to find those credentials:\n\n*To find your SendGrid credentials within the Windows Azure management portal:*\n\n1.\tClick **SendGrid** from the all items list.\n2.\tIn the bar on the bottom, click **Connection Info**.\n\n![In]({{root_url}}/images/azure_9.png)\n\n3.\tA screen will pop up with your password, SMTP server, and username\n\nTo get your Spotify API Key, which you'll use to create your playlist, follow the instructions here: [https://developer.spotify.com/documentation/general/guides/app-settings/](https://developer.spotify.com/documentation/general/guides/app-settings/).\n\nWith the credentials in hand, it’s time to add them as environment variables within the Windows Azure management portal:\n\n1.\tChoose your website from the all items list, then click **Configure**.\n2.\tUnder “app settings” set the following KEY VALUE pairs\n\n\t* `SENDGRID_USER = username`\n\n\t* `SENDGRID_PASS = password`\n\n\t* `DOMAIN = playlist.example.com`\n\n\t* `CLIENT_ID = your_key`\n\n\t* `CLIENT_SECRET = your_secret`\n\n\t* `XHR_POLLING_ONLY = 1`\n3.\tClick SAVE at the bottom\n\nWith your source control and environment variables set, it’s time to download the code that makes this app run. You will then upload that code to your Azure account.\n\nOpen up your command line on your local machine and prepare it for code:\n\n1.\tCreate a local folder to house the code (e.g. `mkdir playlist`)\n2.\tClone the code into that directory by executing this command:\n`git clone git://github.com/theycallmeswift/playlist.sendgriddemos.com.git`\n3.\t`cd playlist.sendgriddemos.com`\n4.\t`git remote add azure git_url`\n\n\t* This is the long URL you saved from Microsoft Azure after\nsetting up source control.\n5.\t`git push azure master`\n\n\t* This is the command that pushes the code to Azure cloud\n\nOne last thing, you need to update the receiving email address:\n\n1.\tOpen up `public/index.html`\n2.\tChange the email in `index.html` (line 25) to the email address you want to use. Something like `play@playlist.example.com`\n3.\t`git add .`\n\n\t* This adds the modified file for upload\n4.\t`git commit -m \"Updating email address\"`\n5.\t`git push azure master`\n\n\t* Again, this pushes the code to Azure cloud\n\nWith your changes pushed to Azure, you can restart the server with the button at the bottom of the web server’s dashboard. Then click the BROWSE button within the same menu to see your website live. At this point, people can send in their song requests, assuming that the DNS has propagated.\n\n## \tAdd a backend using Microsoft Azure Mobile Services\n\nMicrosoft Azure can also run a backend-as-a-service for your app, which allows you to store data, authenticate users, send push notifications, and do other common mobile tasks. This backend can also be used for non-mobile applications.\n\nFollow these steps to enable Mobile Services from the Microsoft Azure interface:\n\n1.\tClick NEW at the bottom left, select MOBILE SERVICE, then click **Create**.\n2.\tChoose a URL -- this is up to you, it will be internal to your app\n\n![Choose]({{root_url}}/images/azure_10.png)\n\n3.\tClick **Next**.\n4.\tChoose a Server Login Name and Password\n5.\tChoose **Configure advanced database settings**.\n\n![Choose]({{root_url}}/images/azure_11.png)\n\n6.\tClick **Next**, then review and click **Complete**.\n\n*To add a table to the database:*\n\n1.\tClick on the name of your mobile service to access its settings\n2.\tClick **Data**, then Add a Table\n3.\tChoose a table name, update permissions and click **Complete**.\n\n![Choose]({{root_url}}/images/azure_12.png)\n\nIn your `index.html` file add the following code near the closing body tag to add the Windows Mobile Services library to your app:\n\n``` html\n<script src=\"https://website.azure-mobile.net/client/MobileServices.Web-1.0.0.min.js\"></script>\n```\n\n![Mobile Services]({{root_url}}/images/azure_13.png)\n\nIn the `js/app.js` file, after the `$(\"#queue\").append…` line, add the following code:\n\n``` javascript\nvar client = new WindowsAzure.MobileServiceClient(\"https://website.azure-mobile.net/\",  \"<Password>\");\nvar item = { request: data.name, song: data.track, user: data.user };\nclient.getTable(\"playlist_songs\").insert(item);\n```\n\nTo allow for your app to have access to the DB, add your URL to the cross-origin resource sharing (cors) setting.\n\n![cors]({{root_url}}/images/azure_14.png)\n\nAdd your changes via git and push to Azure.\n\nNow your website, mobile service, and SendGrid account are all in harmony on Microsoft Azure. You could stop here, but to see the real power of Mobile Services, you’ll want to create a native mobile application.\n\n## \tConnect Microsoft Azure Mobile Services to iOS\n\nThe Microsoft Azure Mobile Services SDK simplifies the process of standing up a backend for your app in Microsoft Azure. The Microsoft Azure team also has SDKs for Android, HTML, Windows Store, and Windows Phone. For this example, we are going to use iOS.\n\nWe can download a pre-packaged mobile app from within the Microsoft Azure interface:\n\n1.\tClick the name of your mobile service from the all items menu.\n2.\tYou should see the quickstart tab. Click iOS then Create a new iOS app.\n3.\tClick **Download** to grab the source code.\n\n![Download]({{root_url}}/images/azure_15.png)\n\nTo create a native iPhone app, you’ll need to have XCode installed on a Mac. It’s a big download (over 1 GB), so find something to do while you wait.\n\nNow you’ll want to edit the sample app you downloaded from Microsoft Azure:\n\n1.\tExpand the files on your computer and open the project file using XCode.\n2.\tUpdate the credentials and table name in `QSTodoService.m` with the ones you used when you created your mobile service.\n\n![Credentials]({{root_url}}/images/azure_17.png)\n\n3.\tUpdate the function refreshDataOnSuccess in `QSTodoService.m` to return all from the queue. Remove the existing code there and replace it with:\n\n``` objc\n// Return all song request titles from the table\n// items: An NSArray of the records that matched your query.\n// totalCount: The total count of items in all pages of the query, not just those returned in the current page. This value is set to -1, unless you explicitly request the total count in your request. For more info, see Return data in pages.\n// error: Any error that occurred; otherwise nil.\n[self.table readWithCompletion:^(NSArray *results, NSInteger totalCount, NSError *error) {\n[self logErrorIfNotNil:error];\nitems = [results mutableCopy];\n// Let the caller know that we finished\ncompletion();\n}];\n```\n\n![Code]({{root_url}}/images/azure_18.png)\n4.\tNow, go to the file QSToDoListViewController.m, and replace the onAdd function’s contents with:\n\n``` objc\n// Populate the parameters for the SendGrid Web API Call\n// Find more details about the [Web API here]({{root_url}}/api-reference/).\nNSString *username = @\"<Your SendGrid Username>\";\nNSString *apikey = @\"<Your SendGrid Password>\";\nNSString *to = @\"<Email to Playlist Service from Appendix A>\";\nNSString *from = @\"<From Email Address>\";\nNSString *fromname = @\"<Your Name>\";\nNSString *text = @\"%20\";\n\n// Make sure the data received from the text field is formatted properly\nNSString *subject = [itemText.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n\n// Generate the Web API call\nNSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@\"https://api.sendgrid.com/api/mail.send.json?to=%@&from=%@&fromname=%@&subject=%@&text=%@&api_user=%@&api_key=%@\",to, from, fromname, subject, text, username, apikey]];\n\n// This writes the composed URL in the XCode console for debugging purposes\nNSLog(@\"URL %@\",url);\n\n// Create a request object using the URL\nNSURLRequest *request = [NSURLRequest requestWithURL:url];\n\n// Prepare for the response back from the server\nNSHTTPURLResponse *response = nil;\nNSError *error = nil;\n\n// Send a synchronous request to the server\nNSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];\n\n// Error handling\nif (error != nil) {\nNSLog(@\"%@\", [error localizedDescription]);\nUIAlertView *message = [[UIAlertView alloc] initWithTitle:@\"Error\"\n                                             message:@\"\"\n                                            delegate:nil\n                                   cancelButtonTitle:@\"OK\"\n                                   otherButtonTitles:nil];\n[message show];\n}\nitemText.text = @\"\";\n```\n\n5.\tIn the same file, replace this line:\n```label.text = [item objectForKey:@\"text\"];```\nwith this line:\n```label.text = [item objectForKey:@\"request\"];```\n\nNow you can make some adjustments to the interface:\n\n1.\tClick on the storyboard, then the **Text Input** field.\n\n![Click]({{root_url}}/images/azure_19.png)\n\n2.\tOn the right, change the placeholder text to read: “Enter your song request”\n3.\tNext, double click on the button and rename it to “Send”. You will have to adjust the size of the text box and button by single clicking and adjusting.\n\n![Buttons]({{root_url}}/images/azure_20.png)\n\nYour project in XCode should look like the above screenshot. When you run the iPhone app, you should be able to see requested songs and add your own songs to the shared playlist.\n\nThe code for this tutorial is available at our [GitHub page](https://github.com/sendgrid/sendgrid-azure-ios/). Enjoy!\n"
  },
  {
    "path": "content/docs/for-developers/partners/google.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Google\nnavigation:\n  show: true\n---\n\nIf you are using Google’s cloud platform, you can easily integrate with SendGrid. Simply navigate to the [GCP Marketplace](https://console.cloud.google.com/marketplace/details/sendgrid-app/sendgrid-email), locate the [SendGrid add-on](https://console.cloud.google.com/marketplace/details/sendgrid-app/sendgrid-email), select the appropriate plan, and get ready to start sending.\n\nUsing Google’s App Engine or Compute Engine? Here are a few examples of how to implement SendGrid to help improve deliverability and provide analytics for your projects.\n\n## \tApp Engine Examples\n\n1. [Python](https://cloud.google.com/appengine/docs/standard/python/mail/sendgrid)\n2. [Java](https://cloud.google.com/appengine/docs/standard/java/mail/sendgrid)\n3. [PHP](https://cloud.google.com/appengine/docs/standard/php/mail/sendgrid)\n4. [Go](https://cloud.google.com/appengine/docs/standard/go/mail/sendgrid)\n5. [Node.js](https://cloud.google.com/appengine/docs/standard/nodejs/sending-emails-with-sendgrid)\n\n## \tCompute Engine\n\nIf you're using Google's Compute Engine, click [here](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid)\n\nCheck out [our blog](https://sendgrid.com/blog/partnership-includes-google-compute-engine/) for more information on how to make Google and SendGrid work together.\n"
  },
  {
    "path": "content/docs/for-developers/partners/jelastic.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Jelastic\nnavigation:\n  show: true\n---\n\nSendGrid can be implemented in Jelastic's cloud platform. SendGrid and Jelastic interconnection allows you to send emails directly from your Java or PHP application hosted with Jelastic cloud technologies.\n\n### Application Examples\n\n1. [Java with Spring](http://docs.jelastic.com/sendgrid-java)\n2. [PHP](http://docs.jelastic.com/sendgrid-php)\n"
  },
  {
    "path": "content/docs/for-developers/partners/microsoft-azure-2021.md",
    "content": "---\nseo:\n  title: Sending Email with Microsoft Azure\n  description: Learn how to send email with Twilio SendGrid's newest Azure integration\n  keywords: Microsoft, Azure, Integration\ntitle: Sending Email with Microsoft Azure\ngroup: platform-partners\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nThis documentation applies to the most recent version of the Twilio SendGrid integration for Microsoft Azure. For documentation on the previous version, see the [SendGrid documentation]({{root_url}}/for-developers/partners/microsoft-azure/) or related [Azure documentation](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email).\n\n</call-out>\n\nThis guide will help you create and configure a Twilio SendGrid account using Microsoft Azure. Once your account is ready, you'll be on your way to delivering email at scale.\n\n## Create an Azure Subscription\n\nTo get started with Twilio SendGrid and Azure, visit the [Azure Portal home page](https://portal.azure.com/#home). You will need to sign in or create a Microsoft account if you do not already have one.\n\nOnce logged in, select the **Subscriptions** icon under the **Azure services** menu.\n\n![Azure services menu with the Subscriptions icon highlighted]({{root_url}}/img/sg_azure_portal_home_subscription.png 'Azure subscriptions')\n\nA new page will load, listing your current subscriptions. You can add Twilio SendGrid to an existing Subscription or Select **+Add** to create a new subscription. For more information about Subscriptions and billing, see the Azure docs for how to \"[Create an additional Azure subscription](https://docs.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription).\"\n\nFor this guide, we will create a new Subscription.\n\n![Azure Subscriptions with the +Add link highlighted]({{root_url}}/img/sg_azure_subscriptions_add.png 'Azure +Add Subscription')\n\nIf you already have an Azure account set up for billing, you will be taken to a page where you can create a subscription.\n\n<call-out>\n\nIf you are creating your first Azure Subscription, you will first need to select a billing offer for your Subscription. You will be guided through the Azure offer signup process. You can return to this guide once your billing setup is complete.\n\n</call-out>\n\nA form will load with a **Subscription Name** field. You must add a name — we recommend something that clearly differentiates the subscription. All the other fields are already populated and cannot be edited. Click **Create**.\n\n![Azure Subscriptions form with the Subscription Name populated]({{root_url}}/img/sg_azure_subscription_create.png 'Azure Subscription Name')\n\nOnce the Subscription is created, you will see it listed on the Subscriptions page. If you do not see the Subscription, try refreshing the list.\n\n<call-out>\n\nIf you have multiple Azure Active Directory tenants, be sure you are viewing the tenant your subscription is assigned to. You can select **Switch directories** to view your additional tenants. For more on Azure AD, see \"[Associate or add an Azure subscription to your Azure Active Directory tenant](https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-subscriptions-associated-directory).\"\n\n</call-out>\n\n![A list of all Azure Subscriptions for the account]({{root_url}}/img/sg_azure_subscriptions_listed.png 'Azure Subscriptions')\n\n## Create a Twilio SendGrid account\n\nFrom the Azure portal home page, select **Marketplace** under **Azure services**. If you do not see the **Marketplace** icon, you can search for it by selecting **More services**.\n\n![The Azure portal home page with the Marketplace icon highlighted]({{root_url}}/img/sg_azure_home_marketplace.png 'Azure Marketplace')\n\nThe Azure Marketplace provides many services, including the Twilio SendGrid email service. You can find it by searching for \"Twilio SendGrid.\" You will also find it under **Software as a Service (SaaS)**.\n\nClick the Twilio SendGrid resource to load a page where you can select your account tier. You can start with a free account and upgrade as your sending needs change. See the [Twilio SendGrid pricing page](https://sendgrid.com/pricing/) to understand what's included with each plan.\n\n![The Twilio SendGrid integration listed in the Azure Marketplace]({{root_url}}/img/sg_azure_marketplace_listing.png 'Azure Marketplace Twilio SendGrid listing')\n\n![The Twilio SendGrid integration detail page with a \"Setup + Subscripe\" link]({{root_url}}/img/sg_azure_listing_setup_subscribe.png 'Azure Marketplace Twilio SendGrid listing detail page')\n\nSelect **Set up + subscribe**. You will be taken to a page where you can assign your Twilio SendGrid account to an Azure Subscription and Resource Group. Once you have completed the required fields, select **Review + subscribe**.\n\n![The Twilio SendGrid integration configuration basics]({{root_url}}/img/sg_azure_create_sg_account.png 'Azure Marketplace Twilio SendGrid configuration basics')\n\nYou will be asked to agree to Azure's term of services. You can now review your order and click **Subscribe**.\n\nIt takes a few moments to establish your account. You will be shown a progress screen. When the setup is complete, you will be able to click the **Configure account now** button to be taken to the Twilio SendGrid App. You will also receive an email when the subscription setup is complete.\n\n![The Twilio SendGrid subscription in progress]({{root_url}}/img/sg_azure_subscription_in_progress.png 'Azure Marketplace Twilio SendGrid subscription in progress')\n\n## Twilio SendGrid account setup\n\nBefore sending your first email, you will need to complete the following Twilio SendGrid account setup. These requirements help secure your account and keep your messages from landing in spam folders.\n\n- Configure Two-factor authentication\n- Create an API key\n- Complete Sender Authentication\n\n### Two-factor authentication\n\nTwilio SendGrid uses Two-factor authentication (2FA) to help protect your account. To enable 2FA, Navigate to **Two-Factor Authentication** in the Twilio SendGrid **Settings** menu, and click **Add Two-Factor Authentication**.\n\n![The Twilio SendGrid App's Two-factor authentication menu]({{root_url}}/img/sg_azure_2fa_page.png 'Two-factor authentication menu')\n\nA modal will open where you can complete the 2FA setup. Click **Ok, Got it** to continue.\n\n<call-out type=\"warning\">\n\nIf you have previously configured services to authenticate with Twilio SendGrid APIs using Basic Authentication, enabling 2FA will break those integrations. You must use API keys to authenticate with Twilio SendGrid APIs.\n\n</call-out>\n\n![A modal asking to confirm 2FA setup]({{root_url}}/img/sg_azure_2fa_modal.png '2FA confirmation')\n\nTwilio SendGrid supports 2FA using either SMS or the Authy App. Select your preferred 2FA method, and click **Next**.\n\nYou will need to enter a phone number to complete the 2FA process. SMS users will be sent a confirmation code at the number they entered. Authy users will be sent instructions for downloading and completing the 2FA setup using the Authy app.\n\n### API keys\n\nAPI Keys authenticate your application, mail client, or website with Twilio SendGrid services. Unlike a username and password, API keys are scoped to provide access only to the services you select. You can also delete and create API keys without impacting your other account credentials. For these reasons, Twilio SendGrid requires you to connect to its services using API keys.\n\n#### Create an API key\n\nIn the Twilio SendGrid App, navigate to **API Keys** in the **Settings** menu, and select **Create API Key**.\n\n![The Twilio SendGrid App's API keys page]({{root_url}}/img/sg_azure_api_keys_page.png 'API keys')\n\nA modal will open where you can create your key. You must name the API key — we recommend something that will clearly differentiate the key from others you may create in the future.\n\n![A modal where you can name configure and configure an API key]({{root_url}}/img/sg_azure_api_keys_modal.png 'Name and configure an API key')\n\nYou must also select the type of key you want to create. Twilio SendGrid provides three types of API key:\n\n- Full Access\n- Restricted Access\n- Billing Access\n\nTo keep your account secure, you should give each key the [least privilege](https://www.twilio.com/blog/principle-of-least-privilege-details-best-practices) necessary. You can limit a key's capabilities by creating a **Restricted Access** key and selecting a subset of all the possible permissions. For more about managing Twilio SendGrid API keys, see the [Twilio SendGrid API keys documentation]({{root_url}}/ui/account-and-settings/api-keys/).\n\n<call-out>\n\nFor security reasons, Twilio SendGrid API keys will be displayed to you at the time of creation only. Be sure to copy your key and store it somewhere secure like your [Azure Key Vault](https://azure.microsoft.com/en-us/services/key-vault/). If you lose your key, you must create another — it's not possible to recover a lost key. The permissions assigned to a key can be modified after it's created.\n\n</call-out>\n\n#### Use an API key\n\nTwilio SendGrid's v3 APIs expect an API key to be passed in an Authorization header as a Bearer Token. See the [Twilio SendGrid v3 API reference]({{root_url}}/api-reference/) for help using your key to send your first email.\n\nThe Twilio SendGrid helper libraries all provide a method to set your key, handling the authentication via Bearer Token for you. See the [Twilio SendGrid developer documentation]({{root_url}}/for-developers/) for helpful code examples and links to helper libraries in C#, Go, Java, Node.js, PHP, Python, and Ruby.\n\nWhen using Twilio SendGrid’s SMTP integration, you will set your API key as a password via Basic Authentication. Your username must always be the string, “apikey.” Using the account credentials (username and password) you set up through Azure will fail, so be sure to set your password to the 14 digit API key provided by the Twilio SendGrid App. Your account credentials are separate from the credentials used to authenticate with Twilio SendGrid’s APIs and SMTP services.\n\n```\nusername: \"apikey\"\npassword: <your-api-key>\n```\n\n### Sender Authentication\n\nTwilio SendGrid requires customers to complete Sender Authentication. This requirement protects your domain's reputation as an email sender and helps uphold legitimate sending behavior by Twilio SendGrid customers.\n\nSetup includes domain authentication. Twilio SendGrid will provide DNS records that you must add to your domain. For instructions on the domain authentication process, see \"[How to Set Up Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).\"\n\n## Change, unsubscribe, reactivate your Twilio SendGrid plan\n\nYou can upgrade or downgrade your Twilio SendGrid plan to accommodate your email sending needs as they change. If you no longer need the Twilio SendGrid service, you will aslo unsubscribe through the Azure portal.\n\nFrom your Azure portal's Subscription overview page, select **Resources** and click your Twilio SendGrid resource (it is labeled \"Contoso\" in the following examples).\n\n![The Azure resources page with a Twilio SendGrid subscription highlighted]({{root_url}}/img/sg_azure_subscription_resources.png 'The Twilio SendGrid resource')\n\nA detail page will load where you can modify your Twilio SendGrid subscription.\n\n![The Twilio SendGrid subscription resource detail page]({{root_url}}/img/sg_azure_resource_detail.png 'The Twilio SendGrid resource detail')\n\n### Upgrade or downgrade your plan\n\nTo upgrade or downgrade your plan, select **Change plan** from the Twilio SendGrid resource detail page. There are two locations where you can select **Change plan** — selecting **Change subscription** will allow you to modify your Azure subscription, not your Twilio SendGrid plan.\n\n![The Twilio SendGrid Azure resource with the \"Change Plan\" link highlighted]({{root_url}}/img/sg_azure_change_plan_link.png 'Change plan')\n\nA modal will open, displaying the available plans with your current plan selected. Select a new plan, and click **Change plan**. You will see a confirmation message on the page when your plan has been updated.\n\n### Unsubscribe from Twilio SendGrid\n\nTo unsubscribe from Twilio SendGrid, select **Unsubscribe** from the Twilio SendGrid resource detail page.\n\n![The Twilio SendGrid Azure resource with the \"Unsubscribe\" link highlighted]({{root_url}}/img/sg_azure_change_plan_unsubscribe.png 'Unsubscribe from Twilio SendGrid')\n\nA modal will open asking you to select the reason for ending your subscription. Select an option that best describes your situation, and click **Unsubscribe**.\n\n![The Twilio SendGrid Azure resource Unsubscribe confirmation page]({{root_url}}/img/sg_azure_unsubscribe_modal.png 'Unsubscribe from Twilio SendGrid')\n\nYou will receive a confirmation message when your subscription has been removed.\n\n### Reactivate your Twilio SendGrid account\n\nIf you have unsubscribed from Twilio SendGrid and need the service again in the future, you will need to create a new subscription. If your account has been suspended, you can reactivate the service by paying any outstanding account balance. Once payment has been received, you'll be able to reactivate your account.\n"
  },
  {
    "path": "content/docs/for-developers/partners/microsoft-azure.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Microsoft Azure\nnavigation:\n  show: true\n---\n\nIf you are using Microsoft’s cloud platform, you can easily integrate with SendGrid. Simply navigate to the [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), locate the [SendGrid add-on](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), select the appropriate plan, and get ready to start sending. \n\nThe following documentation covers signing up, sending an email, adding an attachment, as well as using filters. See the below Code Examples to start learning how Azure and SendGrid can solve your email deliverability problems.\n\n\n## \tCode Examples\n\n1. [PHP](https://docs.microsoft.com/en-us/azure/store-sendgrid-php-how-to-send-email)\n2. [Node.js](https://docs.microsoft.com/en-us/azure/store-sendgrid-nodejs-how-to-send-email)\n3. [.NET](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email)\n4. [Java](https://docs.microsoft.com/en-us/azure/store-sendgrid-java-how-to-send-email)\n5. [Java]({{root_url}}/for-developers/partners/azure/) via an Azure webpage\n6. [Mobile Services](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email)\n\n## \tStill have questions?\n\nWondering how to make the most of your SendGrid/Azure integration? Check out our [Azure related blog entries](https://sendgrid.com/?s=Azure).\n\nYou are limited to 1 SendGrid account per Azure subscription. This limit exists for security and compliance reasons to prevent abuse.\n\nCustomers that integrate through the [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), do not have access to SendGrid's Marketing Campaigns. \n\nIf you try to create a second account, you will encounter this error on your dashboard:\n\n![]({{root_url}}/images/azure_account_error.png)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/api-getting-started.md",
    "content": "---\nseo:\n  title: Getting started with the SendGrid API\n  description: Sending your first email using the SendGrid REST API.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API\ntitle: Getting started with the SendGrid API\ngroup: api-v3\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nThere are several ways you can get started with the SendGrid API.\n\n## Prerequisites for sending your first email with the SendGrid API\n\nThese instructions describe how to send your first email using cURL calls. This is one of many ways to send email with the SendGrid API - we also have [PHP](https://github.com/sendgrid/sendgrid-php), [Python](https://github.com/sendgrid/sendgrid-python), [Node.js](https://github.com/sendgrid/sendgrid-nodejs), [Java](https://github.com/sendgrid/sendgrid-java), [C#](https://github.com/sendgrid/sendgrid-csharp), [Go](https://github.com/sendgrid/sendgrid-go), and [Ruby](https://github.com/sendgrid/sendgrid-ruby) libraries.\n\nBefore you can start using the API, you need to do the following:\n\n1. Create a SendGrid [account](https://sendgrid.com/pricing/).\n2. Create an [API Key](https://app.sendgrid.com/settings/api_keys).\n3. Make sure you have [curl](https://curl.haxx.se/) installed on your machine.\n\n<call-out>\n\ncURL comes standard on Mac operating systems.\n\n</call-out>\n\n## How to send an API email\n\n### Build your API call\n\nYour API call must have the following components:\n\n- **A host.** The host for Web API v3 requests is always `https://api.sendgrid.com/v3/`\n- **An [Authorization header](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-authentication#authorization-header).** An [API Key](https://app.sendgrid.com/settings/api_keys) must be included in the Authorization header.\n- **A request.** When submitting data to a resource via POST or PUT, you must submit your payload in JSON.\n\n<call-out>\n\n**Message size limit:** The total message size should not exceed 20MB. This includes the message itself, headers, and the combined size of any attachments.\n\n</call-out>\n\n### Send your email using the API\n\n<call-out type=\"warning\">\n\nPlease note that Basic Authentication is no longer accepted; you must use an API key.\n\n</call-out>\n\n_To Send an email using the SendGrid API:_\n\n```\ncurl --request POST \\\n--url https://api.sendgrid.com/v3/mail/send \\\n--header 'Authorization: Bearer <<YOUR_API_KEY>>' \\\n--header 'Content-Type: application/json' \\\n--data '{\"personalizations\":[{\"to\":[{\"email\":\"john.doe@example.com\",\"name\":\"John Doe\"}],\"subject\":\"Hello, World!\"}],\"content\": [{\"type\": \"text/plain\", \"value\": \"Heya!\"}],\"from\":{\"email\":\"sam.smith@example.com\",\"name\":\"Sam Smith\"},\"reply_to\":{\"email\":\"sam.smith@example.com\",\"name\":\"Sam Smith\"}}'\n```\n\n1. Copy the curl example above.\n2. Paste the curl call into your favorite text editor.\n3. Copy your API key and paste it in the \"Authorization\" header.\n4. In the data section, specify the \"to\", \"from\", and \"reply to\" names and email addresses and enter a subject.\n5. Copy the code and paste it in your terminal.\n6. Hit **Enter**.\n7. Check the inbox of the address you specified as the \"to\" email and see your message!\n\n<call-out>\n\nIf you have not yet set up [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) in your account, you may need to check your spam folder for the email you just sent.\n\n</call-out>\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n### Do you want expert help to get your email program started on the right foot?\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n</call-out-link>\n\n### API response messages\n\nAll responses are returned in JSON format. We specify this by sending the `Content-Type` header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next steps\n\nFor more information on SendGrid and where you can go from here, check out these pages:\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Automating Subusers]({{root_url}}/for-developers/sending-email/automating-subusers/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/applemail.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Apple Mail\ngroup: plugins\nnavigation:\n  show: true\n---\n\nThese instructions show how to add an SMTP server to an existing Mail account, but you can also add these settings at the account creation stage.\n\n## \tAdding SMTP settings\n\nGo to Mail -\\> Preferences (⌘,). On the account you want to edit, click the tab that says **Server Settings**, then click the **Outgoing Mail Account** dropdown and select **Edit SMTP Server List...**.\n\n![Mail, Preferences, Outgoing Mail Server (SMTP) dropdown, Edit SMTP Server List]({{root_url}}/images/NewAppleMail_Step_1.png \"Edit SMTP Server List\")\n\nNext, click the **+** under the list of SMTP servers, and add a new one.\n\n![The plus button to click to add an SMTP server]({{root_url}}/images/NewAppleMail_Step_2.png \"Add SMTP Server\")\n\nThen enter the server details:\n\n-   **Description:** SendGrid\n-   **User Name:** SendGrid account username\n-   **Password:** SendGrid account password\n-   **Host Name:** smtp.sendgrid.net\n-   Uncheck **Automatically manage connection settings** if you want to specify Custom Ports, Encryption Type and       Authentication\n-   **Port:** Specify the port\n-   **Encryption:** Check or uncheck Use TLS/SSL\n-   **Authentication:** Password\n\n![Settings for Mail to use SendGrid SMTP]({{root_url}}/images/NewAppleMail_Step_3.png \"SendGrid SMTP server settings\")\n\nNow the SendGrid SMTP Server can be specified on the **Accounts** tab of the **Preferences** window in the **Outgoing Mail Account** dropdown. Once this is selected, mail sent out of Apple Mail going forward will use the SMTP server chosen until specified otherwise.\n\n![The dropdown menu to select the SMTP server to use for this send.]({{root_url}}/images/NewAppleMail_Step_4.png \"SMTP server dropdown\")\n\n<call-out>\n\nUnfortunately, there is not an easy way to add SMTP API headers to a message in Mail.\n\n</call-out>\n\n## \tAttachment Compatibility\n\nMail will sometimes attach images in a way that is incompatible with other email readers. However, this behavior can be changed so that Mail will send more traditional non-inline attachments.\n\n1. Open Terminal (found in Finder > Applications > Utilities).\n1. In Terminal, paste the following: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool yes```.\n1. Press return.\n1. Restart the Mail app.\n\nIf you wish to restore the normal behavior of Mail, repeat the steps above while using the following command: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool no```.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/authentication.md",
    "content": "---\nseo:\n  title: Authentication\n  description: Authenticating with the SendGrid API.\n  keywords: getting started, Authentication, authorization, API key\ntitle: Authentication\ngroup: sending-email\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid supports API keys delivered via Bearer token or Basic authentication, depending on the SendGrid functionality you are using. In addition to Bearer API key authentication, SendGrid recommends two-factor authentication (2FA) to improve security.\n\n## API key\n\nAuthenticate to the SendGrid API by creating an API Key in the [Settings section of the SendGrid UI](https://app.sendgrid.com/settings/api_keys).\n\nSendGrid requires using API keys because they are a secure way to talk to the SendGrid API that is separate from your username and password. If your API key gets compromised, it's easy to delete and create a new API key and update your environment variables with the new key. API key permissions can be set to provide access to different functions of your account, without providing access to your account as a whole.\n\nTo use an API key, pass an Authorization header with a value of `Bearer <Your-API-Key-Here>`, where you replace `<Your-API-Key-Here>` with the API Key that you created in the UI.\n\nExample header:\n\n```\nGET https://api.sendgrid.com/v3/resource HTTP/1.1\nAuthorization: Bearer <Your-API-Key-Here>\n```\n\n```bash\ncurl -X \"GET\" \"https://api.sendgrid.com/v3/templates\" -H \"Authorization: Bearer <Your-API-Key-Here>\" -H \"Content-Type: application/json\"\n```\n\n## Basic authentication\n\nSendGrid supports Basic Authentication using an API key as your password value for some services. When using Basic Authentication, your username will always be \"apikey,\" and your password will be your API key.\n\n<call-out type=\"warning\">\n\nTo ensure the security of your account, Twilio SendGrid has ended support for basic authentication with username and password as of Q4 2020.\n\n</call-out>\n\n### Security with Basic authentication\n\nUsing basic authentication with your account password is not as secure as using an API key. If your credentials are compromised—for example, if you accidentally commit them to version control—it is more difficult to regain the security of your account when those credentials are your username and password rather than an API key. For this reason, Twilio SendGrid no longer supports authentication via username and password.\n\n<call-out type=\"warning\">\n\nIf you are currently using Basic authentication, we recommend upgrading your authentication method to Bearer using [API Keys]({{root_url}}/ui/account-and-settings/api-keys/) and then enabling Two-Factor Authentication for improved security. For more information, see [Upgrading your authentication method to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/).\n\n</call-out>\n\n## Two-factor authentication\n\nEnabling two-factor authentication (2FA) will allow Twilio SendGrid to deliver confirmation codes via SMS to your mobile phone. You will not be able to log in when cellular service is not available. SMS 2FA is powered by [Authy](https://authy.com/). Selecting this option does not require an Authy account, but if you have one, you will be able to use either the [Authy App](https://www.authy.com/app/mobile/) or SMS messages.\n\nSendGrid recommends enabling two-factor authentication (2FA) for all users. For more information about setting up 2FA, see [Two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).\n\n<call-out>\n\nTo ensure the security of your account, Twilio SendGrid requires customers to enable [Two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).\n\n</call-out>\n\n<call-out type=\"warning\">\n\nIt is not possible to use basic authentication for users, subusers, or teammates that enable 2FA.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/automating-subusers.md",
    "content": "---\nseo:\n  title: Automate Adding Subusers with the SendGrid API\n  description: Use the SendGrid API to add Subusers to your account.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, Subuser\ntitle: Automate Adding Subusers with the SendGrid API\ngroup: api-v3\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nYou can utilize the SendGrid API to automate the addition of Subusers to your account. Use the following ```curl``` examples to add a Subuser using the SendGrid V3.0 API.\n\n## \tPrerequisites for automating addition of Subusers to your account\n\nBefore you can start using the API, you need to do the following:\n\n1. Create a SendGrid [account](https://sendgrid.com/pricing/).\n2. Create an [API Key](https://app.sendgrid.com/settings/api_keys).\n3. Make sure you have [curl](https://curl.haxx.se/) installed on your machine.\n\n<call-out>\n\ncURL comes standard on Mac operating systems.\n\n</call-out>\n\n## \tHow to add a Subuser via the SendGrid API and curl\n\n### Creating the Subuser\n\n1. **Create Subuser** - Creating the actual account, the profile, username, password, and the keys you want on the account.\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\n  \"username\": “examplecurltesting\",\n  \"email\": \"example@example.com\",\n  \"password\": “PASSWORD\",\n  \"ips\": [\n  \"167.89.38.39\",\n  \"198.37.152.144\"\n  ]\n}' 'https://api.sendgrid.com/v3/subusers'\n```\n\nThe successful Response looks like this:\n\n```bash\n=> 2xx\n{\"username”:”examplecurltesting\",\"user_id\":1868534,\"email”:”example@example.com\",\"signup_session_token\":\"\",\"authorization_token\":\"\",\"credit_allocation\":{\"type\":\"unlimited\"}}\n```\n\n2. **GET Subusers** (optional step to confirm POST):\n\n```bash\ncurl -X GET -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" 'https://api.sendgrid.com/v3/subusers'\n```\n\nResponse:\n\n```bash\n[{\"disabled\":false,\"email\":\"example@example.com\",\"id\":1762958,\"username\":\"exampletestingv3subuserapi\"},{\"disabled\":false,\"email\":\"example@testsite.com\",\"id\":1766771,\"username\":\"examplesubuser-UI\"},{\"disabled\":false,\"email\":\"example@testsite.com\",\"id\":1803837,\"username\":\"exampleisasubuser\"},{\"disabled\":false,\"email\":\"example@example.com\",\"id\":1868534,\"username\":\"examplecurltesting\"}]\n```\n\n3. **Create API Keys** (optional, depends on integration style): If the application would rather run on API keys than a password, then follow this step:\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\"name\": “API KEY NAME\"}' 'https://api.sendgrid.com/v3/api_keys'\n```\n\nor, you can create the key for your Subuser:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer PARENT_APIKEY_HERE\" \n  -H \"On-Behalf-Of: examplecurltesting\" \\\n  -H \"Content-Type: application/json\" -d '{\"name\": “API KEY NAME\"}' \\\n  'https://api.sendgrid.com/v3/api_keys'\n  ```\n  \nSuccessful API key implementation Response:\n  \n  ```bash\n  => 201 created\n{\"api_key\":\"SG.XXXXXXXXXXXXXXXXXXXXXXXXX\",\"api_key_id\":\"sample_id\",\"name\":\"new api key\",\"scope_set_id\":\"00766089-9730-4f16-8191-b8bedc5f57f5\"}\n```\n\nOnce this has been done, the Subuser has been created. From this point on, we’ll cover implementing Click Tracking, Open Tracking, and the Event Webhook for those Subusers.\n\n### Enable/Edit Applications\nAs of right, now this needs to be done directly through the account in question.\n\n**Click Tracking**\n\n```bash\ncurl -X PATCH -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\"enabled\": true,\"enable_text\" : true}' 'https://api.sendgrid.com/v3/tracking_settings/click'\n```\n\nResponse:\n\n```bash\n=> 200 OK\n{\"enable_text\":true,\"enabled\":true}\n```\n\n**Open Tracking**\n\n```bash\ncurl -X PATCH -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\"enabled\": true}' 'https://api.sendgrid.com/v3/tracking_settings/open'\n```\n\nResponse:\n\n```bash\n=> 200 ok\n{\"enabled\":true}\n```\n\n**Event Webhook**\n\n```bash\ncurl -X PATCH -H \"Authorization: Basic XXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\"enabled\": true,\"url\":\"https://api.keen.io/3.0/projects/526a8a5f05cd660472000012/partners/sendgrid?api_key=081da3fc30ca5b11b1f8b133de7064817b57c86d3261f140dc36243eb6829a100d4c5e38db8dd289194d4e02159bbf7ebad74a1fba1fce7a421a00c7a2f7d0f8ba5ef6ea3cece6345904d79395c35cdeaed221c3a208c897e79dd95da399a1d2d1d3e66768af929aa52d621e5bd296a5\",\"group_resubscribe\": true,\"delivered\": true,\"group_unsubscribe\": true,\"bounce\": true,\"deferred\": true,\"unsubscribe\": true,\"processed\": true,\"open\": true,\"click\": true,\"dropped\": true}' 'https://api.sendgrid.com/v3/user/webhooks/event/settings'\n```\n\nResponse:\n\n```bash\n=> 200 ok\n{\n\"bounce\": true,\n\"click\": true,\n\"deferred\": true,\n\"delivered\": true,\n\"dropped\": true,\n\"enabled\": true,\n\"group_resubscribe\": true,\n\"group_unsubscribe\": true,\n\"open\": true,\n\"processed\": true,\n\"spam_report\": false,\n\"unsubscribe\": true,\n\"url\": \"https://api.keen.io/3.0/projects/526a8a5f05cd660472000012/partners/sendgrid?api_key=081da3fc30ca5b11b1f8b133de7064817b57c86d3261f140dc36243eb6829a100d4c5e38db8dd289194d4e02159bbf7ebad74a1fba1fce7a421a00c7a2f7d0f8ba5ef6ea3cece6345904d79395c35cdeaed221c3a208c897e79dd95da399a1d2d1d3e66768af929aa52d621e5bd296a5\"}\n```\n\n\n### Domain Authentication for the Subuser\n\nNow we are going to setup Domain Authentication for the Subusers created above. This process involves creating the parent Domain Authentication and then associating it with your Subusers:\n\n\n1. **Create Domain Authentication**\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\n  \"domain\": \"example.com\",\n  \"subdomain\": \"subdomain\",\n  \"ips\": [\n  \"167.89.38.39\",\n  \"198.37.152.144\"\n  ],\n  \"default\": true,\n  \"automatic_security\": true\n  }' 'https://api.sendgrid.com/v3/whitelabel/domains'\n```\n\nResponse:\n\n```bash\n=> 2xx\n\n{\"id\":50784,\"user_id\":624781,\"subdomain\":\"subdomain\",\"domain\":\"example.com\",\"username\":\"examplecurltesting\",\"ips\":[\"167.89.38.39\",\"198.37.152.144\"],\"custom_spf\":false,\"default\":true,\"legacy\":false,\"automatic_security\":true,\"valid\":false,\n\"dns\":{\"mail_cname\":{\"valid\":false,\"type\":\"cname\",\"host\":\"subdomain.example.com\",\"data\":\"u624781.wl.sendgrid.net\"},\"dkim1\":{\"valid\":false,\"type\":\"cname\",\"host\":\"s1._domainkey.example.com\",\"data\":\"s1.domainkey.u624781.wl.sendgrid.net\"},\"dkim2\":{\"valid\":false,\"type\":\"cname\",\"host\":\"s2._domainkey.example.com\",\"data\":\"s2.domainkey.u624781.wl.sendgrid.net\"},\"spf\":{\"valid\":false,\"type\":\"txt\",\"host\":\"example.com\",\"data\":\"v=spf1 include:u624781.wl.sendgrid.net -all\"}}}\n{\n\"id\": 50784,\n\"user_id\": 624781,\n\"subdomain\": \"subdomain\",\n\"domain\": \"example.com\",\n\"username\": \"examplecurltesting\",\n\"ips\": [\n\"167.89.38.39\",\n\"198.37.152.144\"\n],\n\"custom_spf\": false,\n\"default\": true,\n\"legacy\": false,\n\"automatic_security\": true,\n\"valid\": false,\n\"dns\": {\n\"mail_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"subdomain.example.com\",\n\"data\": \"u624781.wl.sendgrid.net\"\n},\n\"dkim1\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"s1._domainkey.example.com\",\n\"data\": \"s1.domainkey.u624781.wl.sendgrid.net\"\n},\n\"dkim2\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"s2._domainkey.example.com\",\n\"data\": \"s2.domainkey.u624781.wl.sendgrid.net\"\n},\n\"spf\": {\n\"valid\": false,\n\"type\": \"txt\",\n\"host\": \"example.com\",\n\"data\": \"v=spf1 include:u624781.wl.sendgrid.net -all\"\n}\n}\n```\n\nYou will want to look for the Domain Authentication ID here (in this example, the ID is ```\"id\": 50784```), as this will be used in the next calls to append this ID to the Subusers. Also, the records needed to validate this Domain Authentication will be passed back in the response.\n\n\n2. **Create Reverse DNS**\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXXX\" -H \"Content-Type: application/json” -d '{\"ip\": \"167.89.66.50\",\n  \"subdomain\": \"email\",\n  \"domain\": \"example.com\"}' 'https://api.sendgrid.com/v3/whitelabel/ips'\n ```\n  \n  Successful Response: \n ```bash\n => 2xx\n  {\n  \"id\": 11887,\n  \"ip\": \"167.89.66.50\",\n  \"rdns\": \"o4.email.example.com\",\n  \"users\": [],\n  \"subdomain\": \"email\",\n  \"domain\": \"example.com\",\n  \"a_record\": {\n  \"valid\": false,\n  \"type\": \"a\",\n  \"host\": \"o4.email.example.com\",\n  \"data\": \"167.89.66.50\"\n  },\n  \"valid\": false,\n  \"legacy\": false\n  }\n```\n\n\n3. **Create Link Branding**\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\n  \"domain\": \"example.com\",\n  \"subdomain\": \"links\",\n  \"default\": true\n  }' 'https://api.sendgrid.com/v3/whitelabel/links'\n```\n\nResponse:\n```bash\n=> 2xx\n{\n\"id\": 42371,\n\"user_id\": 624781,\n\"domain\": \"example.com\",\n\"subdomain\": \"links\",\n\"username\": \"examplecurltesting\",\n\"valid\": false,\n\"default\": true,\n\"legacy\": false,\n\"dns\": {\n\"domain_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"links.example.com\",\n\"data\": \"sendgrid.net\"\n},\n\"owner_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"624781.example.com\",\n\"data\": \"sendgrid.net\"\n}\n}\n}\n```\n\nAfter creating DNS records then wait for them to propagate and validate records.\n\n\n4. **GET all Domain Authentication IDs** - grab the ID to validate and associate to an account.\n\n```bash\ncurl -X GET -H \"Authorization: Basic XXXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" 'https://api.sendgrid.com/v3/whitelabel/domains'\n```\n\nResponse:\n\n```bash\n= 2xx ok\n{\n\"id\": 50784,\n\"user_id\": 624781,\n\"subdomain\": \"subdomain\",\n\"domain\": \"example.com\",\n\"username\": \"examplecurltesting\",\n\"ips\": [\n\"167.89.38.39\",\n\"198.37.152.144\"\n],\n\"custom_spf\": false,\n\"default\": true,\n\"legacy\": false,\n\"automatic_security\": true,\n\"valid\": false,\n\"dns\": {\n\"mail_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"subdomain.example.com\",\n\"data\": \"u624781.wl.sendgrid.net\"\n},\n\"dkim1\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"s1._domainkey.example.com\",\n\"data\": \"s1.domainkey.u624781.wl.sendgrid.net\"\n},\n\"dkim2\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"s2._domainkey.example.com\",\n\"data\": \"s2.domainkey.u624781.wl.sendgrid.net\"\n},\n\"spf\": {\n\"valid\": false,\n\"type\": \"txt\",\n\"host\": \"example.com\",\n\"data\": \"v=spf1 include:u624781.wl.sendgrid.net -all\"\n}\n}\n}\n```\n\n\n5. **Validate ID of the Domain Authentication**\nOnce you have the ID of the Domain Authentication you can Validate it.\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" 'https://api.sendgrid.com/v3/whitelabel/domains/50784/validate'\n````\n\nResponse:\n\n```bash\n=> 2xx\n{ \"id”: 50784, \"valid\": true, \"validation_results\": { \"mail_cname\": { \"valid\": false, \"reason\": \"Expected your MX record to be \"mx.sendgrid.net\" but found \"example.com\".\" },\"dkim1\": { \"valid\": true, \"reason\": null }, \"dkim2\": { \"valid\": true, \"reason\": null }, \"spf\": { \"valid\": true, \"reason\": null } } }\n```\n\n\n\n6. **Associate with a Subuser**\nOnce Validated, you can associate to any Subuser accounts.\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\n\"username\": \"examplecurltesting\"\n}' 'https://api.sendgrid.com/v3/whitelabel/domains/50784/subuser'\n````\n\n\n\n7. **Link Branding**\nFollow the same process with Link branding:\n\n\n```bash\n-> GET link ID (ex. 42371)\ncurl -X GET -H \"Authorization: Basic XXXXXXXXXXXXXX\" -H \"Content-Type: application/json\" -'https://api.sendgrid.com/v3/whitelabel/links'\n```\n\nResponse:\n\n```bash\n => 200 ok\n[\n{\n\"id\": 203,\n\"user_id\": 624781,\n\"domain\": \"example.com\",\n\"subdomain\": \"links\",\n\"username\": \"examplecurltesting\",\n\"valid\": true,\n\"default\": false,\n\"legacy\": false,\n\"dns\": {\n\"domain_cname\": {\n\"valid\": true,\n\"type\": \"cname\",\n\"host\": \"links.example.com\",\n\"data\": \"sendgrid.net\"\n},\n\"owner_cname\": {\n\"valid\": true,\n\"type\": \"cname\",\n\"host\": \"624781.example.com\",\n\"data\": \"sendgrid.net\"\n}\n}\n},\n{\n\"id\": 202,\n\"user_id\": 624781,\n\"domain\": \"example.org\",\n\"subdomain\": \"links\",\n\"username\": \"examplecurltesting\",\n\"valid\": true,\n\"default\": false,\n\"legacy\": false,\n\"dns\": {\n\"domain_cname\": {\n\"valid\": true,\n\"type\": \"cname\",\n\"host\": \"links.example.org\",\n\"data\": \"sendgrid.net\"\n},\n\"owner_cname\": {\n\"valid\": true,\n\"type\": \"cname\",\n\"host\": \"624781.example.org\",\n\"data\": \"sendgrid.net\"\n}\n}\n},\n{\n\"id\": 42371,\n\"user_id\": 624781,\n\"domain\": \"example.net\",\n\"subdomain\": \"links\",\n\"username\": \"examplecurltesting\",\n\"valid\": false,\n\"default\": true,\n\"legacy\": false,\n\"dns\": {\n\"domain_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"links.example.net\",\n\"data\": \"sendgrid.net\"\n},\n\"owner_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"624781.example.net\",\n\"data\": \"sendgrid.net\"\n}\n}\n}\n]\n```\n\nValidate Link Branding:\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXX\" -H \"Content-Type: application/json\" 'https://api.sendgrid.com/v3/whitelabel/links/203/validate'\n```\n\nResponse:\n\n```bash\n=> 200 ok\n{\n\"id\": 203,\n\"valid\": true,\n\"validation_results\": {\n\"domain_cname\": {\n\"valid\": true,\n\"reason\": null\n},\n\"owner_cname\": {\n\"valid\": true,\n\"reason\": null\n}\n}\n}\n```\n\nAssociate Link Branding:\n\n```bash\ncurl -X POST -H \"Authorization: Basic XXXXXXXXXXXX\" -H \"Content-Type: application/json\" -d '{\"username\": \"jane@example.com”}' 'https://api.sendgrid.com/v3/whitelabel/links/{link_id}/subuser'\n```\n\nResponse:\n\n```bash\n=> 201 created\n{\n\"id\": 200,\n\"user_id\": 623032,\n\"domain\": \"example.com\",\n\"subdomain\": \"links\",\n\"username\": \"examplecurltesting\",\n\"valid\": false,\n\"default\": false,\n\"legacy\": false,\n\"dns\": {\n\"domain_cname\": {\n\"valid\": false,\n\"type\": \"cname\",\n\"host\": \"links.example.com\",\n\"data\": \"sendgrid.net\"\n},\n\"owner_cname\": {\n\"valid\": true,\n\"type\": \"cname\",\n\"host\": \"623032.example.com\",\n\"data\": \"sendgrid.net\"}}}\n```\n\n## \tNext Steps\n\nFor more information on SendGrid and where you can go from here, check out these pages:\n\n- [API Reference]({{root_url}}/api-reference/)\n- [How to Create a Subuser with the API]({{root_url}}/for-developers/sending-email/how-to-create-a-subuser-with-the-api/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to Send Email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/brite-verify.md",
    "content": "---\nseo:\n title: Using SendGrid with BriteVerify\n description: Verify your SendGrid email list with Briteverify\n keywords: SendGrid email list, SendGrid integrate, Briteverify, Tutorial\ntitle: Using SendGrid with BriteVerify\ngroup: plugins\nweight: 90\nlayout: page\nnavigation:\n show: true\n---\n\n## Creating a new API Key\n\nUse BriteVerify to verify your SendGrid list. First, you will need to generate an API Key within SendGrid.\n\n<call-out type=\"warning\">\n\nOnce you generate the SendGrid Key, copy the API Key somewhere safe for future reference—this will only be visible once.\n\n</call-out>\n\n<call-out>\n\nWe hid API Keys in this tutorial for security purposes.\n\n</call-out>\n\nTo get started, open the BriteVerify app and click **Verify New List** and then select **SendGrid**.\n![]({{root_url}}/images/briteverify_verify_new_list.jpg)\n![]({{root_url}}/images/briteverify_choose_list.jpg)\n\nThe app triggers the prompt to input the SendGrid API key. The app requires this authentication only once to link the 2 applications.\n\n![]({{root_url}}/images/briteverify_auth_sg.jpg)\n\nTo generate the SendGrid API key, log into your SendGrid account. On the left side of the screen, click **Settings** and then click **API Keys**.\n\n![]({{root_url}}/images/briteverify_navbar.jpg)\n\nOn the API Keys page, click **Create API Key**.\n\n![]({{root_url}}/images/briteverify_createapikey.jpg)\n\nHere you will be able to name your API Key and set up the relevant permissions.\nSelect **Restricted Access** to customize permissions.\n\n![]({{root_url}}/images/briteverify_create_api_key_sidebar.jpg)\n\nTo allow BriteVerify to work with your SendGrid list, make the following changes to your permissions:\n\n- Email Activity – should have “read” access\n- Stats – should have “read” access\n- Suppressions – should have “full” access\n- Marketing Campaigns – should have “full” access\n\n![]({{root_url}}/images/briteverify_access_levels.jpg)\n\nWhen finished, click **Create & View** to generate your API Key.\n\n<call-out type=\"warning\">\n \nRemember to store this key somewhere safe because you will not be able to retrieve or restore it once you navigate away from this page.\n\n</call-out>\n\n![]({{root_url}}/images/briteverify_apikey_created.jpg)\n\nCopy the key then paste it in the textbox in the Briteverify app. Make sure that there are no extra spaces when pasting the key. If you enter the key incorrectly, an error requesting you to review the info displays.\n\n![]({{root_url}}/images/briteverify_enter_api_key.jpg)\n\nOnce you provide the correct API Key, the applications sync, and you may now verify your SendGrid data.\n\nChoose the list you would like to verify and an estimated cost will display.\n\n![]({{root_url}}/images/briteverify_sgimport1.jpg)\n\nRisky emails include Unknown and Accept_all category emails. Remove these to prevent diluting a marketing campaign’s overall performance. Enable the radio button to eliminate risky emails from the final list.\n\n![]({{root_url}}/images/briteverify_sgimport2.jpg)\n\nNext choose **File** as your Export Destination. Once the verification is complete, BriteVerify transfers the cleaned list directly to your SendGrid account.\n\nClick **Verify List** to begin the verification.\n\n![]({{root_url}}/images/briteverify_sgimport3.jpg)\n\n<call-out>\n\nFor more information or support, contact [BriteVerify](https://support.briteverify.com/)\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/building-an-x-smtpapi-header.md",
    "content": "---\nseo:\n  title: Building an X-SMTPAPI Header\n  description: Learn how to build email content, add recipients and schedule your send.\n  keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients, X-SMTPAPI\ntitle: Building an X-SMTPAPI Header\ngroup: smtp\nweight: 949\nlayout: page\nnavigation:\n  show: true\n---\n\nNow that you've [sent a test SMTP email with Telnet]({{root_url}}/for-developers/sending-email/getting-started-smtp/), and [integrated with SendGrid]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/), it's time to build content.\n\n## Getting started building\n\nThe Twilio SendGrid SMTP service allows you to pass SendGrid a JSON string with as many SMTP objects as you want. This functionality is made possible by including a header named X-SMTPAPI. This page provides instructions for using the X-SMTPAPI to modify and control your mail send.\n\n### Limitations\n\nThe X-SMTPAPI is a powerful way to modify your SMTP messages. However, there are several things to keep in mind when using the header.\n\n- Ensure that you are sending just ONE X-SMTPAPI header per SMTP transaction. For any request received with multiple X-SMTPAPI headers on the same request, Twilio SendGrid will adhere to the first X-SMTPAPI header instance on each request.\n- There is a hard limit of 10,000 addresses in a multiple recipient email. However, the best practice is to split large jobs into separate transactions of approximately 1,000 recipients, which allows better processing load distribution. If you have a large number of additional substitutions or sections in the headers, it is best to split the send into even smaller groups.\n- When using the X-SMTPAPI header to send to multiple recipients, you cannot use SMTP's standard RCPT TO command to also send to multiple recipients. Doing so can generate duplicate messages to the addresses listed in both the X-SMTPAPI \"to\" field and the RCPT list. For more information, see [RFC 5321](https://tools.ietf.org/html/rfc5321).\n- Ensure that the header is limited to a maximum total line length of 1,000 characters. Failure to do this can cause intermediate Mail Transfer Agents (MTAs) to split the header on non-space boundaries, which causes inserted spaces in the final email. If your email is going through another MTA before reaching SendGrid, it is likely that the other MTA will have an even lower setting for maximum header length and may truncate the header.\n- When using the X-SMTPAPI header, if our system encounters a parsing error, the message will be bounced to the address specified in the MAIL FROM portion of the SMTP session. The MAIL FROM address is re-written when we send the email for final delivery, so it is safe to set the MAIL FROM to an address that can receive the bounces and alert you to any errors.\n- When sending Unicode characters via the SMTP API, you should escape these characters using the `\\u` escape character. For example, the Unicode `á` character will look like this: `\\u00E1`.\n\n## Customizing your send (filters)\n\n```json\n{\n  \"to\": [\"example@example.com\", \"example@example.com\"],\n  \"sub\": {\n    \"%name%\": [\"Ben\", \"Joe\"],\n    \"%role%\": [\"%sellerSection%\", \"%buyerSection%\"]\n  },\n  \"category\": [\"Orders\"],\n  \"unique_args\": {\n    \"orderNumber\": \"12345\",\n    \"eventID\": \"6789\"\n  },\n  \"filters\": {\n    \"footer\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"text/plain\": \"Thank you for your business\"\n      }\n    }\n  },\n  \"send_at\": 1409348513\n}\n```\n\nYou can customize the emails you send via SMTP by using different settings (also referred to as [filters](#smtp-filters)).\n\nThe X-SMTPAPI header is a JSON-encoded object (key-value pairs) consisting of several sections. Below are examples of JSON strings using each section.\n\n- [Scheduling Your Send](#scheduling-your-send)\n- [BCC Behavior](#bcc-behavior)\n- [Substitution Tags](#substitution-tags)\n- [Suppression Groups](#suppression-groups)\n- [Categories](#categories)\n- [Unique Arguments](#unique-arguments)\n- [SMTP Filters](#smtp-filters)\n- [IP Pools](#ip-pools)\n\n### Scheduling Your Send\n\nSchedule your email send time using the `send_at` parameter within your X-SMTPAPI header. Set the value of `send_at` formatted as a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time).\n\n```json\n{\n  \"send_at\": 1409348513\n}\n```\n\nFor more information, see our [scheduling parameters documentation]({{root_url}}/for-developers/sending-email/scheduling-parameters/).\n\n### BCC behavior\n\nIt is possible to simulate blind carbon copy (BCC) behavior using SMTP with or without the X-SMTPAPI header. The concept of BCC exists outside of SMTP as defined by [RFC 5321](https://tools.ietf.org/html/rfc5321).\n\nWhen sending email with SMTP, all recipients are listed using SMTP's RCPT (recipient) command. In addition to the sender, which is set with SMTP's MAIL command, these RCPT addresses can be thought of as part of the message envelope—they instruct sending email servers where to deliver the message. These addresses are not designated as carbon copy (CC), BCC, or another type of recipient—they are all just recipients.\n\nThe SMTP DATA command follows the MAIL and RCPT commands in an SMTP transaction. The DATA command allows you to insert message headers, which can be thought of as portions of the email body or the text inside the _envelope_. The DATA command is what allows you to create BCC behavior using SMTP without the X-SMTPAPI.\n\n#### BCC without the X-SMTPAPI header\n\nThe following code shows an example of an SMTP transaction with BCC behavior. How this example achieves BCC behavior is explained following the example.\n\n```shell\n235 Authentication successful\nMAIL FROM:tiramisu@example.com\n250 Sender address accepted\nRCPT TO:person1@sendgrid.com\n250 Recipient address accepted\nRCPT TO:person2@sendgrid.com\n250 Recipient address accepted\nDATA\n354 Continue\nFrom: \"Tira Misu\" <tiramisu@example.com>\nTo: <person1@sendgrid.com>\nSubject: Test message subject\nThis is the test message body.\n.\n250 Ok: queued as Yo60h6C5ScGPeP5fUWU3Kw\n```\n\nNotice that there are two recipients designated by RCPT commands, \"person1@sendgrid.com\" and \"person2@sendgrid.com.\" These addresses are both part of the message envelope.\n\nIn the DATA command, there is also a \"To\" header. This header lists only \"person1@sendgrid.com.\" This is where differentiating between the envelop \"To\" (RCPT TO) and header \"To\" becomes important. The header \"To\" set in the DATA command does not tell the sending email server to deliver the message to any address, only the RCPT or envelop \"To\" does this. The header \"To\" instead provides recipients with a friendly display of any addresses included in the \"To\" header.\n\nTo achieve BCC behavior, you can deliver a message to a recipient by adding them in a RCPT but omit their address from the header \"To\". The message will be delivered to each RCPT address, but only the addresses listed in the header \"To\" will be visible to other recipients.\n\nIn the previous code sample, \"person2@sendgrid.com\" will be treated like a BCC address because that address is not included in the header \"To.\" The \"person1@sendgrid.com\" is listed in the header \"To\" and will therefore be visible to other recipients of the message. This means both recipients receive the message, but recipient2@sendgrid.com is not visible to recipient1@sendgrid.com while recipient1@sendgrid.com is visible to recipient2@sendgrid.com.\n\nBy omitting any addresses from the header \"To,\" you will be hiding them from the other recipients and therefore treating them like BCC recipients.\n\n#### BCC with the X-SMTPAPI\n\nThe following code shows an example of an SMTP transaction with BCC behavior using the X-SMTPAPI header. How this example achieves BCC behavior is explained following the example.\n\n```shell\n235 Authentication successful\nMAIL FROM:tiramisu@example.com\n250 Sender address accepted\nRCPT TO:sender@sendgrid.com\n250 Recipient address accepted\nDATA\n354 Continue\nx-smtpapi: {\"to\":[\"person1@sendgrid.com\",\"person2@sendgrid.com\"]}\nFrom: \"Tira Misu\" <tiramisu@example.com>\nSubject: This is a test\nBody of test message.\n.\n250 Ok: queued as uKIPst3rQtCl_hLVB9RvEw\n```\n\nUsing the X-SMTPAPI header achieves BCC behavior in a slightly different way than by omitting addresses from a \"To\" header. The X-SMTPAPI header's \"to\" field allows you to set multiple recipients in a JSON array.\n\n```json\n{\n  \"to\": [\"person1@sendgrid.com\", \"person2@sendgrid.com\"]\n}\n```\n\nWhen SendGrid receives the message and parses the X-SMTPAPI header, it will treat each recipient address in the X-SMTPAPI \"to\" field as a separate RCTP TO or _envelope_ address. This means each recipient will receive the same DATA content, but with an added friendly display \"to\" header set to its own address. A single recipient in the X-SMTPAPI \"to\" field in the previous code sample will eventually look something like the following example.\n\n```shell\n235 Authentication successful\nMAIL FROM:test@example.com\n250 Sender address accepted\nRCPT TO:person1@sendgrid.com\n250 Recipient address accepted\n```\n\nThe addresses in the X-SMTPAPI \"to\" field are not duplicated in a header \"To,\" for all recipients. Only the individual recipient is included in the header \"To\" for each messages (Each recipient sees only their own address). The additional recipients will therefore not be visible to each recipient of the message.\n\n### Substitution Tags\n\nSubstitution tags allow you to dynamically insert specific content relevant to each of your recipients, such as their first and last names.\n\nFor example, to use a substitution tag to replace the first name of your recipient, insert the tag {{name}} in the HTML of your message:\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello {{name}},<br />\n      The body of your email would go here...\n    </p>\n  </body>\n</html>\n```\n\nTo define the value that will replace the {{name}} tag, define the following in your X-SMTPAPI header:\n\n```json\n{\n  \"to\": [\"john.doe@example.com\", \"jan.doe@example.com\"],\n  \"sub\": {\n    \"{{name}}\": [\"John\", \"Jane\"]\n  }\n}\n```\n\nFor more information, see our [substitution tags documentation]({{root_url}}/for-developers/sending-email/substitution-tags/).\n\n### Section Tags\n\n<call-out type=\"warning\">\n\nThis feature has been deprecated.\n\n</call-out>\n\nSection tags are similar to substitution tags, but rather than replace tags with content for each recipient; section tags allow you to replace a tag with more generic content— like a salutation.\n\nFor more information, see our [section tags documentation]({{root_url}}/for-developers/sending-email/section-tags/).\n\n### Suppression Groups\n\nYou can easily specify an unsubscribe group for an email sent via SMTP by including the `asm_group_id` parameter in your X-SMTPAPI header. Simply set the value of `asm_group_id` to the numerical ID of the group you would like to use.\n\n```json\n{\n  \"asm_group_id\": 1\n}\n```\n\nFor more information, see our [suppression groups documentation]({{root_url}}/for-developers/sending-email/suppressions/).\n\n### Categories\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nCategories allow you to track your emails according to broad topics that you define, like \"Weekly Newsletter\" or \"Confirmation Email\". Simply define the category by using the `category` parameter within your X-SMTPAPI header:\n\n```json\n{\n  \"category\": \"Example Category\"\n}\n```\n\nFor more information, see our [categories documentation]({{root_url}}/for-developers/sending-email/categories/).\n\n<call-out>\n\nCategories should only be used for broad topics. To attach unique identifiers, please use [unique arguments]({{root_url}}/for-developers/sending-email/unique-arguments/).\n\n</call-out>\n\n### Unique Arguments\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nUse unique arguments to track your emails based on specific identifiers unique to individual messages. Unique arguments can be retrieved via SendGrid's [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) or your [email activity page]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/).\n\nFor more information, see our [unique arguments documentation]({{root_url}}/for-developers/sending-email/unique-arguments/).\n\n### SMTP Filters\n\nSMTP Filters can be used for turning on or off a number of different features for your sending. For example, you can turn on open or click tracking on a per-send basis.\n\nFor more information, see our [SMTP Filters documentation]({{root_url}}/for-developers/sending-email/smtp-filters/).\n\n### IP Pools\n\nIP Pools can be used to send you mail over a specific group of IPs. It is common to create different pools for transactional and marketing email.\n\nFor more information, see our [IP Pools documentation](https://sendgrid.api-docs.io/v3.0/ip-pools).\n\n```json\n{\n  \"ip_pool\": \"pool_name\"\n}\n```\n\n## Additional Resources\n\n- [How to send email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n- [Getting started with the API]({{root_url}}/api-reference/)\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/cakephp.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: CakePHP\nseo:\n  title: Send Email with CakePHP & SendGrid\n  description: View instructions on how to easily send email with CakePHP using SendGrid, by setting up your views and controller.\nnavigation:\n  show: true\n---\n\nCakePHP comes with an email library that already supports SMTP. [For more information check out the CakePHP documentation page](http://book.cakephp.org/2.0/en/core-utility-libraries/email.html#configuration). This example shows how to send an email with both HTML and text bodies.\n\nIn **app/views/layouts/** you need to define the layout of your text and HTML emails:\n\n```\nemail/\nhtml/\ndefault.ctp\ntext/\ndefault.ctp\n```\n\nIn **app/views/layouts/email/text/default.ctp** add:\n\n``` php\n<!--?php echo $content_for_layout; ?-->\n```\n\n and in **app/views/layouts/email/html/default.ctp** add:\n\n``` php\n<!--?php echo $content_for_layout; ?-->\n```\n\n Then create the template for your emails. In this example we created templates for a registration email with the following structure: \n\n```\napp/\nviews/\nelements/\nemail/\ntext/\nregistration.ctp\nhtml/\nregistration.ctp\n```\n\nIn **app/views/elements/email/text/registration.ctp** add:\n\n``` php\nDear <!--?php echo $name ?-->,\nThank you for registering. Please go to http://domain.com to finish your registration.\n```\n\n and in **app/views/layouts/email/html/default.ctp** add:\n\n``` php\nDear <!--?php echo $name ?-->,\nThank you for registering. Please go to <a href=\"http://domain.com\">here</a> to finish your registration.\n```\n\n In your controller enable the email component:\n\n``` php\n<!--?php var $components = array('Email'); ?-->\n```\n\n Then anywhere in your controller you can do something like the following to send an email: \n(make sure to replace your own sendgrid_username / sendgrid_api_key details, better to make them constant)\n\n``` php\n<?php\n$this->Email->smtpOptions = array(\n  'port'=>'587',\n  'timeout'=>'30',\n  'host' => 'smtp.sendgrid.net',\n  'username'=>'sendgrid_username',\n  'api_key'=>'sendgrid_api_key',\n  'client' => 'yourdomain.com'\n);\n\n$this->Email->delivery = 'smtp';\n$this->Email->from = 'Your Name ';\n$this->Email->to = 'Recipient Name ';\n$this->set('name', 'Recipient Name');\n$this->Email->subject = 'This is a subject';\n$this->Email->template = 'registration';\n$this->Email->sendAs = 'both';\n$this->Email->send();\n?>\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/categories.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Categories\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nYou can add [categories]({{root_url}}/glossary/categories/) to the X-SMTPAPI header of the emails you send via SendGrid. This will allow you to track emails based on your own categorization system.\n\n<call-out type=\"warning\">\n\nCategories must be in 7bit encoding using the US-ASCII character set.\n\n</call-out>\n\n<call-out>\n\nCurrently, there is no limit to the number of categories you can track. However, we recommend _no more than ~100 total unique categories_ as this will increase your ease of use in the Statistics area. Additionally, a high rate of unique categories on your account can negatively impact the rate at which we process the messages you send.\n\n</call-out>\n\n## Example\n\nYou can use SendGrid's [SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/) to add these categories to your email. The following should be added to the email's header:\n\n<call-out type=\"warning\">\n\nWhen passing `category` please make sure to only use strings as shown in our examples. Any other type could result in unintended behavior.\n\n</call-out>\n\n### Example Category Header\n\n```json\n{\n  \"category\": \"Example Category\"\n}\n```\n\nIn this example, SendGrid would associate statistics for the email containing that header with the category **Example Category**.\n\n## Limitations\n\nYou can assign up to 10 categories per message:\n\n```json\n{\n  \"category\": [\"dogs\", \"animals\", \"pets\", \"mammals\"]\n}\n```\n\n<call-out type=\"warning\">\n\nCategories should be used to group messages together by broad topic. If you need to attach unique data or identifiers to a message, use [Unique Arguments]({{root_url}}/for-developers/sending-email/unique-arguments/) instead.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/cloud-rail.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Using CloudRail to integrate SendGrid into your application\ngroup: plugins\nnavigation:\n  show: true\n---\n\nCloudRail is an API integration platform that has a set of free software libraries which abstract multiple external APIs from different providers, SendGrid among them, into a single and universal interface.\nThis makes it easy to integrate many of them in your application.\nAbstract means that, for example, upload() works in exactly the same way for Dropbox as it does for Google Drive, OneDrive, and other Cloud Storage Services, and getEmail() works similarly the same way across all social networks.\n\nIn this tutorial, the integration of the Android SDK into an application is demonstrated with Android Java code.\nGradle is used as the build tool (Android Studio standard).\nHead to the [Website](https://cloudrail.com/) for all the details about CloudRail and instructions for other platforms.\n\n## \tSetup\n \t\nThe easiest way to integrate CloudRail for Android is via Maven.\nIt suffices to add the following to your build.gradle:\n\n```java\ndependencies {\n    compile 'com.cloudrail:cloudrail-si-android:2.6.5'\n}\n```\n\n## \tSend a simple email\n\nAfter setup, sending an email with SendGrid is a breeze.\nJust add code like the one below:\n\n```java\nfinal Email email = new SendGrid(this, \"[API key]\");\n\nnew Thread() {\n    public void run() {\n        email.sendEmail(\n                \"[senderEmail]\",\n                \"[senderName]\",\n                Arrays.asList(\"[toEmail]\"),\n                \"I'm the subject\",\n                \"I'm a text body\",\n                \"<p>I'm an HTML body</p>\",\n                Arrays.asList(\"[ccAddress0]\", \"[ccAddress1]\"),\n                Arrays.asList(\"[bccAddress]\")\n        );\n    }\n}.start();\n```\n\n## \tSend a personalized email\n\nSince you've already integrated CloudRail SI, why not make use of some of the other APIs that come with it?\nLet's use Facebook to get a user's info to personalize the email:\n\n```java\nfinal Email email = new SendGrid(this, \"[API key]\");\nfinal Profile profile = new Facebook(this, \"[Client ID]\", \"[Client Secret]\");\n\nnew Thread() {\n    public void run() {\n        String userFullName = profile.getFullName(); // Implicitly triggers login\n        String userEmail = profile.getEmail();\n        email.sendEmail(\n                \"[senderEmail]\",\n                \"[senderName]\",\n                Arrays.asList(userEmail),\n                \"Hello \" + userFullName + \", I'm the subject\",\n                \"I'm a text body\",\n                \"<p>I'm an HTML body</p>\",\n                Arrays.asList(\"[ccAddress0]\", \"[ccAddress1]\"),\n                Arrays.asList(\"[bccAddress]\")\n        );\n    }\n}.start();\n```\n\nThe code above assumes that \"this\" points to a Context (an Activity, for example, is a Context) and that you are registered as a developer with the services used (and thus possess the needed credentials).\nYou can find more information about the functionalities and the services in the [Documentation](https://github.com/CloudRail/cloudrail-si-android-sdk/wiki).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/codeigniter.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: CodeIgniter\nseo:\n  title: Send Email with CodeIgniter & SendGrid\n  description: View instructions on how to easily send email with CodeIgniter using SendGrid, by setting up setting up CodeIgniter's built in mail library.\nnavigation:\n  show: true\n---\n\nCodeIgniter comes with an email sending library built in. See more information on how to [use CodeIgniter with SendGrid](https://www.codeigniter.com/user_guide/libraries/email.html#using-the-email-library).\n\n<call-out>\n\nIt is important to use the correct end of lines using \"crlf\" =\\> \"\\\\r\\\\n\" and \"newline\" =\\> \"\\\\r\\\\n\".\n\n</call-out>\n\n``` php\n<?php\n$this->load->library('email');\n\n$this->email->initialize(array(\n  'protocol' => 'smtp',\n  'smtp_host' => 'smtp.sendgrid.net',\n  'smtp_user' => 'apikey',\n  'smtp_pass' => 'sendgridapikey',\n  'smtp_port' => 587,\n  'crlf' => \"\\r\\n\",\n  'newline' => \"\\r\\n\"\n));\n\n$this->email->from('your@example.com', 'Your Name');\n$this->email->to('someoneexampexample@example.com');\n$this->email->cc('another@another-example.com');\n$this->email->bcc('them@their-example.com');\n$this->email->subject('Email Test');\n$this->email->message('Testing the email class.');\n$this->email->send();\n\necho $this->email->print_debugger();\n?>\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/cors.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Cross Origin Resource Sharing (CORS)\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Cross Origin Resource Sharing (CORS)\n  description: CORS is a security feature of modern browsers to keep browser users secure.\n  keywords: API, API Key, CORS, cross origin resource sharing\n---\n\nCross-Origin Resource Sharing is a security feature of modern browsers that keeps browser users secure. It prevents malicious activity like cross-site scripting.\nCORS implements headers in the response of any request to the server to say what domains are allowed to make specific types of calls to that server. In SendGrid's case, we do not allow our customers to make a browser-based call to our v3/mail/send endpoint.\n\n## \tBrowser-Only Applications\n\nWhen you have a browser-only application that reaches out to APIs, the API key has to be embedded in the application. Anyone with access to a browser-only application can access all of the Javascript source code, including your API keys.\n\nMaking your API key publicly accessible could result in anyone authenticating API calls with your API key — this is a significant security concern both for you and SendGrid.\n\n## \tWorkarounds\n\nYou can create a server-based application, which will protect your API keys from being released to the world. Languages like [NodeJS](https://github.com/sendgrid/sendgrid-nodejs), [PHP](https://github.com/sendgrid/sendgrid-php), [Ruby](https://github.com/sendgrid/sendgrid-ruby), [Python](https://github.com/sendgrid/sendgrid-python), [C#](https://github.com/sendgrid/sendgrid-csharp), [Go](https://github.com/sendgrid/sendgrid-go), and [Java](https://github.com/sendgrid/sendgrid-java), and others can be implemented to make calls to the API from the security of a locked down server environment.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/curl-examples.md",
    "content": "---\nseo:\n  title: cURL Examples for Common Use Cases\n  description:\n  keywords: cURL, v3 mail send\ntitle: cURL Examples for Common Use Cases\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nBelow are some cURL examples for several basic use cases to get you sending email through SendGrid's v3 Mail Send endpoint right away!\n\n## Hello, World!\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\": \"Hello, World!\",\"content\": [{\"type\": \"text/plain\", \"value\": \"Heya!\"}]}'\n```\n\n## Sending a Basic Email to Multiple Recipients\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}],\"cc\": [{\"email\":\"recipient2@example.com\"}, {\"email\": \"recipient3@example.com\"}, {\"email\":\"recipient4@example.com\"}]}], \"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\":\"Hello, World!\", \"content\": [{\"type\": \"text/plain\", \"value\": \"Heya!\"}]}'\n```\n\n## Sending a Basic Email Using a Template\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\":\"Hello, World!\",\"content\": [{\"type\": \"text/plain\",\"value\": \"Heya!\"}], \"template_id\" : \"YOUR_TEMPLATE_ID\"}'\n```\n\n## Sending a Basic Email with Attachment\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sender@example.com\"},\"subject\":\"Hello, World!\",\"content\": [{\"type\": \"text/html\",\"value\": \"Hey,<br>Please find attachment.\"}], \"attachments\": [{\"content\": \"BASE64_ENCODED_CONTENT\", \"type\": \"text/plain\", \"filename\": \"attachment.txt\"}]}'\n```\n\n## Sending a Basic Email at a Scheduled Time\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\":\"Hello, World!\",\"content\": [{\"type\": \"text/plain\",\"value\": \"Heya!\"}], \"send_at\" : UNIX_TIMESTAMP_HERE}'\n```\n\n## Scheduling and Cancelling an Email\n\nYou may schedule an email to be sent up to 72 hours in the future by using the `send_at` parameter. You may cancel this same scheduled email by using the [Cancel Scheduled Sends endpoint](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends).\n\n**Step 1: Generate a batch ID**\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/batch \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n```\n\n**Step 2: Schedule the email to be sent, using your new batch ID**\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/mail/send \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\":\"Hello, World!\",\"content\": [{\"type\": \"text/plain\",\"value\": \"Heya!\"}], \"send_at\" : UNIX_TIMESTAMP_HERE, \"batch_id\" : \"YOUR_BATCH_ID\"}'\n```\n\n**Step 3: Cancel the scheduled email**\n\n```bash\ncurl --request POST \\\n  --url https://api.sendgrid.com/v3/user/scheduled_sends \\\n  --header 'authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"batch_id\":\"YOUR_BATCH_ID\",\"status\":\"cancel\"}'\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/django.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Django\nseo:\n  title: Send SMTP Email with Django\n  description: View instructions on how to easily send email with Django using SendGrid, by setting up setting up Django's built in mail library.\nnavigation:\n  show: true\n---\n\nThere is more detailed information about sending email over SMTP with Django on the [Django project website](https://docs.djangoproject.com/en/dev/topics/email/).\n\nFirst start by adding the following to **settings.py:**\n\n```python\nSENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY')\n\nEMAIL_HOST = 'smtp.sendgrid.net'\nEMAIL_HOST_USER = 'apikey' # this is exactly the value 'apikey'\nEMAIL_HOST_PASSWORD = SENDGRID_API_KEY\nEMAIL_PORT = 587\nEMAIL_USE_TLS = True\n```\n\nThen to send email you can do the following:\nInside yourapp.views.py\n\n```python\nfrom django.core.mail import send_mail\nsend_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)\n```\n\n<call-out>\n\nYou may also send emails with Django by using the [django-sendgrid-v5](https://github.com/sklarsa/django-sendgrid-v5) library, which utilizes the [Web API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) instead of SMTP as the transport mechanism.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/drupal.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Drupal\ngroup: plugins\nnavigation:\n  show: true\n---\nTo send emails from Drupal using SendGrid, you may use the SendGrid Integration module, the SMTP Authentication Support module, the Swift Mailer module, or the PHPMailer SMTP Module depending on your needs.\n\n## \tUsing the SendGrid Integration Module\n\nThe SendGrid Integration Module uses the SendGrid API web services to send email. It does not use SMTP. Depending on the workload of your website, this could be of benefit to you in performance. This module also provides charts for reports of vital statistics. The module does require an advanced knowledge of Drupal in order to install and setup. Usage of Drush is required.\n\nDownload and install the [SendGrid Integration Module](https://www.drupal.org/project/sendgrid_integration \"SendGrid Integration Module\") from Drupal.org and perform updates via Drush with Composer Manager.\n\nOnce installed access `admin/config/services/sendgrid` to configure your API credentials.\n\nFor detailed instructions, please refer to the [module documentation](http://cgit.drupalcode.org/sendgrid_integration/tree/README.md).\n\n\n## \tUsing the SMTP Authentication Support Module\n\nTo use SendGrid with [Drupal](https://www.drupal.org/ \"Drupal\"), use the [SMTP Authentication Support module](https://www.drupal.org/project/smtp \"SMTP Authentication Support\"). Install a version of this module that is compatible with your version of Drupal.\n\n![]({{root_url}}/images/drupal_1.png \"SMTP Module\")\n\nOpen your modules page, find the SMTP module, and configure it with the following settings:\n\n-   **SMTP Server** - smtp.sendgrid.net\n-   **SMTP Port** - 587\n-   **Use Encrypted Protocol** - No. If you want encryption choose \"Use SSL\" and set SMTP Port to 465\n-   **Username** - SendGrid Username: \"apikey\"\n-   **Password** - SendGrid API Key\n\n![]({{root_url}}/images/drupal_2.png \"SMTP Module Configuration\")\n\n## \tUsing the Swift Mailer Module\n\nTo use the [Swift Mailer module](https://www.drupal.org/project/swiftmailer \"Swift Mailer Module\"), install a version of this module that is compatible with your version of Drupal.\n\nConfiguration for this module is largely the same as above.\n\n![]({{root_url}}/images/drupal_3.png \"SMTP Module Configuration\")\n\n## \tUsing the PHPMailer SMTP Module\n\nPHPMailer SMTP sends email via SMTP using the latest PHPMailer library and is RFC-compliant. It requires the [Mail System](https://www.drupal.org/project/mailsystem \"Mail System\") module.  See the [project page](https://www.drupal.org/project/phpmailer_smtp \"PHPMailer SMTP\") for more details.\n\nInstall using composer and enable.\n\n`composer require drupal/phpmailer_smtp`\n\nOnce installed access `admin/config/system/phpmailer-smtp` to configure the module.\n\n-   **Primary SMTP server** - smtp.sendgrid.net\n-   **SMTP port** - 587\n-   **Use Secure Protocol** - TLS\n\nUnder **SMTP Authentication**, set your username and password (API key):\n\n-   **Username** - SendGrid Username: \"apikey\"\n-   **Password** - SendGrid API Key\n\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/enforced-tls.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Enforced TLS\ngroup: sending-email\nnavigation:\n  show: true\n---\n\nThe Enforced TLS settings specify whether or not the recipient is required to support TLS or have a valid certificate. The Enforced TLS endpoint supports retrieving and updating TLS settings.\n\n<call-out type=\"warning\">\n\nIf either `require_tls` or `require_valid_cert` is set to `true`, the recipient must support TLS 1.1 or higher or have a valid certificate. If these conditions are not met, we drop the message and send a block event with “TLS required but not supported” as the description.\n\n</call-out>\n\n## GET\n\nGet the current Enforced TLS settings.\n\n#### Request URL\n\n`GET https://api.sendgrid.com/v3/user/settings/enforced_tls HTTP/1.1`\n\n#### Response\n\n```javascript\nHTTP/1.1 200\n{\n    \"require_tls\": true,\n    \"require_valid_cert\": false\n}\n```\n\n## PATCH \n\nChange the Enforced TLS settings\n\n<table class=\"table\" style=\"table-layout:fixed\">\n  <thead>\n    <tr>\n      <th>\n        URI Parameter\n      </th>\n      <th>\n        Required\n      </th>\n      <th>\n        Requirements\n      </th>\n      <th>\n        Description\n      </th>\n    </tr>\n    <tr>\n      <td>\n        require_tls\n      </td>\n      <td>\n        False\n      </td>\n      <td>\n        true or false\n      </td>\n      <td>\n        Require recipient TLS support\n      </td>\n    </tr>\n    <tr>\n      <td>\n        require_valid_cert\n      </td>\n      <td>\n        False\n      </td>\n      <td>\n        true or false\n      </td>\n      <td>\n        Require certificates to be valid\n      </td>\n    </tr>\n  </thead>\n</table>\n\n#### Request URL\n\n`PATCH https://api.sendgrid.com/v3/user/settings/enforced_tls HTTP/1.1`\n\n#### Request Body\n\n```javascript\n{\n  \"require_tls\": true\n}\n```\n\n#### Response\n\n```javascript\nHTTP/1.1 200\n{\n    \"require_tls\": true,\n    \"require_valid_cert\": false\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/exchange-2010.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Exchange 2010\ngroup: mail-servers\nnavigation:\n  show: true\n---\n\nIf your organization is using Microsoft's Exchange 2010 for email services, this document outlines the basics required in order to use SendGrid for SMTP. This requires the configuration of a send connector in the Exchange Management Console.\n\n<call-out type=\"warning\">\n\nThis documentation assumes that you already have a working installation of Exchange 2010 that is configured for client access and is able to send messages to the public internet. **If you do not configure this connector correctly it may result in the unintended delivery of messages through your SendGrid account, resulting in the consumption of account emails.**\n\n</call-out>\n\n<call-out>\n\n[For more information regarding Send Connectors, check out this swank TechNet documentation on the subject](http://technet.microsoft.com/en-us/library/aa998662.aspx).\n\n</call-out>\n\nThe configuration of a new send connector is straightforward. It is the associated configurations that you may require in order to properly control access to the connector that may be complicated. Let's start with just sending email through SendGrid:\n\n1. Log in to your Exchange server or a server that has the Exchange Management Console installed for administrative purposes.\n2. Go to **Start \\> All Programs \\> Microsoft Exchange Server 2010** and click on the **Exchange Management Console** item.\n3. Roll open the **Organization Configuration** list and select **Hub Transport**.\n4. Click on **New Send Connector** in the Actions sidebar.\n5. Name the Send Connector whatever you like and select Internet for the Intended Use pull-down. This allows for the integration with an authenticated SmartHost and adds the default send permissions required by Exchange 2010 to route messages through an external host that is not a part of the domain forest.\n6. Click **Next**.\n7. Click Add and specify the allowed address space to which the connector can send messages. If you want to send to anyone on the internet, then you would insert a \"\\*\" in the Address field. If you want to send only to a specific domain, enter that domain. If you want to allow all sub-domains you can check the box, but I prefer to notate that literally like so: \\*.SAMPLEDOMAIN.COM. Insert a high cost (100 is the top, so choose wisely) so that the connector is not used inadvertently.\n8. Click **Next**.\n9. On the Network Settings page, select the **Route mail through the following smart hosts** item.\n10. Click **Add**.\n11. Select the **Fully qualified domain name (FQDN)** item, and enter: *smtp.sendgrid.net*\n12. Click **Next**.\n13. In the **Configure smart host authentication settings** page, select the **Basic Authentication** option and check the **Basic Authentication over TLS** checkbox.\n14. Enter `apikey` as your username and your SendGrid [API key]({{root_url}}/ui/account-and-settings/api-keys/) as the password to authenticate. \n15. Click **Next**.\n15. If you only have one Exchange server, it should automatically appear. If you want to use another server(s) in your domain click Add to locate the servers you want to allocate to this connector.\n16. Click **Next**.\n17. Verify your settings and, when satisfied, click **New**.\n18. If the configuration completes correctly, you will receive positive notification. You can then click on **Finish**.\n\nOnce you have completed installation of the connector, you will need to configure your server(s) to allow limited access to the new send connector. You can read more about [Send Connector permissions][send-connector-permissions].\n\n[send-connector-permissions]: https://docs.microsoft.com/en-us/previous-versions/office/exchange-server-2010/aa998662(v=exchg.141)#send-connector-permissions\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/exim.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Exim 4\ngroup: mail-servers\nnavigation:\n  show: true\nseo:\n  title: Exim 4 configuration for SendGrid\n  keywords: Exim Internet Mailer, Exim, Exim, and SendGrid\n  description: Configuration information for Exim 4 and SendGrid.\n---\n\n<call-out type=\"warning\">\n\nVersions of Exim prior to the current major release are considered obsolete. If you are using Exim 3.x or earlier it is suggested by the Exim development team that you upgrade to the current release.\n\n</call-out>\n\nThe following configuration file, which can be found at **/etc/exim4/update-exim4.conf.conf**, was pulled from Ubuntu Server 10.4 and is for example purposes only:\n\n```bash\ndc_eximconfig_configtype='smarthost'\ndc_other_hostnames=''\ndc_local_interfaces='127.0.0.1'\ndc_readhost='your.server.name'\ndc_relay_domains=''\ndc_minimaldns='false'\ndc_relay_nets=''\ndc_smarthost='smtp.sendgrid.net::587'\nCFILEMODE='644'\ndc_use_split_config='false'\ndc_hide_mailname='true'\ndc_mailname_in_oh='true'\n```\n\nEnable TLS support in **/etc/exim4/exim4.conf.localmacros**.\n\n<call-out>\n\nIf this file does not exist, you will need to create it:\n\n</call-out>\n\n```bash\nMAIN_TLS_ENABLE = 1\n```\n\nEnter credentials that will allow Exim to access SendGrid in **/etc/exim4/passwd.client**:\n\n<call-out>\n\nNote that you must use an API key to authenticate. Do this by setting your username to 'apikey' and your password to your API key's actual value (the string provided by Twilio SendGrid when you created the key).\n\n</call-out>\n\n```bash\n*:apikey:<YourAPIKey>\n```\n\nOnce you have completed and saved all changes to Exim's configuration files, you will need to restart it to activate those changes:\n\n```bash\n$ /etc/init.d/exim4 restart\n```\n\n## cPanel\n\nIf you are using cPanel with Exim and want to relay your email through SendGrid, go to **Main \\> Service Configuration \\> Exim Configuration Editor**, click on the Advanced Editor button, and enter the following in the **AUTH** Box:\n\n```bash\nbegin authenticators\n\nsendgrid_login:\n  driver = plaintext\n  public_name = LOGIN\n  client_send = : apikey : <YourAPIKey>\n```\n\n<call-out>\n\nOnly include \"begin authenticators\" if it's not already in the configuration.\n\n</call-out>\n\nAdd a route in the **Router Configuration** Box:\n\n```bash\nsend_via_sendgrid:\n  driver = manualroute\n  domains = ! +local_domains\n  transport = sendgrid_smtp\n  route_list = \"* smtp.sendgrid.net::587 byname\"\n  host_find_failed = defer\n  no_more\n```\n\nAdd a transport to the **Transport Configuration** Box:\n\n```bash\nsendgrid_smtp:\n  driver = smtp\n  hosts = smtp.sendgrid.net\n  hosts_require_auth = <; $host_address\n  hosts_require_tls = <; $host_address\n```\n\nOnce you have completed and saved all changes to Exim's configuration files, you will need to restart it to activate those changes:\n\n```bash\n$ /etc/init.d/exim4 restart\n```\n\n## Exim Documentation\n\nIf your version of Exim does not match the version above or you are not finding the answer you need, please check out the Official [Exim Documentation](http://www.exim.org/docs.html) for more information.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/formio.md",
    "content": "---\nseo:\n  title: Form.io Integration\n  description: How to integrate Form.io with SendGrid.\n  keywords: Form.io, integrate\ntitle: Building Serverless Apps with Form.io + SendGrid\ngroup: partners\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\n[Form.io](https://form.io) is a combined form and data management API platform created for developers who are building \"Serverless\" form-based applications. Form.io provides an easy drag-and-drop form builder workflow, allowing you to build complex forms for enterprise applications quickly and easily. These forms are then embedded directly into your application with a single line of code that dynamically renders the form (using Angular or React) in your app while at the same time generating the RESTful API to support those forms. The Form.io platform also offers numerous 3rd-party services that are fully integrated into the form building process, allowing you to extend the power and capability of your apps while saving time and effort.\n\nForm.io has recently announced the integration of SendGrid’s API into their list of standard “Form Actions”, allowing you to extend your SendGrid email capabilities further into your apps by automatically triggering emails through your SendGrid account when forms are submitted within your application.\n\n![Form.io SendGrid integration]({{root_url}}/images/formio-sendgrid.png \"Form.io SendGrid Integration\")\n\nThis step-by-step guide will show how to set up a SendGrid integration within the Form.io platform.\n\n## \tCreate your first Form.io project\n\nTo get started, you will first need to create an account at [Form.io](https://portal.form.io). Once you have an account, you can quickly bootstrap an already working application by clicking on one of the provided templates on the home screen. These are not simple form templates, but rather fully functional applications complete with Data Resources, Forms, Actions, and User Roles/Permissions. For more on how these items function within Form.io, feel free to read through our [User Guide](https://help.form.io/userguide/) or view our [Video Tutorials](https://help.form.io/tutorials/videos/#welcome).\n\n![Form.io Home Page]({{root_url}}/images/formio-home.png \"Form.io Home Page\")\n\nOnce you have a project created, you can now view the project live within the Preview tab of the project portal.\n\n## \tConfigure your project\n\nOnce you have a Form.io project, the next step is to create an **API Key** within your SendGrid account (under **Settings | API Keys**). Ensure that the API Key you create has **Full Access** for the **Mail Send** permission. Once you have your API Key, go back to your Form.io project and follow these steps.\n\n1. Click the **Project Settings** button located at the top right of your screen.\n1. Click the **Email Providers** tab on the left and then the **SendGrid Settings** tab.\n1. Input the *SendGrid API Key* provided to you when the API key was created.\n1. **Save** your settings.\n\n![Form.io SendGrid Settings]({{root_url}}/images/formio-settings.png \"Form.io SendGrid Settings\")\n\n## \tAdding an email action\n\nNow that you have your project configured to send emails through SendGrid, the next step is to add an email action to any form within your project. A good use case for this would be to send an email anytime someone registers for your application. To achieve this capability, please follow the following steps.\n\n 1. Click on the **Resources** tab within your project.\n 1. Next, click on the **Actions** button on the **User** resource.\n 1. Now select the **Email** action, and then press the **+ Add Action** button.\n\n   ![Add Email Action]({{root_url}}/images/formio-add-email.png \"Form.io Add Email Action\")\n\n 4. Now on the email settings page, select **SendGrid** for the **Transport** of the action.\n 5. Input a **From** email address you would like to send the email from.\n 1. Input a **To** email address you would like to send the email to. For this, you can use handlebar notation, such as ```{{ data.user }}```, to access the data from the submission as you see in the following image.\n 1. Input a **Subject** for the message being sent.\n 1. Input a **Message** for the message being sent.\n\n   ![Email Action Settings]({{root_url}}/images/formio-email-action.png \"Form.io Email Action Settings\")\n\n 9. **Save** the action.\n\nWith this step complete, every user who registers for this application will receive your email which was sent through the SendGrid platform.\n\n## \tDeploy your serverless application!\n\nNow that your project is configured for SendGrid, you can deploy it in a number of different ways including [GitHub Pages](https://pages.github.com/), [Apache Cordova](https://cordova.apache.org/), [Electron](http://electron.atom.io/), etc. You can also preview your application by clicking on the Preview tab of your project. Since this application is \"serverless\" it can be hosted in a wide range of places and immediately connect your forms with SendGrid!\n\n![Form.io Launch]({{root_url}}/images/formio-launch.png \"Form.io Launch\")\n\nIf you have any questions on the Form.io integration, please feel free to [Contact Form.io Support](https://form.io/#contact).\n\nThanks and enjoy **SendGrid** and **Form.io**!\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/getting-started-email-activity-api.md",
    "content": "---\nseo:\n  title: Getting Started with the Email Activity Feed API\n  description: Use the Email Activity Feed query language to get started with the Email Activity Feed API.\n  keywords: email activity, query language, email stats, email events\ntitle: Getting Started with the Email Activity Feed API\ngroup: sending-email\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nIn order to gain access to the Email Activity Feed API, you must purchase [additional email activity history](https://app.sendgrid.com/settings/billing/addons/email_activity).\n\n</call-out>\n\nThe API gives you access to query all of your stored messages, to query individual messages, and to download a CSV with data about the stored messages.\n\n## Getting started\n\nStart with this basic query to the Email Activity Feed API (replace `<<your API key>>` with an API key from your account):\n\n```bash\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\nThis returns a list of the 10 most recent emails you've sent. Next, check out some of the common use cases to narrow down your search.\n\n### Encoding queries\n\nAll queries need to be [URL encoded](https://meyerweb.com/eric/tools/dencoder/) and have this format:\n\n`query={query_type}=\"{query_content}\"`\n\nEncoded, this query would look like this:\n\n`query=query_type%3D%22query_content%22`\n\n## Queries for common use cases\n\nHere are some queries for common use cases. For a full list of possible query types, see the [query reference](#query-reference).\n\n### Filter by subject\n\nUse this query to filter by email subject (replace `<<your API key>>` with an API key from your account, and replace <<subject>> with the subject you want to search):\n\n```bash\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=subject%3D<<subject>>' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\nSubject queries have this format:\n\n`subject=\"This is a subject test\"`\n\nEncoded, this query would look like this:\n\n`subject%3D%22This%20is%20a%20subject%20test%22`\n\n### Filter by recipient email\n\nUse this query to filter by a recipient's email: (replace `<<your API key>>` with an API key from your account, and replace <<email>> with the URL encoded recipients email):\n\n```bash\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=to_email%3D%22<<email>>%22' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\nRecipient email queries have this format:\n\n`to_email=\"example@example.com\"`\n\nEncoded, this query would look like this:\n\n`to_email%3D%22example%40example.com%22`\n\n### Filter by bounced emails\n\nUse this query to filter by all bounced emails: (replace `<<your API key>>` with an API key from your account):\n\n```\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bounced%22' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\nSubject queries have this format:\n\n`status=\"bounced\"`\n\nEncoded, this query would look like this:\n\n`status%3D%22bounced%22`\n\n## Creating compound queries\n\nUse [operators and keywords](#keywords-and-operator-reference) to combine queries for a compound query. For example, you could filter for emails between a date range or you could filter for when a specific recipients email is bounced. Here are some common use cases:\n\n### Filter by a recipient email that was bounced\n\nUse this query to filter by a recipient's email and by emails that are bounced: (replace `<<your API key>>` with an API key from your account, and replace <<email>> with the URL encoded recipients email):\n\n```\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bounced%22%20AND%20to_email%3D%22<<email>>%22' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\n### Filter by date range\n\nUse this query to filter to emails between specific dates: (replace `<<your API key>>` with an API key from your account, and replace {start_date} and {end_date} with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`. Encoded, this looks like this: `2018-02-01T00%3A00%3A00.000Z`)\n\n```\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%22{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\n### Filter by a recipient and a date range\n\nUse this query to filter to emails by recipient and between specific dates: (replace `<<your API key>>` with an API key from your account, replace <<start_date>> and <<end_date>> with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`, and replace <<email>> with the URL encoded recipient's email)\n\n```\ncurl --request GET \\\n --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%22{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22AND%20to_email%3D%22<<email>>%22' \\\n --header 'authorization: Bearer <<your API key>>'\n```\n\n## Keywords and Operator reference\n\nThere are several operators and keywords that you can use to build [Compound queries](#creating-compound-queries). Use these operators between query statements. If the character used as the delimiter is found within the string. The escape character is `\\`, which must be escaped with a preceding `\\`. All queries need to be URL encoded.\n\n_This is a full list of accepted operators and keywords:_\n\n- `=`\n- `!=`\n- `<`\n- `>`\n- `<=`\n- `>=`\n- `-` - to\n- `+`\n- `/`\n- `*`\n- `-` - subtraction\n- AND\n- BETWEEN\n- NOT BETWEEN\n- CONTAINS\n- DAY\n- FALSE\n- HOUR\n- IN\n- NOT IN\n- INTERVAL\n- IS\n- IS NOT\n- LIKE\n- NOT LIKE\n- MINUTE\n- MONTH\n- NOT\n- NULL\n- OR\n- SECOND\n- TIMESTAMP\n- TRUE\n- YEAR\n\n## Query reference\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nThis is a full list of basic query types and examples: (replace the data in quotes with the information you want to query, and then URL encode it)\n\n<table class=\"table\" style=\"table-layout:fixed\">\n <tr>\n   <th><b>Query</b></th>\n   <th><b>Unencoded example</b></th>\n </tr>\n <tr>\n   <td><code>msg_id</code></td>\n   <td><code>msg_id=\"filter0307p1las1-16816-5A023E36-1.0\"</code></td>\n </tr>\n <tr>\n   <td><code>from_email</code></td>\n   <td><code>from_email=\"testing@sendgrid.net\"</code></td>\n </tr>\n <tr>\n   <td><code>subject</code></td>\n   <td><code>subject=\"This is a subject test\"</code></td>\n </tr>\n <tr>\n   <td><code>to_email</code></td>\n   <td><code>to_email=\"example@example.com\"</code></td>\n </tr>\n <tr>\n   <td><code>status</code></td>\n   <td><code>status=\"processed\"</code></td>\n </tr>\n <tr>\n   <td><code>template_id</code></td>\n   <td><code>template_id=\"8f0d27bc-cf8f-42d3-b951-3990af7d0619\"</code></td>\n </tr>\n <tr>\n   <td><code>template_name</code></td>\n   <td><code>template_name=\"example_template\"</code></td>\n </tr>\n <tr>\n   <td><code>campaign_name</code></td>\n   <td><code>campaign_name=\"example_campaign\"</code></td>\n </tr>\n <tr>\n   <td><code>campaign_id</code></td>\n   <td><code>campaign_id=\"1453849\"</code></td>\n </tr>\n <tr>\n   <td><code>api_key_id</code></td>\n   <td><code>api_key_id=\"SG.xxxxxxxxxxxxxxxx\"</code> (everything before the middle dot in the API key)</td>\n </tr>\n <tr>\n   <td><code>events</code></td>\n   <td><code>(Contains(events,\"processed\"))</code></td>\n </tr>\n <tr>\n   <td><code>categories</code> - custom tags that you create</td>\n   <td><code>(Contains(categories,\"categories_example\"))</code></td>\n </tr>\n <tr>\n   <td><code>unique_args</code> - custom tracking arguments that you can attach to SMTP API calls</td>\n   <td><code>unique_args=\"example argument\"</code></td>\n </tr>\n <tr>\n   <td><code>outbound_ip</code> - this is the SendGrid dedicated IP address used to send the email</td>\n   <td><code>outbound_ip=\"4.77.777.77\"</code></td>\n </tr>\n <tr>\n   <td><code>last_event_time</code></td>\n   <td><code>last_event_time=\"2017-11-07T23:13:58Z\"</code></td>\n </tr>\n <tr>\n   <td><code>clicks</code></td>\n   <td><code>clicks=\"0\"</code></td>\n </tr>\n <tr>\n   <td><code>asm_group_id</code></td>\n   <td><code>asm_group_id=\"1041\"</code></td>\n </tr>\n <tr>\n   <td><code>teammate</code> - teammates username</td>\n   <td><code>teammate=\"my_username\"</code></td>\n </tr>\n</table>\n\n## Additional Resources\n\n- [Email Activity Feed API Reference](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages)\n- [Email Activity Feed UI]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/getting-started-smtp.md",
    "content": "---\r\nseo:\r\n  title: How to Send an SMTP Email\r\n  description: Use Telnet to send your first SMTP email. SendGrid’s SMTP API allows developers to specify custom handling instructions for email using an X-SMTPAPI header inserted into the message.\r\n  keywords: telnet, ports, connection, SMTP, send email, getting started\r\ntitle: How to Send an SMTP Email\r\ngroup: smtp\r\nweight: 960\r\nlayout: page\r\nnavigation:\r\n  show: true\r\n---\r\n\r\nYou can also send email with [the UI]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) and with [the API]({{root_url}}/api-reference/).\r\n\r\n## What is SMTP?\r\n\r\n[Simple Mail Transfer Protocol (SMTP)]({{root_url}}/glossary/smtp/) is a quick and easy way to send email from one server to another. SendGrid provides an SMTP service that allows you to deliver your email via our servers instead of your own client or server. This means you can count on SendGrid's delivery at scale for your SMTP needs.\r\n\r\nSendGrid’s SMTP API also allows you to specify custom email handling instructions using a JSON encoded list called the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/). The X-SMTPAPI header is parsed by SendGrid to modify your message in the ways you specify.\r\n\r\nFor a deeper dive into what SMTP is, the benefits of sending an email with SMTP, and how SendGrid can help, see the [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) on our blog.\r\n\r\n## Sending a test SMTP email with Telnet\r\n\r\nThis page will help you send a first test message using Telnet. Once you complete this process, you will be better prepared to explore and build messages using the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/).\r\n\r\n### Prerequisites\r\n\r\nBe sure to perform the following prerequisites to complete this tutorial.\r\n\r\n1. Sign up for a [SendGrid account](https://signup.sendgrid.com/)\r\n2. Create and store a SendGrid [API key](https://app.sendgrid.com/settings/api_keys) with full access \"Mail Send\" permissions.\r\n3. Verify your [Sender Identity]({{root_url}}/for-developers/sending-email/sender-identity/)\r\n4. Open your terminal, also commonly referred to as a command prompt, or command line. You'll use the terminal to encode your API key and input the commands that initiate a Telnet connection.\r\n\r\n<call-out>\r\n\r\nIn the following code samples, greater than and less than symbol are wrapped around placeholder values (e.g., `<YOUR_API_KEY>`). You should replace the greater than and less than symbols and the text inside them with an actual value. For example, `echo -n '<YOUR_API_KEY>' | openssl base64` will become `echo -n 'SG.someactualkey' | openssl base64` if your API key is `SG.someactualkey`.\r\n\r\nIn some cases you will see two sets of greater than and less than symbols wrapping a placeholder. In this case, one set of greater than and less than symbols is required in the actual value and should not be replaced. For example, `From: \"Example\" <<example@example.com>>` will become `From: \"Example\" <example@example.com>`.\r\n\r\n</call-out>\r\n\r\nOnce you have your terminal open and have saved your API key, you must Base64 encode the API key. Note that it is not secure to put your API key into an external webpage for a conversion, so we recommend using a conversion in your terminal. If you are on Mac or Linux, you can use the pre-installed OpenSSL package to Base64 encode a string with the following command.\r\n\r\n```shell\r\necho -n '<YOUR_API_KEY>' | openssl base64\r\n```\r\n\r\nSave your encoded key for a later. Also, be sure you have not included any newline or whitespace characters by accident. This can happen when copying the encoded key from a shell that line wraps output. SMTP is a line-oriented protocol, and linefeed characters will prevent you from authenticating successfully.\r\n\r\n<call-out type=\"warning\">\r\n\r\nTelnet does not register backspaces correctly, so you must type your commands correctly or copy and paste them from this page.\r\n\r\n</call-out>\r\n\r\n### Send an SMTP email using Telnet:\r\n\r\n<call-out>\r\n\r\nYou may need to install Telnet on your machine. Telnet comes natively on some operating systems; However, recent releases of MacOS no longer include Telnet, and Telnet must be enabled manually on Windows 10.\r\n\r\nYou can install Telnet on MacOS using [Homebrew](https://brew.sh/).\r\n\r\nTo enable Telnet on Windows 10, navigate to **Windows Features** > **Turn Windows Features on or off** from the Windows **Control Panel**. Check the box next to **Telnet Client**, and select **OK**.\r\n\r\n</call-out>\r\n\r\n1. Start a Telnet session by typing the following in the terminal:\r\n\r\n```shell\r\nTELNET smtp.sendgrid.net 25\r\n```\r\n\r\nSendGrid accepts unencrypted and TLS connections on ports **25**, **587**, & **2525**. You can also connect via SSL on port **465**. Many hosting providers and ISPs block port 25 as a default practice. If your Telent session continually times out or will not connect using port 25, it is likely that your ISP or hosting provider is blocking the port. You can contact your host/ISP to find out which ports are open for outgoing SMTP relay. We recommend using port 587 to avoid any rate limiting that your server host may apply.\r\n\r\n2. Once you successfully connect to SendGrid, log in to the server by typing the following:\r\n\r\n```shell\r\nAUTH LOGIN\r\n```\r\n\r\nThe mail server will respond with `334 VXNlcm5hbWU6`, which is a Base64 encoded request for your username.\r\n\r\n3. Input `YXBpa2V5` and press **Enter** on your keyboard. Twilio SendGrid requires you to authenticate using an API key. When using Basic Authentication and an API key, you must use the string `apikey` in place of your account username. The string `apikey` is `YXBpa2V5` when Base64 encoded, which is why we use it in this step.\r\n\r\nThe mail server will respond with `334 UGFzc3dvcmQ6`. This response is a Base64 encoded request for your password (your API Key).\r\n\r\n4. Enter your Base64 converted API key in the next line as the password and press **Enter**.\r\n\r\nThe mail server will respond with `235 Authentication successful`. Getting this far indicates that your connection to `smtp.sendgrid.net` over the chosen port is open and that your API key is valid.\r\n\r\n5. Next, add the email that you’re sending from using the SMTP MAIL FROM command and press **Enter**.\r\n\r\n```shell\r\nMAIL FROM: <SENDER_EMAIL>\r\n```\r\n\r\nThe mail server will respond with `250 Sender address accepted`.\r\n\r\n6. Add the email that you’re sending to using the SMTP RCPT TO command and press **Enter**.\r\n\r\n```shell\r\nRCPT TO: <RECIPIENT_ADDRESS>\r\n```\r\n\r\nNote that you can add more RCPT TO addresses during this step. Repeat the process by adding another RCPT TO command and pressing **Enter** for each recipient you intend to deliver the message to.\r\n\r\nThe mail server will respond with `250 Recipient address accepted` after each recipient is added.\r\n\r\n7. On the next line, type `DATA` and press **Enter**.\r\n\r\nThe mail server will respond with `354 Continue`. Unlike the MAIL FROM and RCPT TO commands, which are part of the email envelope, the DATA command is not meant to contain information that routes your email from a sender to a recipient. Instead, DATA allows you to modify the content of your message.\r\n\r\n8. Optionally, add a mail-to header to add the name and email address of the recipient to the email header and press **Enter**. Note that the name should be wrapped in quotation marks, and the address should be wrapped in a greater than and less than symbol.\r\n\r\n```shell\r\nTo: \"<RecipientName>\" <<RecipientEmailAddress>>\r\n```\r\n\r\n9. Next, add a from header to add the name and email address of the sender to the email header and press **Enter**. If a from header is not included, SendGrid will block your email because it doesn’t follow [RFC 5322](https://tools.ietf.org/html/rfc5322) compliance guidelines. Note that the name should be wrapped in quotation marks, and the address should be wrapped in a greater than and less than symbol.\r\n\r\n```shell\r\nFrom: \"<SenderName>\" <<SenderEmail>>\r\n```\r\n\r\n10. Include a subject line and press **Enter**.\r\n\r\n```shell\r\nSubject: <EMAIL_SUBJECT>\r\n```\r\n\r\n11. Add the body content of the message and press **Enter**.\r\n\r\n```shell\r\n\"<MESSAGE>\"\r\n```\r\n\r\nFor example:\r\n\r\n```\r\n“This is a test for the SMTP relay.\"\r\n```\r\n\r\n12. Finally, send the email by typing a period, `.`, and then pressing **Enter**.\r\n\r\nThe mail server will return `250 Ok: queued as <examplestring1234>`. This means the email has been queued to send. The queue moves very quickly, and you should see mail delivered to the designated recipients shortly.\r\n\r\n13. Exit the Telnet connection by typing `quit` and pressing **Enter**.\r\n\r\nThe full command should look like the following example.\r\n\r\n```shell\r\n235 Authentication successful\r\nMAIL FROM:tiramisu@example.com\r\n250 Sender address accepted\r\nRCPT TO:person1@sendgrid.com\r\n250 Recipient address accepted\r\nDATA\r\n354 Continue\r\nFrom: \"Tira Misu\" <tiramisu@example.com>\r\nTo: \"Person 1\" <person1@sendgrid.com>\r\nSubject: Test message subject\r\n\"This is the test message body.\"\r\n.\r\n250 Ok: queued as Yo60h6C5ScGPeP5fUWU3K\r\n```\r\n\r\nNow that you've sent a test email, learn to [integrate your servers with our SMTP service]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/).\r\n\r\n<call-out>\r\n\r\nMessage size limit: The total message size should not exceed 20MB. This includes the message itself, headers, and the combined size of any attachments.\r\n\r\n</call-out>\r\n\r\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\r\n\r\n### Do you want expert help to get your email program started on the right foot?\r\n\r\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\r\n\r\n</call-out-link>\r\n\r\n## Additional Resources\r\n\r\n- [Getting Started with the UI]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\r\n- [Getting Started with the API]({{root_url}}/for-developers/sending-email/api-getting-started/)\r\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\r\n- [Integrating with the SMTP API]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\r\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)\r\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/getting-started-with-transactional-emails.md",
    "content": "---\nseo:\n  title: Getting Started with Transactional Email\n  description: Using SendGrid to send Transactional Email.\n  keywords: Getting Started, API, v3, REST, Transactional Email\ntitle: Getting Started with Transactional Email\ngroup: api-v3\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid is perfect for sending Transactional Emails.\n\n## \tWhat is Transactional Email?\n\nTransactional Email is a type of email sent to facilitate an agreed-upon transaction between the sender and the recipient. Transactional emails typically contain information a recipient wants or needs and consequently have very high open rates. Common transactional email use cases include, account creation emails, password resets, purchase receipts, account notifications, and social media updates like friend and follower notifications.\n\nThese emails typically contain information a user wants or needs. They have the highest open rates across all categories of email.\n\n<call-out>\n\nWell designed and useful emails help keep open rates high. Use ([SendGrid’s Dynamic Transactional Email Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)) to help with the creation of responsive transactional email templates.\n\n</call-out>\n\nRead more about Transactional Email in the [SendGrid Guide]({{root_url}}/glossary/transactional-email/).\n\n## \tHow to send a Transactional Email\n\nOnce your SendGrid account is set up, you have choices on how to send the emails to your users.\n\n1. Send [via SMTP]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n2. Send [via API]({{root_url}}/api-reference)\n3. Send via other options like [Open Source]({{root_url}}/for-developers/sending-email/libraries/) and [plugins]({{root_url}}/for-developers/sending-email/wordpress-plugin/)\n\n## \tAdditional Resources\n\nFor more information on SendGrid and where you can go from here, check out these pages:\n\n- [Transactional Emails]({{root_url}}/glossary/transactional-email/)\n- [API Reference]({{root_url}}/api-reference/)\n- [How to Send Email]({{root_url}}/for-developers/sending-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/how-to-create-a-subuser-with-the-api.md",
    "content": "---\nseo:\n  title: How to Create a Subuser with the API\n  description: How to Create a Subuser with the API\n  keywords: subuser, api, IP, account, new, create, /customer.\ntitle: How to Create a Subuser with the API\ngroup: api-v3\nweight: 0\nlayout: page\nzendesk_id: 201750787\nnavigation:\n  show: true\n---\n\nCreating a new subuser through SendGrid's API is a multi-step process. This guide will walk you through the necessary steps to create a new subuser account using only API calls.\n\n## Establish the New Subuser (required)\n\nWith the [subuser creation API call](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/subusers) you will be able to establish the new subuser's account and profile settings. This call will create the new subuser account. However, it does not apply the sending IP for the account, nor does it establish a domain authentication entry or enable website/SMTP access for the subuser.\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.add.json?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&username=newsubuser_username&website=yourdomain.com&password=newsubuser_password&confirm_password=newsubuser_password&first_name=Ryan&last_name=Burrer&address=555_anystreet&city=any_city&state=CO&zip=80203&email=example@example.com&country=US&phone=555-5555\n```\n\n<center>\n<strong>Success Message<br></strong><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/5e355c42-487e-442a-bd2b-89c9d80dd7d0/00000094.png\" alt=\"\"><center><strong> <br>Failure Message<br></strong></center>\n<img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/d8482205-976f-4f82-ad3a-77503e867c2f/00000095.png\" alt=\"\"> <strong><span class=\"wysiwyg-font-size-medium\"><br><br></span></strong>\n</center>\n\n## Assign an IP to be Used by the New Subuser (required)\n\nNow that you have created the new subuser account, you will need to [add an IP](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/ip_management) so that it can send emails. We advise that you first find an available IP for this subuser. You can do so by using the following call:\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.ip.xml?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&list=all\n```\n\nWhen defining the parameter 'list', there are a few options you can choose:\n\n- **All** - Will list all of the IPs on your account, taken or available.\n- **Free** - Will list all the free IPs on your account. For instance, if an IP is in use by a subuser or parent account then that IP will not be listed.\n- **Taken** - Will list all of the IP addresses that are assigned to your parent and subuser accounts.\n- **Available** - Will list all of the unassigned IP addresses for the account. If a subuser is deactivated \\_and it \\_is assigned an IP, that IP will show up on this list since that IP address is not technically in use.\n<center>\n<strong>Response Example<br></strong><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/0dc1923b-fff9-4446-aff1-5dcab41929a4/00000096.png\" alt=\"\" align=\"middle\">\n</center>\n\nAfter you have selected the IP that you wish to assign to your subuser account, make the API call to [append the IP address](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/ip_management).\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.sendip.json?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&task=append&set=specify&user=newsubuser_username&ip[]=255.255.255.250&ip[]=255.255.255.255\n```\n\nWhen defining this call's 'set' parameter, you have a few options for appending the subuser's IP:\n\n- **None** - removes all of the IPs on the associated account.\n- **All** - applies all of the possible IPs to the account.\n- **Specify** - Specify the IPs to the subuser\n<center>\n<strong>Success Message</strong>\n<p class=\"wysiwyg-text-align-left\"><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/5e355c42-487e-442a-bd2b-89c9d80dd7d0/00000094.png\" alt=\"\" align=\"middle\"></p>\n<strong>Failure Message</strong>\n<p class=\"wysiwyg-text-align-left\"><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/d8482205-976f-4f82-ad3a-77503e867c2f/00000095.png\" alt=\"\" align=\"middle\"></p>\n</center>\n\n## Assign a domain authentication for the Subuser Account (optional)\n\nAfter you have created the subuser account and have appended an IP address, you are now ready to assign an _existing_ [authenticated domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) to the account. If you have not yet created the required records for authenticating your chosen domain then this step should be skipped.\n\nFirst, you should find out what authenticated domains you have associated with your account. This call will [list your available authenticated domains](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/whitelabel#list):\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.whitelabel.json?api\\_user=ryan.burrer@sendgrid.com&api\\_key=xxxxxx&task=list\n```\n\n<center>\n<strong>Response Example</strong>\n<p class=\"wysiwyg-text-align-left\"><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/9d491f57-d3c8-4376-a31d-a04b49590747/00000097.png\" alt=\"\"></p>\n</center>\n\nThe API response above shows that email.sendgrid.com and email.example.com are both already established domain entries, and can be used by this subuser. If none are displayed then the next step in this process should be skipped.\n\nIf you have an authenticated domain entry that you wish to apply to your subuser then you will need to [append the authenticated domain entry](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/whitelabel) to your subuser:\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.whitelabel.json?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&task=append&user=newsubuser_username&mail_domain=YOUR.ALREADY.EXISTING.AUTHENTICATED_DOMAIN\n```\n\n<center>\n<strong>Success Message</strong>\n<p class=\"wysiwyg-text-align-left\"><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/5e355c42-487e-442a-bd2b-89c9d80dd7d0/00000094.png\" alt=\"\" align=\"middle\"></p>\n<strong>Failure Message</strong>\n<p><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/d8482205-976f-4f82-ad3a-77503e867c2f/00000095.png\" alt=\"\"></p>\n</center>\n\n## Authenticating the Subuser to Have Website/SMTP Access (required)\n\nThe final step in creating your new subuser requires you to [activate the subuser](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/authenticate_a_subuser) account so that they have a website and SMTP access.\n\n#### Call Example\n\n```\nhttps://api.sendgrid.com/apiv2/customer.auth.json?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&user=newsubuser_username&password=newsubuser_password\n```\n\n<center>\n<strong>Success Message</strong>\n<p><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/5e355c42-487e-442a-bd2b-89c9d80dd7d0/00000094.png\" alt=\"\" align=\"middle\"></p>\n<strong>Failure Message</strong>\n<p><img src=\"http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/d8482205-976f-4f82-ad3a-77503e867c2f/00000095.png\" alt=\"\"></p>\n</center>\n<center>\n\n## Additional Resources\n\n- [Automating Subusers]({{root_url}}/for-developers/sending-email/automating-subusers/)\n- [Event Notification URL](https://www.twilio.com/docs/sendgrid/api/v2/reseller_api/reseller_customer_subuser_api/customer_subuser_event_notification_url)\n- [Apps](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/apps)\n- [Account Limits](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/account_limits)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/how-to-use-a-transactional-template-with-smtp-or-v2.md",
    "content": "---\nseo:\n  title: Sending a Legacy Transactional Template Email over SMTP or v2\n  description: Learn how to send a legacy transactional template with the SMTP API.\n  keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients, legacy template, transactional template\ntitle: Sending a Legacy Transactional Template Email over SMTP\ngroup: x-smtpapi\nweight: 949\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\n### Who should consider using the X-SMTPAPI?\n\nFor customers who are unable to use the Web API v3, SMTP or v2 is an acceptable option.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nThe X-SMTPAPI does not support Dynamic Transactional Templates. For sending Dynamic Transactional Templates you need to use v3 Mail Send.\n\n* [How to send an email with Dynamic Transactional Templates]({{root_url}}/for-developers/sending-email/how-to-send-an-email-with-dynamic-transactional-templates)\n- [Getting Started with the v3 Mail Send API]({{root_url}}/for-developers/sending-email/api-getting-started/)\n  \n</call-out>\n\n## Before you begin\n\nBefore you create and send a legacy transactional template email over SMTP you need to do the following:\n\n* [Integrate with the SendGrid SMTP API]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n* [Send a test email over SMTP]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n* [Build an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)\n* [Create a Legacy Transactional Template](https://sendgrid.com/templates)\n\n## Sending a test Email\n\n### Sending a test SMTP email with Telnet\n\n[Sending a test SMTP email with Telnet](/for-developers/sending-email/getting-started-smtp/#sending-a-test-smtp-email-with-telnet) is one of the most basic tests you can do. This test is useful in checking the connection and determining if the most basic of problems:\n\n* Is the server up?\n* Is there a firewall blocking communication?\n* Does the mail server allow for relaying of a particular domain/email address?\n* What SMTP commands does the mail server support?\n* Does the server respond with the correct hostname?\n* Does the connection work outside any third party software or APIs?\n\n## Sending an Email\n\n### Code Examples with different clients for SMTP\n\n* [SMTP Go Code Example]({{root_url}}/for-developers/sending-email/smtp-go-code-example/)\n* [SMTP Node.js Code Example]({{root_url}}/for-developers/sending-email/smtp-nodejs-code-example/)\n* [SMTP PHP Code Example]({{root_url}}/for-developers/sending-email/smtp-php-code-example/)\n* [SMTP Perl Code Example]({{root_url}}/for-developers/sending-email/smtp-perl-code-example/)\n* [SMTP Python Code Example]({{root_url}}/for-developers/sending-email/smtp-python-code-example/)\n* [SMTP Ruby Code Example]({{root_url}}/for-developers/sending-email/smtp-ruby-code-example/)\n\n### Sending via v2 mail send\n\n* [Go Code Example]({{root_url}}/for-developers/sending-email/v2-go-code-example/)\n* [Node.js Code Example]({{root_url}}/for-developers/sending-email/v2-nodejs-code-example/)\n* [PHP Code Example]({{root_url}}/for-developers/sending-email/v2-php-code-example/)\n* [Perl Code Example]({{root_url}}/for-developers/sending-email/v2-perl-code-example/)\n* [Python Code Example]({{root_url}}/for-developers/sending-email/v2-python-code-example/)\n* [Ruby Code Example]({{root_url}}/for-developers/sending-email/v2-ruby-code-example/)\n* [C# Code Example]({{root_url}}/for-developers/sending-email/v2-csharp-code-example/)\n* [Java Code Example]({{root_url}}/for-developers/sending-email/v2-java-code-example/)\n\n### Enabling a Template\n\n<call-out>\n\nMake sure that the version of the template you want to use is set to active by using:\n\n- The [Activate a transactional template version endpoint](https://sendgrid.com/docs/api-reference/)\n  ```/templates/{template_id}/versions/{version_id}/activate```\n\n- Or by [activating the template version in the UI](https://sendgrid.com/templates)\n\n</call-out>\n\nTo use a legacy template when you send, configure the `X-SMTPAPI` header of an SMTP message:\n\n* Enable the `templates` filter\n* Set the `template_id` to one of your legacy transactional templates\n\n#### Example\n```json\n{\n  \"filters\": {\n    \"templates\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"template_id\": \"5997fcf6-2b9f-484d-acd5-7e9a99f0dc1f\"\n      }\n    }\n  }\n}\n```\n\n### Set the Body and Subject Tags\n\nThe `<%subject%>` property is used for both Text and HTML templates.\n\nThe ```text``` property is substituted into the `<%body%>` of the text template and ```html``` is substituted into the `<%body%>` of the HTML template.\n\n**Text or HTML Templates?**\n\n<call-out>\nIt is best practice to provide content for both the ```html``` and the ```text``` properties in all of your emails.\n\nIf the ```text``` property is present, but not ```html```, then the resulting email will only contain the text version of the template, not the HTML version.\n</call-out>\n\nEnabling a legacy template means that the `subject` and `body`\ncontent of your message will behave differently.\n\n* If you want only the message's content to be displayed, populate only the token in the template's field.\n* If you want only the template's content to be displayed, leave the message field (subject or body) empty, and the template will populate.\n\n## Advanced options\n\nYou can use X-SMTPAPI [substitution]({{root_url}}/for-developers/sending-email/substitution-tags/) and [section]({{root_url}}/for-developers/sending-email/section-tags/) tags in your template's subject and body content, and they will be replaced with the values specified when you send the message.\n\n### Substitution Tags\n\n[Substitution tags]({{root_url}}/for-developers/sending-email/substitution-tags/) allow you to generate dynamic content for each recipient on your list. When you send to a list of recipients over SMTP API, you can specify substitution tags specific to each recipient.\n\n### Section Tags\n\n[Section tags]({{root_url}}/for-developers/sending-email/section-tags/) allow you to substitute in content in an SMTP message. Section tags are similar to substitution tags but are specific to the message, and not the recipient. Section tags have to be contained within a Substitution tag since SendGrid needs to know which data to populate for the recipient.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/iis75.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Microsoft IIS 7.5\ngroup: mail-servers\nnavigation:\n  show: true\n---\n\n<call-out>\n\nThis document was written using Windows Server 2008 R2 running IIS version 7.5 and ASP.NET scripting technology for sending email. If you require SSL/TLS, you will need to configure those elements separately.\n\n</call-out>\n\n## IIS 7.5 Configuration\n\nBefore you get going, you'll need to set up IIS in order to support SendGrid integration. This tutorial assumes that you have set up a working site and that the root directory tests as valid.\n\n1. Open IIS 7.0/7.5 Manager in Windows.\n2. Click on your site (see image below, noting that your configuration will look different), and the main configuration options page will be displayed to the right.\n3. Double-click **SMTP E-mail** under the ASP.NET section.\n4. In the email address field: type the email address that will be the \"sender\".\n5. Select **Deliver e-mail to SMTP server**.\n6. In the SMTP Server field: type localhost.\n7. In the Port field: type 25.\n8. In Authentication Settings, select **Not required**.\n9. Click **Apply**.\n\n<center>\n\n![]({{root_url}}/images/iis_mgr_site.png \"IIS Manager\")\n\n</center>\n\n<call-out>\n\nIf you want to configure additional security to the localhost IIS 6.0 server you would set it here and match the same authentication in the IIS 6.0 GUI.\n\n</call-out>\n\n## Enable SMTP Service\n\n1. Go to Start \\> All Programs \\> Administrative Tools \\> Server Manager\n2. Click **Features** in the navigation pane.\n3. Click **Add Features** to start the wizard.\n4. Scroll down the list to the SMTP Server, and check the box. The Required Role Services dialog will appear, listing all of the dependencies that the SMTP server depends on to operate. Click **Add Require Role Services**.\n5. Click **Next** twice.\n6. Review the list of available IIS Role Services and check any that you would like to add.\n7. Click **Next** then click **Install**.\n\nOnce the SMTP Server service is installed, the IIS 6.0 virtual server technology is activated, and the IIS 6.0 administration snap-in will now be active.\n\n## Configure IIS 6.0 to Relay Outbound Email to SendGrid\n\n1. Go to Start \\> All Programs \\> Administrative Tools \\> IIS 6.0 Manager.\n2. Right click on the SMTP Virtual Server \\#1 and select **Properties**.\n3. Click the box to enable logging section to assist you in configuring the server.\n4. Select **Properties** and check the box to activate *Use Local Time For File Naming And Rollover* option.\n5. Select **Advanced** and check the following items: Date, Time, Client IP Address, User Name, Service Name, Server Name, Server IP Address, Server Port, Method, Protocol Status, Bytes Sent, Protocol Version, and Host.\n6. Click **OK**.\n7. Click on the Access tab the select **Relay** in the Relay Restrictions section.\n8. Click Add, enter 127.0.0.1, and click OK. The IP appears in the list with Access Granted.\n9. Click **OK Only The List Below** and enter 127.0.0.1 in the IP address field.\n10. Click **OK** to return to the Access tab as shown in the previous screenshots.\n11. Select Delivery and click **Outbound Security**.\n12. Select **Basic Authentication** and enter `apikey` as your username and the password will be your SendGrid [API Key]({{root_url}}/ui/account-and-settings/api-keys/).\n13. Click **OK**.\n14. Click **Advanced**.\n15. In the Smart host field: enter smtp.sendgrid.net\n16. Click on OK twice and you can close the IIS 6.0 admin MMC\n\n## Configure Domains\n\nAt this point you will need to configure an SMTP domain that relays messages to SendGrid. Please follow [Microsoft's instructions](https://support.microsoft.com/en-us/help/230235/xcon-how-to-configure-the-iis-smtp-service-to-relay-smtp-mail).\n\n## Testing Your New Configuration\n\nFirst, let's test using Telnet. Open up a telnet client within Windows. You can do that in the Command Prompt by entering the following:\n\n```\ntelnet localhost 25\n```\n\nNow, with telnet running, enter the following commands just as you see them, pressing ENTER for each new line (if configured correctly, the server won't do anything until you enter the period):\n\n```\nEHLO yourdomain.com\nMAIL FROM: test@yourdomain.com\nRCPT TO: recipient@anotherdomain.com\nDATA\nThis is a test email for SendGrid operations.\n.\n```\n\nThe `EHLO` command with your domain inserted tells the mail server which domain it will be sending from. The `MAIL FROM:` command is a standard MIME entry for that inserts the email address of the sender. The `RCPT TO:` command tells the server to which address to send the message. The `DATA` command tells the server that the next incoming information is the body of the message. Finally, after the data is entered, the period (.) tells the server you are done. When you press Enter, it will send the message. It's quite nice to have servers to handle all this mess, isn't it!\n\nIf these manually entered commands work, then you should have the following success code returned:\n\n```250….Queued mail for delivery```\n\nYou can also test using the logging feature we had you activate earlier. You can view the logs by navigating to and opening the IIS 6.0 7.5 log files with a text editor. It will probably be under the C:\\\\Windows\\\\System32\\\\LogFiles directory unless you changed the log file location during installation.\n\nNotice, highlighted in blue below, that the server sent an email and that it went through various OutboundConnectionCommand and Outbound ConnectionResponse steps. These along with the information of the various stages of EHLO, AUTH, MAIL, RCPT, DATA, and quit that the email was sent successfully.\n\nFinally, you can confirm that your configuration is working by logging into our site. Login into our web UI using your SendGrid credentials. On the main Dashboard tab you will see a list of messages that were recently sent through our service. This number should increment by one each time you either use telnet to send an email or you use an ASP.NET test script.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/integrating-with-the-smtp-api.md",
    "content": "---\nseo:\n  title: Integrating with the SMTP API\n  description: Set your systems up to use SendGrid's SMTP API\n  keywords: ports, connection, SMTP, send email, integrate, rate limits, setting up\ntitle: Integrating with the SMTP API\ngroup: smtp\nweight: 950\nlayout: page\nnavigation:\n  show: true\n---\n\n## Integrating with SendGrid\n\n_To integrate with SendGrid's SMTP API:_\n\n1. [Create an API Key](https://app.sendgrid.com/settings/api_keys) with at least \"Mail\" permissions.\n2. Set the server host in your email client or application to `smtp.sendgrid.net`. This setting is sometimes referred to as the _external SMTP server_ or the _SMTP relay_.\n3. Set your username to the string `apikey`. This setting is the exact string \"apikey\" and not the API key itself.\n4. Set your password to the API key generated in step one.\n5. Set the port to `587` (or as specified below).\n\n<call-out>\n\nWhen submitting base64 encoded API key values, be sure you have not included any newline or whitespace characters by accident. This can happen when copying the encoded key from an environment that line wraps output. SMTP is a line-oriented protocol, and linefeed characters will prevent you from authenticating successfully.\n\n</call-out>\n\n### SMTP ports\n\n- For an unencrypted or a [TLS connection]({{root_url}}/ui/sending-email/ssl-vs-tls/), use port `25`, `2525`, or `587`.\n- For a [SSL connection]({{root_url}}/ui/sending-email/tls/), use port `465`.\n\n<call-out>\n\nIf you are unsure which port to use, a TLS connection on port 587 is typically recommended. To better understand the difference between ports 465 and 587, see the Twilio SendGrid blog post, [\"What's the Difference Between Ports 465 and 587\"](https://sendgrid.com/blog/whats-the-difference-between-ports-465-and-587).\n\n</call-out>\n\n### Build SMTP email\n\nNow that you've integrated, learn to [build SMTP email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/).\n\n### Rate limits\n\n- You may send up to **5k messages per SMTP connection**.\n- You may open up to **10k concurrent connections from a single server**.\n\n## Additional resources\n\n- [Sending email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n- [Getting Started with the API]({{root_url}}/api-reference/)\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/interspire.md",
    "content": "---\nseo:\n  title: Interspire Integration\n  description: Interspire Integration\n  keywords: marketing, interspire, integration\ntitle: Interspire Integration\ngroup: partners\nweight: 0\nlayout: page\nzendesk_id: 200182048\nnavigation:\n  show: false\n---\n\n## Why to integrate Interspire with SendGrid\n\nInterspire's [Email Marketer](http://www.interspire.com/emailmarketer/) is a powerful email marketing tool used by some SendGrid customers to carry out more in-depth marketing campaigns. Email Marketer has all the bells and whistles of an email marketing suite, and it's really good at helping customers carry out marketing campaigns from start to finish. SendGrid is really good at giving mail senders all the necessary tools to ensure their mail gets delivered to the inbox. This is why some customers choose to create their email marketing campaigns with Interspire and send the mail through SendGrid, to ensure optimized deliverability of the mail to the inbox. Luckily, Interspire makes this integration with SendGrid simple.\n\n## How to integrate Interspire with SendGrid\n\nFirst things first, you'll need to log into your Email Marketer account. Once you've done that you can set the application's outbound mail server to point to SendGrid, allowing you to send the mail to us so we can send it to the end recipient. You'll want to navigate to the Dashboard within the account, which should look like this: ![Interspire_doc.1.png](https://sendgrid.zendesk.com/attachments/token/adaznndwouktdj1/?name=Interspire_doc.1.png)\n\nYou'll then want to navigate to **Settings > Email Settings** in the upper right corner of the Dashboard. Once inside the Email Settings page you will see the \"Mail Server Details\" header near the bottom of the page:\n\n![Interspire_doc.2.png](https://sendgrid.zendesk.com/attachments/token/poikwudjgiidmmx/?name=Interspire_doc.2.png)\n\nIn order to set Email Marketer's outbound mail server to point to SendGrid, click the \"Let me specify my own SMTP server details\" bubble. From there, input the following authentication details:\n\n- **SMTP Hostname** : smtp.sendgrid.net\n- **SMTP Username** : [your SendGrid account's username]\n- **SMTP Password** : [your SendGrid API key]\n- **SMTP Port** : [the port of your choosing. For more information, see [How to Send an SMTP Email]({{root_url}}/for-developers/sending-email/getting-started-smtp/)]\n\nOnce these settings changes have been made within the Email Settings page within your Email Marketer account, all mail from the application will be sent to SendGrid so we can send it to the end recipient. Simple as that.\n\n## Bounce integration\n\nA bounce event occurs when mail is not able to be handed off to the mail servers at the end recipient's address. This could happen for a number of reasons such as a full mailbox at the address, or the address not existing at all. SendGrid generates a Bounces suppression list when you send mail to addresses that end up bouncing. We suppress subsequent mail to these addresses unless you tell us otherwise in the Email Reports tab within your account. There are 2 primary ways you can integrate these bounces, generated by SendGrid's system, with Email Marketer. You can download a CSV file of bounced addresses by navigating to Email Reports > Bounces within your SendGrid account. You can then upload this list into Email Marketer's system in order to mark \"subscribers\" as \"unsubscribed.\" You can also handle bounces more programmatically by using our Event API to capture POSTed events and then unsubscribing subscribers in the Email Marketer system by making calls to their XML API.\n\nMore info on SendGrid's Event API can be found [here](https://sendgrid.api-docs.io/v3.0/webhooks)\n\nMore info on Interspire's XML API can be found [here](https://www.interspire.com/xml-api-documentation)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/joomla.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Joomla\ngroup: open-source\nnavigation:\n  show: true\n---\n\nJoomla supports sending email over SMTP. To have Joomla relay email through SendGrid go to _Site \\> Global Configuration_ and change:\n\n- **Mailer** – SMTP\n- **SMTP Host** - smtp.sendgrid.net\n- **SMTP Port** – 587\n- **SMTP Security** – STARTTLS\n- **SMTP Authentication** - Yes\n- **SMTP User** - \"apikey\"  \n  SMTP User must be the exact string, \"apikey\"\n- **SMTP Pass** - <Your API Key>  \n  SMTP Pass is your actual API key\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/laravel.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Laravel\nseo:\n  title: Send Email with Laravel & SendGrid\n  description: View instructions on how to easily send email with Laravel using SendGrid, by setting up setting up Laravel's  Mailables Class.\nnavigation:\n  show: true\n---\n\nLaravel provides a clean API over the popular SwiftMailer library with drivers for SMTP, PHP's `mail`, `sendmail` and more. For this example, we'll be sending an email with SendGrid using the SMTP Driver. For more information, check out the docs for [Laravel's Mail interface](http://laravel.com/docs/mail).\n\nLaravel 5.5 LTS uses Mailable classes. Mailables in Laravel abstracts building emails with a mailable class. Mailables are responsible for collating data and passing them to views.\n\n## Before you begin\n\nCheck your `.env` file and configure these variables:\n\n```\nMAIL_MAILER=smtp\n# MAIL_DRIVER=smtp # for laravel < 7\nMAIL_HOST=smtp.sendgrid.net\nMAIL_PORT=587\nMAIL_USERNAME=apikey\nMAIL_PASSWORD=sendgrid_api_key\nMAIL_ENCRYPTION=tls\nMAIL_FROM_NAME=\"John Smith\"\nMAIL_FROM_ADDRESS=from@example.com\n```\n\n<call-out>\nSet the `MAIL_USERNAME` field to \"apikey\" to inform SendGrid that you're using an API key.<br>\n</call-out>\n\n<call-out>\nThe `MAIL_FROM_NAME` field requires double quotes because there is a space in the string.<br>\n</call-out>\n\n<call-out>\nYou can send `100 messages per SMTP connection` at a time, and open up to `10 concurrent connections` from a single server at a time.\n</call-out>\n\n## Creating a Mailable\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nNext you need to create a Mailable class, Laravel's CLI tool called Artisan makes that a simple feat.\nOpen CLI, go to the project directory and type:\n\n`php artisan make:mail TestEmail`\n\nThis command will create a new file under `app/Mail/TestEmail.php` and it should look something like this:\n\n```php\n<?php\n\nnamespace App\\Mail;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\n\nclass TestEmail extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    public $data;\n\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    public function build()\n    {\n        $address = 'janeexampexample@example.com';\n        $subject = 'This is a demo!';\n        $name = 'Jane Doe';\n\n        return $this->view('emails.test')\n                    ->from($address, $name)\n                    ->cc($address, $name)\n                    ->bcc($address, $name)\n                    ->replyTo($address, $name)\n                    ->subject($subject)\n                    ->with([ 'test_message' => $this->data['message'] ]);\n    }\n}\n```\n\nIn Laravel `Views` are used as 'templates' when sending an email. Let's create a file under `app/resources/views/emails/test.blade.php` and insert this code:\n\n```html\n<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n  </head>\n  <body>\n    <h2>Test Email</h2>\n    <p>{{ $test_message }}</p>\n  </body>\n</html>\n```\n\n## Sending an email\n\nNow that we have our Mailable Class created, all we need to do is run this code:\n\n```php\n<?php\n    use App\\Mail\\TestEmail;\n\n    $data = ['message' => 'This is a test!'];\n\n    Mail::to('john@example.com')->send(new TestEmail($data));\n```\n\n## Adding a category or custom field\n\nCategories in SendGrid allow you to split your statistics into sections.\n\nAnother useful tool is event notifications. If you want to complete the feedback loop for your product you can pass identifiers as a header which relate to a record in your database which you can then parse the notifications against that record to track deliveries/opens/clicks/bounces.\n\nThe `withSwiftMessage` method of the `Mailable` base class allows you to register the callback that is invoked with the raw SwiftMailer message instance before sending the message. This knowledge allows you to customize the message before delivery. To customize your message, use something similar to this:\n\n```php\n<?php\n\nnamespace App\\Mail;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\n\nclass TestEmail extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    public $data;\n\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    public function build()\n    {\n        $address = 'janeexampexample@example.com';\n        $subject = 'This is a demo!';\n        $name = 'Jane Doe';\n\n        $headerData = [\n            'category' => 'category',\n            'unique_args' => [\n                'variable_1' => 'abc'\n            ]\n        ];\n\n        $header = $this->asString($headerData);\n\n        $this->withSwiftMessage(function ($message) use ($header) {\n            $message->getHeaders()\n                    ->addTextHeader('X-SMTPAPI', $header);\n        });\n\n        return $this->view('emails.test')\n                    ->from($address, $name)\n                    ->cc($address, $name)\n                    ->bcc($address, $name)\n                    ->replyTo($address, $name)\n                    ->subject($subject)\n                    ->with([ 'data' => $this->data ]);\n    }\n\n    private function asJSON($data)\n    {\n        $json = json_encode($data);\n        $json = preg_replace('/([\"\\]}])([,:])([\"\\[{])/', '$1$2 $3', $json);\n\n        return $json;\n    }\n\n\n    private function asString($data)\n    {\n        $json = $this->asJSON($data);\n\n        return wordwrap($json, 76, \"\\n   \");\n    }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/libraries.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: API Libraries\ngroup: open-source\nseo:\n  title: API Libraries & Clients - SendGrid Documentation | SendGrid\n  override: true\n  description: Send email and interact with SendGrid using your favorite language including Python, Go, Node.js, Ruby, PHP, Java, C#, Perl, Objective-C, and more.\nnavigation:\n  show: true\n---\n\nThese libraries allow quick integration between SendGrid and your project, and are available for a variety of languages and frameworks.\n\n## \tOfficial libraries\n\nSendGrid maintains the following official libraries for mail sending.\n\n-   [sendgrid-csharp](https://github.com/sendgrid/sendgrid-csharp) - Official C\\# Library\n-   [sendgrid-go](https://github.com/sendgrid/sendgrid-go) - Official Go Library\n-   [sendgrid-java](https://github.com/sendgrid/sendgrid-java) - Official Java Library\n-   [sendgrid-nodejs](https://github.com/sendgrid/sendgrid-nodejs) - Official NodeJS Library\n-   [sendgrid-php](https://github.com/sendgrid/sendgrid-php) - Official PHP Library\n-   [sendgrid-python](https://github.com/sendgrid/sendgrid-python) - Official Python Library\n-   [sendgrid-ruby](https://github.com/sendgrid/sendgrid-ruby) - Official Ruby Library\n\n\nThe following official libraries are maintained by SendGrid to create [SMTP API Headers]({{root_url}}/for-developers/sending-email/building-an-smtp-email/), they are included in the above official libraries.\n\n-   [smtpapi-csharp](https://github.com/sendgrid/smtpapi-csharp) - Official C\\# SMTP API library\n-   [smtpapi-go](https://github.com/sendgrid/smtpapi-go) - Official Go SMTP API library\n-   [smtpapi-java](https://github.com/sendgrid/smtpapi-java) - Official Java SMTP API library\n-   [smtpapi-nodejs](https://github.com/sendgrid/smtpapi-nodejs) - Official NodeJS SMTP API library\n-   [smtpapi-php](https://github.com/sendgrid/smtpapi-php) - Official PHP SMTP API library\n-   [smtpapi-python](https://github.com/sendgrid/smtpapi-python) - Official Python SMTP API library\n-   [smtpapi-ruby](https://github.com/sendgrid/smtpapi-ruby) - Official Ruby SMTP API library\n\nThe following official library is maintained by SendGrid to use the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/):\n-   [EventKit](https://github.com/sendgrid/eventkit-rails) *by SendGrid* - An app to consume and store SendGrid Events.\n\n<call-out>\n\nIf you find a problem with any of the official libraries please submit issues on their respective GitHub projects and we'll address them ASAP\n\n</call-out>\n\n## \tCommunity libraries\n\nOpen source library contributions from the awesome SendGrid community.\n\n<call-out>\n\nIf you create a library, please let us know, by editing this page [in our GitHub repo](https://github.com/sendgrid/docs/blob/develop/source/{{page.path}}).\n\n</call-out>\n\n## \tWeb API Libraries\n\n ### \t.NET\n\n-   [StrongGrid](https://github.com/Jericho/StrongGrid) *by Jeremie Desautels* - Strongly typed library (no dynamic types!) for working with SendGrid's v3 API. Available as a [nuget package](https://www.nuget.org/packages/StrongGrid/). This library also includes a parser for Events and Inbounce Email webhooks.\n-   [MinimalSendGrid](https://github.com/TanukiSharp/MinimalSendGrid) *by Sebastien Robert* - Minimal implementation of the SendGrid HTTP v3 API to send emails, compatible with .NET Standard 1.0\n-   [SendGridSharp](https://github.com/shibayan/SendGridSharp) *by Tatsuro Shibamura* - SendGrid Client for C# (.NET 4.5) Simple interface, support to the new API, there is a feature that is not dependent on the System.Net.Mail.\n\n\n ### \tUniversal\n\n-   [RapidAPI-SendGrid](https://rapidapi.com/sendgrid/api/SendGrid) *by Dmitry Shumytskyi)* - Test the SendGrid API in your browser and integrate into your app using autogenerated code.\n-   [CloudRail-SendGrid](https://cloudrail.com/?utm_source=SendGrid&utm_medium=Website&utm_campaign=SendGrid%20Website) *by CloudRail* - Bundle SendGrid and other APIs into one SDK\n\n ### \tAndroid\n\n-   [sendgrid-android](https://github.com/danysantiago/sendgrid-android) - The Android library for SendGrid by [DannySantiago](https://github.com/danysantiago)\n-   [SendGrid4Android](https://github.com/fredericojssilva/SendGrid4Android) *by Frederico Silva* - Simple SendGrid client for Android\n\n ### \tColdFusion\n\n-   [sendgrid.cfc](https://github.com/mjclemente/sendgrid.cfc) - *by Matthew Clemente* - A CFML wrapper for the SendGrid API\n\n ### \tCommand Line\n\n-   [cmdgrid](https://github.com/martyndavies/cmdgrid) *by Martyn Davies* - CLI for working with SendGrid's Parse API\n-   [sgsend](https://github.com/vvaidy/sgsend) *by Vijay Vaidyanathan* - Sending email from the shell command line (for Macs and Unix)\n-   [sg](https://github.com/awwa/sg) *by Wataru Sato* - CLI for all SendGrid v3 endpoints.\n\n ### \tElixir\n\n-   [sendgrid_elixir](https://github.com/alexgaribay/sendgrid_elixir) *by Alex Garibay* - Elixir package for sending SendGrid transactional emails\n-   [bamboo](https://github.com/thoughtbot/bamboo) *by Thoughtbot* - Elixir emailing package, with SendGrid adapter\n-   [swoosh](https://github.com/swoosh/swoosh) - Another Elixir emailing package, with SendGrid adapter\n\n ### \tGroovy\n\n-   [grails-sendgrid](https://github.com/aiten/grails-sendgrid) *by Antony Jones* - Grails framework plugin\n\n ### \tHaskell\n\n-   [sendgrid-v3](https://github.com/marcelbuesing/sendgrid-v3) *by Marcel Buesing* - Haskell package for sending Mails via the SendGrid v3 Mail API\n\n ### \tJava\n\n-   [sendgrid-google-java](https://github.com/sendgrid/sendgrid-google-java) *by SendGrid* - Java library for use with Google App Engine\n-   [sendgrid4j](https://github.com/shunjikonishi/sendgrid4j) *by Shunji Konishi* - Simple SendGrid client for Java\n-   [sendgrid-asm-java](https://github.com/krenfro/sendgrid-asm-java) *by Kyle Renfro* - Unsubscribe Groups Java Client\n\n ### \tJavaScript / Node.js\n\n-   [sendgrid-mailer](https://github.com/adamreisnz) *by Adam Reis* - JavaScript wrapper for the the official SendGrid library.\n-   [node-sendgrid](https://github.com/HerdHound/node-sendgrid) *by Branko Vukelick* - Generate X-SMTPAPI headers in node.js.\n-   [node_subscription_widget](https://github.com/devchas/sendgrid_subscription_widget) *by Devin Chasanoff* - General purpose subscription widget created in node.js\n-   [loopback-sendgrid-connector](https://github.com/VMois/loopback-sendgrid-connector) *by Vladyslav Moisieienkov* - Simple Loopback connector for SendGrid Mail Service\n-   [sts-sendgrid](https://github.com/oritpersik) *by Orit Persik* - Easily use the SendGrid Web API via Node.js.\n\n ### \tMeteor\n\n-   [meteor-sendgrid](https://github.com/DavidBrear/meteor-sendgrid) *by David Brear* - Meteorite package for SendGrid API\n\n ### \tPerl\n\n-   [Email::SendGrid::V3](https://metacpan.org/pod/Email::SendGrid::V3) *by Grant Street Group Inc* -  Perl library for the SendGrid v3 Web API\n-   [sendgrid-perl](https://github.com/sendgrid/sendgrid-perl) *by SendGrid* -  Perl library for the SendGrid v2 API\n-   [WebService--SendGrid](https://github.com/majrmovies/WebService--SendGrid) *by Jonathan Lloyd* - Perl interface for SendGrid v2 API\n\n ### \tPHP\n\n-   [sendgrid-openshift-php](https://github.com/sendgrid/openshift-sendgrid-php) *by SendGrid* - Official PHP wrapper for use with Red Hat OpenShift\n-   [sendgrid-report-php](https://github.com/fcosrno/sendgrid-report-php) *by Francisco Serrano* - PHP wrapper to view and manage SendGrid reports through the SendGrid API\n-   [SendGrid-PHP-Library](https://github.com/alonbendavid/SendGrid-PHP-Library) *by Alon Ben David* - PHP wrapper for the SendGrid API including Marketing Email API\n-   [messaging_sendgrid](https://github.com/josereyero/messaging_sendgrid) *by Jose Reyero* - Drupal 7 plugin that adds bulk messaging capabilities via SendGrid\n-   [codeigniter-sendgrid-newsletter](https://github.com/bold/codeigniter-sendgrid-newsletter) *by Garrett St John* - CodeIgniter wrapper for the SendGrid Marketing Email API\n-   [codeigniter-sendgrid-mail](https://github.com/bold/codeigniter-sendgrid-mail) *by Garrett St John* - CodeIgniter wrapper for the SendGrid Mail API\n-   [sendgrid-component](https://github.com/damusnet/sendgrid-component) *by Damien Varron* - CakePHP component that extends the base email component with SendGrid functionality\n-   [sendgrid-subuser-api](https://github.com/eliksir/sendgrid-subuser-api) *by Eliksir* - Library that makes it easy to work with the SendGrid Subuser API\n-   [sendgrid-webapi-v3-php](https://github.com/idimensionz/sendgrid-webapi-v3-php) *by iDimensionz* - A complete implementation of the V3 WebAPI in PHP. Very structured, OO implementation with excellent test coverage. A repo containing examples showing how simple it is to utilize our implementation is available at [example](https://github.com/idimensionz/sendgrid-webapi-v3-examples).\n-   [laravel-sendgrid-driver](https://github.com/s-ichikawa/laravel-sendgrid-driver) *by Shingo Ichikawa* - This library can add SendGrid driver into the laravel's mail configure.\n-   [godpod/sendgrid](https://packagist.org/packages/godpod/sendgrid) *by Ravi Rajendra* - This library allows you to quickly and easily send emails or make api calls through SendGrid using PHP.\n-   [fastglass/sendgrid](https://github.com/taz77) *by taz77* - This library allows you to send emails through SendGrid using PHP and Guzzle 6.x.\n\n ###  PICK BASIC\n-   [MV Connect: MVSendGrid](https://docs.zumasys.com/mv-connect/packages/mvsendgrid/) *by Patrick Payne and Zumasys* - This library allows you to call SendGrid's v2 Web API from various flavors of PICK including but not limited to jBASE, UniVerse, UniData, D3 and OpenQM.\n\n ### \tPython\n\n-   [greplin-tornado-sendgrid](https://github.com/Cue/greplin-tornado-sendgrid) *by Daniel Gross* - SendGrid client for Tornado Web Server\n-   [django-sendgrid-v5](https://github.com/sklarsa/django-sendgrid-v5/) *by Steven Sklar* - SendGrid Web API Email Backend for Django\n-   [sendgrid-django](https://github.com/elbuo8/sendgrid-django) *by Yamil Asusta* - SendGrid Web API interface for Django\n-   [Flask-SendGrid](https://github.com/frankV/flask-sendgrid) *by Frank Valcarcel* - SendGrid SMTP API interface for Flask\n-   [aiohttp-sendgrid](https://github.com/Kurlov/aiohttp-sendgrid) *by Aleksandr Kurlov* - SendGrid SMTP API interface for aiohttp\n\n ### \tRuby\n\n-   [sendgrid](https://github.com/stephenb/sendgrid) *by Stephen Blankenship* - SendGrid rubygem (ActionMailer)\n-   [sendgrid_toolkit](https://github.com/freerobby/sendgrid_toolkit) *by Robby Grossman* - Ruby wrapper for the SendGrid Web API\n-   [sendgrid-rails](https://github.com/PavelTyk/sendgrid-rails) *by Pavel Tsiukhtsiayeu* - Extends ActionMailer with SendGrid methods\n-   [gatling_gun](https://github.com/okrb/gatling_gun) *by James Edward Gray II* - Simple wrapper over SendGrid's Marketing Email API.\n-   [sendgrid_api](https://github.com/markedmondson/sendgrid_api) *by Mark Edmondson* - Implements an ActionMailer that delivers through the SendGrid Web API.\n-   [sendgrid4r](https://github.com/awwa/sendgrid4r) *by Wataru Sato* - Ruby wrapper for the SendGrid Web API v3.\n\n ### \tRust\n\n-   [sendgrid-rs](https://github.com/gsquire/sendgrid-rs) by [gsquire](https://github.com/gsquire)\n\n\n ### \tTitanium\n\n-   [ti.sendgrid](https://github.com/sendgrid/ti.sendgrid) - SendGrid Titanium wrapper\n\n## \tWebhook Libraries\n\n### \tC\\#\n\n-   [StrongGrid](https://github.com/Jericho/StrongGrid) *by Jeremie Desautels* - Strongly typed library (no dynamic types!) for working with SendGrid's v3 API. Available as a [nuget package](https://www.nuget.org/packages/StrongGrid/). This library also includes a parser for Events and Inbounce Email webhooks.\n-   [C# Webhooks](https://github.com/mirajavora/sendgrid-webhooks) - *Community contributed library*\n\n###\tPython\n\n-   [Django eventhooks](https://github.com/agiliq/sendgrid-eventhooks) *by agiliq* - An app to consume and store SendGrid Events with Django\n-   [Pyramid Webhooks](https://github.com/GoodRx/pyramid-sendgrid-webhooks) *by GoodRx* - Parses incoming SendGrid Webhook events in Pyramid apps\n\n###\tRuby\n \t-   [gridhook](https://github.com/injekt/gridhook) *by Lee Jarvis* - Ruby Gem for handling inbound batches from our Event API\n-   [griddler](https://github.com/thoughtbot/griddler-sendgrid) *by Thoughtbot* - Rails engine that provides an endpoint for SendGrid's Parse API\n-   [Pokey](https://github.com/ccallebs/pokey-sendgrid) *by Chuck Callebs* - Ruby Gem for simulating events to your code for QA or development environments\n\n## \tStandard Drivers\n\n###\tADO.NET Providers\n \t-    [CData ADO.NET Provider for SendGrid](http://www.cdata.com/drivers/sendgrid/ado) *by CData Software* - Fully-managed ADO.NET Provider with support for Entity Framework, ADO.NET 2.0, LINQ, and more. Use SendGrid Data Provider objects to connect and access data just as you would access any traditional database.\n\n###\tJDBC Drivers\n \t-    [CData JDBC Driver for SendGrid](http://www.cdata.com/drivers/sendgrid/jdbc) *by CData Software* - Pure Java Type 4/5 JDBC Driver with bi-directional access from Java/J2EE applications. Easily connect to live SendGrid data through any JDBC capable application or tool!\n\n### ODBC Drivers\n \t-    [CData ODBC Driver for SendGrid](http://www.cdata.com/drivers/sendgrid/odbc) *by CData Software* - Unicode-enabled 32/64-bit ODBC 3.8 compliant Driver for Windows, Mac, & Linux. Access SendGrid the same way that you would connect to any other ODBC data source!\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/mailpoet.md",
    "content": "---\nseo:\n  title: How to integrate with MailPoet\n  description: How to integrate with MailPoet\n  keywords: deliverability, wordpress, mailpoet, poet\ntitle: How to integrate with MailPoet\ngroup: partners\nweight: 0\nlayout: page\nzendesk_id: 204730027\nnavigation:\n  show: false\n---\n\nMailPoet is a great way to send mail in WordPress. The best way to get MailPoet to work properly with SendGrid is;\n\n1. Select **Third Party**.\n\n2. Enter in SMTP hostname as `smtp.sendgrid.net`.\n\n3. Enter in your SendGrid username and API key.\n\n4. Select **Use Web API**.\n\n![]({{root_url}}/images/Screen_Shot_2015-02-13_at_4.47.27_PM.png)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/migrating-from-v2-to-v3-mail-send.md",
    "content": "---\nseo:\n  title: How To Migrate From v2 to v3 Mail Send\n  description:\n  keywords: migration, v2 mail send, v3 mail send, upgrade\ntitle: How To Migrate From v2 to v3 Mail Send\ngroup: api-v2\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n## Why should you migrate?\n\n<call-out>\n\nIf you are currently using the [Web API v2 mail send endpoint](https://www.twilio.com/docs/sendgrid/api/v2/mail), we recommend that you upgrade to the [latest version](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\n\n</call-out>\n\nWith a few quick changes you will be able to take advantage of the improvements and added features provided by the v3 mail send endpoint, such as:\n\n- Simple, intuitive, and consistent request body format.\n- Sandbox Mode allows you to test and validate your email.\n- Improved error reporting and documentation.\n- Extensive code examples in each of our [libraries]({{root_url}}/for-developers/sending-email/libraries/) to help you integrate quickly.\n\n<iframe src=\"https://player.vimeo.com/video/168940206\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n## What do you need to migrate?\n\nAll you need to migrate from the v2 to v3 mail send endpoint is a SendGrid account.\n\nIf you are a new SendGrid user and haven’t begun sending email yet, please go straight to our [v3 Mail Send documentation](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) to get started.\n\n## JSON Schema\n\nSome of the biggest improvements made to the mail send endpoint reside in the JSON schema used to format and submit the data payload for your email. While the v2 mail send endpoint relies on a combination of JSON and SendGrid’s x-smtpapi headers, all content and metadata sent via the v3 mail send endpoint is defined using JSON within a single request body.\n\nBelow you will find a visual comparison of the v2 and v3 JSON schemas that highlights equivalent parameters between the 2 versions and any parameters that have been added or removed. Significant additions include the \"personalizations\", \"sandbox_mode\", and \"bypass_list_management\" parameters.\n\nFor a more detailed discussion of these new parameters, please visit the [v3 Mail Send Overview](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\n\n![]({{root_url}}/images/v2_vs_v3_mail_send_ga.png)\n\nOne of the more prominent changes you may notice, is that many of the settings that were previously handled by SendGrid’s [x-smtpapi]({{root_url}}/for-developers/sending-email/building-an-smtp-email/) are now defined explicitly within the JSON schema of the request body to the mail send endpoint.\n\nPreviously, the only way to specify custom handling instructions for your email was to include individual blocks of JSON for each \"setting\" or \"app\" that you wanted to use according to the [SMTP API]({{root_url}}/for-developers/sending-email/building-an-smtp-email/).\n\nFor example, if you wanted to schedule an email to be sent at a certain time using the v2 mail send endpoint, your request body would look like:\n\n```\napi_user=YOUR_USER_NAME&\napi_key=YOUR_PASSWORD&\nto=john.doeexampexample@example.com&\ntoname=John&\nsubject=Hello, World!&\ntext=Hello, World!&\nfrom=from_address@example.com\nx-smtpapi={\"send_at\":1459728000}\n```\n\nHowever, the equivalent API call for the the v3 mail send endpoint would look like:\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john.doeexampexample@example.com\"\n        }\n      ],\n      \"subject\": \"Hello, World!\",\n      \"send_at\": 1459728000\n    }\n  ],\n  \"from\": {\n    \"email\": \"from_address@example.com\"\n  },\n  \"content\": {\n    \"type\": \"text/plain\",\n    \"value\": \"Hello, World!\"\n  }\n}\n```\n\nNotice that while the call to the v2 Mail Send endpoint does include JSON, it is only defined from within the x-smtpapi parameter, whereas the entire payload for the v3 Mail Send API Call is formatted in JSON.\n\n## Requirements and Limitations\n\nThere are few limitations and requirements differences between the v2 and v3 mail send endpoints, making it even easier to migrate your integration to the latest version.\n\n\n## Attachments\n\nAttachments are handled differently between the v2 and v3 Mail Send endpoints. When attaching files in an email sent over the v2 Mail Send endpoint, you simply needed to attach your file to the transport and specify the file names and content IDs of those files in your API call. Essentially, you specified which files you were attaching in the API call, but the files were actually sent differently.\n\nWhen attaching files to an email sent over the v3 Mail Send endpoint, you must include the BASE64 encoded content of your file, file type, filename, disposition, and content_id for each file you are attaching. These are all defined as separate objects within the `attachments` array.\n\nFor example, when attaching a single file named \"example_file.jpg\", the `attachments` object would look like:\n\n```json\n{\n  \"attachments\": [\n    {\n      \"content\": \"[BASE64 encoded content block here]\",\n      \"type\": \"jpg\",\n      \"name\": \"example_file\",\n      \"filename\": \"example_file.jpg\",\n      \"disposition\": \"inline\",\n      \"content_id\": \"[THE CONTENT ID OF YOUR FILE]\"\n    }\n  ]\n}\n```\n\nMore Resources\nFor additional resources on the v3 Mail Send endpoint, please first visit our other documentation on the v3 Mail Send endpoint:\n\n- [V3 Mail Send Overview](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send)\n- [Upgrading your Authentication to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/)\n- [SandBox Mode]({{root_url}}/for-developers/sending-email/sandbox-mode/)\n- [Errors](https://sendgrid.api-docs.io/v3.0/mail-send/mail-send-errors)\n- [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/)\n- [cURL Examples for Common Use Cases]({{root_url}}/for-developers/sending-email/curl-examples/)\n\nYou may also visit our [Support page](https://support.sendgrid.com/hc/en-us).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/modx.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: MODX\ngroup: open-source\nnavigation:\n  show: true\n---\n\nMODX supports sending email over SMTP. To have MODX relay email through SendGrid go to *System Settings \\> 'Mail' area* and change:\n\n-   **SMTP Authentication** - Yes\n-   **SMTP Hosts** - smtp.sendgrid.net\n-   **SMTP Password** - sendgrid_api_key\n-   **SMTP Port** - 587\n-   **SMTP Connection Prefix** - tls\n-   **SMTP User** - sendgrid_username (use `apikey` for v3 API or later)\n-   **Use SMTP** - Yes\n\nThe following image shows these settings.\n\n![MODX SMTP with SendGrid]({{root_url}}/images/modx.png \"MODX SMTP with SendGrid\")\n\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/outlook-2013.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Outlook 2013\ngroup: mail-clients\nnavigation:\n  show: true\n---\n\nThese instructions will walk you through how to add an SMTP server to an existing Outlook 2013 setup, but you can also add these settings at the account creation stage.\n\nSelect **File** and then select **Account and Social Network Settings**. Click  **Account Settings**.\n\n![]({{root_url}}/images/outlook_2013_1.png \"Account Settings\")\n\nThe 'Account Settings’ window appears. Select the account you receive email through and click  **Change**.\n\n![]({{root_url}}/images/outlook_2013_2.png \"Change Email\")\n\nThe 'Change E-mail Account’ window appears. This setting (in the red rectangle below) needs to be set for our SMTP address. Outgoing Mail Server smtp.sendgrid.net\nUnder Login Information, please enter your SendGrid username and API key.\n\n<call-out>\n\nYour SendGrid username may not necessarily be an email address. If your SendGrid username is example_user, enter example_user in the User Name field, not your email address.\n\n</call-out>\n\n![]({{root_url}}/images/outlook_2013_3.png \"Change Account\")\n\nNext, click **More Settings** and enter the information as shown below. (Keep in mind you can also use port 25 with no security or 587 with TLS security.)\n\nUnder the “Outgoing Server Tab”, select **My outgoing server (SMTP) requires authentication**. Click **Log on using** and enter your SendGrid Username and API key. Click **OK** and the 'Change E-mail Account’ window appears.\n\n![]({{root_url}}/images/outlook_2013_4.png \"Internet Email Settings\")\n\nOnce you are back on the Change Account screen, click **Next** to test that everything is setup correctly.\n\n![]({{root_url}}/images/outlook_2013_5.png \"Click Next\")\n\nIf everything checks out correct then you should see this.\n\n![]({{root_url}}/images/outlook_2013_6.png \"All tests completed successfully\")\n\nYou should be all set at this point. If you need more assistance, please [contact support](https://support.sendgrid.com/hc/en-us).\n\n![]({{root_url}}/images/outlook_2013_7.png \"Congratulations\")\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/outlook.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Outlook 2007\ngroup: mail-clients\nnavigation:\n  show: true\n---\n\nThese instructions will walk you through how to add an SMTP server to an existing Outlook setup, but you can also add these settings at the account creation stage.\n\nClick **Tools** and then select **Account Settings**.\n\n![]({{root_url}}/images/outlook_2007_1.png \"Tools_Acctsettings\")\n\nThe 'Account Settings' window appears. Select the account you receive email through and click **Change**.\n\n![]({{root_url}}/images/outlook_2007_2.png \"AcctSetEmAccts\")\n\nThe following 'Change E-mail Account' window appears. This setting (in the red rectangle below) needs to be set for our SMTP address.\n\n![]({{root_url}}/images/outlook_2007_3.png \"IntMail_Settings\")\n\nAfter you are finished, click  **More Settings**. The following 'Internet E-mail Settings' window appears. Click **Outgoing Server** and input the settings shown (username and API key are your SendGrid credentials).\n\n<call-out>\n\nYour SendGrid username may not necessarily be an email address. If your SendGrid username is example_user, enter example_user in the User Name field, not example_user@sendgrid.com.\n\n</call-out>\n\n![]({{root_url}}/images/outlook_2007_4.png \"IntMail_Settings_2\")\n\nNext, click **Advanced** and enter the information as shown below. (Keep in mind you can also use port 25 with no security or 587 with TLS security.)\n\n![]({{root_url}}/images/outlook_2007_5.png \"IntMail_Settings_3\")\n\nClick **OK**. You should return to the 'Change E-mail Account' window. Click **Test Account Settings** to verify you are able to receive and send mail successfully.\n\n![]({{root_url}}/images/outlook_2007_6.png \"TestSettings\")\n\nYou should see the results below; if you do not, verify your settings are correct. Click **Close** button.\n\n![]({{root_url}}/images/outlook_2007_7.png \"CloseTest\")\n\nClick **Next** and then **Finish** to complete the setup.\n\n![]({{root_url}}/images/outlook_2007_8.png \"WizFinish\")\n\nYou are all set to send mail through us.\n\n<call-out>\n\nUnfortunately, there is not an easy way to add SMTP API headers to a message in Outlook 2007.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/personalizations.md",
    "content": "---\nseo:\n  title: Personalizations\n  description: Learn how to use personalizations to customize your messages sent over the Web API v3.\n  keywords: personalizations, v3 mail send\ntitle: Personalizations\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nWhen sending an email with the v3 Mail Send endpoint, you define the various metadata about your message, such as the recipients, sender, subject, and send time, at the root level of a JSON request body. Personalizations allow you to override these various metadata for each email in an API request.\n\nPersonalizations is an array of objects. Think of the personalizations array like the envelope of a letter: the fields defined within personalizations apply to each email, not the recipient. Like an envelope, personalizations are used to identify who should receive the email as well as details about how you would like the email to be handled. For example, you can define when you would like it to be sent, what headers you would like to include, and any substitutions or custom arguments you would like to be included with the email.\n\nPersonalizations allow you to define:\n\n- \"to\", \"cc\", \"bcc\" - The recipients of your email.\n- \"from\" - The sender or _return path_ address of your email.\n- \"subject\" - The subject of your email.\n- \"headers\" - Any headers you would like to include in your email.\n- \"substitutions\" - Any substitutions you would like to be made for your email.\n- \"custom_args\" - Any custom arguments you would like to include in your email.\n- \"send_at\" - A specific time that you would like your email to be sent.\n\n<call-out>\n\nYou must include at least one `to` object within the personalizations array.\n\n</call-out>\n\nSince the `personalizations` property is an array, you may include multiple objects allowing you to specify different handling instructions for different copies of your email. For example, you could send the same email to both `john@example.com` and `jane@example.com` but set each email to be delivered at different times.\n\n```json\n{\n  \"from\": \"sender@yourdomain.com\",\n  \"template_id\": \"YOUR TEMPLATE ID\",\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john@example.com\"\n        }\n      ],\n      \"send_at\": 1600188812\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane@example.com\"\n        }\n      ],\n      \"send_at\": 1600275471\n    }\n  ]\n}\n```\n\n<call-out>\n\nYou may not include more than 1000 personalizations per API request. If you need to include more than 1000 personalizations, please divide these across multiple API requests.\n\n</call-out>\n\nSome properties can be defined both at the root level of the request body (message level) and at the personalizations level.\n\nFor example, the `from`, `subject`, `headers`, `custom_arg`, and `send_at` properties can all be defined at the message level or at the personalizations level. Individual fields within the `personalizations` array will override any message level properties that are defined outside of personalizations. For example, the email subject defined within personalizations will override the subject defined at the message level in the JSON payload.\n\nKeys within objects such as `custom_args` will be merged. If any of the keys conflict, the keys in the `personalizations` object will replace the message level object’s keys.\n\n<call-out>\n\nAll of the recipients in a single personalization object (specified in the `to`, `cc`, or `bcc` fields) will see the same email, as defined by the data in that personalization. Because of this, SendGrid does not allow duplicate email addresses among these three recipient arrays in a single personalization.\n\n</call-out>\n\nBelow are some examples of how you can use personalizations for various use cases.\n\n## Personalization Examples\n\n- [Sending a single email to a single recipient](#sending-a-single-email-to-a-single-recipient)\n- [Sending a single email to a single recipient with substitutions](#sending-a-single-email-to-a-single-recipient-with-substitutions)\n- [Sending a single email to a single recipient with a CC](#sending-a-single-email-to-a-single-recipient-with-a-cc)\n- [Sending a single email to a single recipient with a CC and a BCC](#sending-a-single-email-to-a-single-recipient-with-a-cc-and-a-bcc)\n- [Sending a single email from a single sender to multiple recipients](#sending-the-same-email-to-multiple-recipients)\n- [Sending a single email from a single sender to a single recipient with multiple CCs/BCCs](#sending-a-single-email-to-a-single-recipient-with-multiple-ccs/bccs)\n- [Sending two different emails to two different groups of recipients](#sending-two-different-emails-to-two-different-groups-of-recipients)\n- [Sending multiple emails from multiple senders to multiple recipients](#sending-multiple-emails-from-multiple-senders-to-multiple-recipients)\n\n### Sending a single email to a single recipient\n\nThe following example shows you what the personalization property would look like if you wanted to send a single email to a single recipient.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending a single email to a single recipient with substitutions\n\nThe following example shows you what the personalization property would look like if you wanted to send a single email to a single recipient with substitutions.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient@example.com\"\n        }\n      ],\n      \"substitutions\": {\n        \"%fname%\": \"recipient\",\n        \"%CustomerID%\": \"CUSTOMER ID GOES HERE\"\n      },\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending a single email to a single recipient with a CC\n\nThe following example shows how to send one email to `recipient1@example.com` with a carbon copy sent to `recipient2@example@com`. Both emails will have the same headers.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient1@example.com\"\n        }\n      ],\n      \"cc\": [\n        {\n          \"email\": \"recipient2@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending a single email to a single recipient with a CC and a BCC\n\nThe following example shows how to send one email to `recipient1@example.com` with a CC sent to `recipient2@example.com` and a BCC sent to `recipient3@example.com`.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient1@example.com\"\n        }\n      ],\n      \"cc\": [\n        {\n          \"email\": \"recipient2@example.com\"\n        }\n      ],\n      \"bcc\": [\n        {\n          \"email\": \"recipient3@example.com\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### Sending the same email to multiple recipients\n\nThe following shows how to send one email to three different recipients: `recipient1@example.com`, `recipient2@example.com`, and `recipient3@example.com`. These recipients will all be able to see each other on the email.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient1@example.com\"\n        },\n        {\n          \"email\": \"recipient2@example.com\"\n        },\n        {\n          \"email\": \"recipient3@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending a single email to a single recipient with multiple CCs and BCCs\n\nThe following shows what personalizations are required to send the same email to one recipient, with multiple CCs and BCCs.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient1@example.com\"\n        }\n      ],\n      \"cc\": [\n        {\n          \"email\": \"recipient2@example.com\"\n        },\n        {\n          \"email\": \"recipient3@example.com\"\n        },\n        {\n          \"email\": \"recipient4@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending two different emails to two different groups of recipients\n\nThe following shows how to send two different emails to two different groups of recipients.\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient1@example.com\"\n        }\n      ],\n      \"cc\": [\n        {\n          \"email\": \"recipient2@example.com\"\n        },\n        {\n          \"email\": \"recipient3@example.com\"\n        },\n        {\n          \"email\": \"recipient4@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"recipient5@example.com\"\n        }\n      ],\n      \"cc\": [\n        {\n          \"email\": \"recipient6@example.com\"\n        },\n        {\n          \"email\": \"recipient7@example.com\"\n        },\n        {\n          \"email\": \"recipient8@example.com\"\n        }\n      ],\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\"\n    }\n  ]\n}\n```\n\n### Sending multiple emails from multiple senders to multiple recipients\n\nIt is possible to specify multiple From addresses using personalizations. If a personalization object does not contain a `from` object, SendGrid will use the `email` address in the `from` object defined at the root level of the request body.\n\nTo successfully deliver email using multiple From addresses, the following conditions must be met.\n\n- A `from` object with an `email` property must be specified at the root level of the request body.\n- The domain of the `from` `email` property specified in any personalization must match the domain of the `from` `email` property specified at root level of the request body—SendGrid will reject requests if these domains do not match.\n\n```json\n// This is valid\n{\n  \"from\": {\n    \"email\": \"support@example.com\"\n  },\n  \"personalizations\": [\n    {\n      \"from\": {\n        \"email\": \"noreply@example.com\"\n      }\n    }\n  ]\n}\n\n// This is invalid\n{\n  \"from\": {\n    \"email\": \"support@example.com\"\n  },\n  \"personalizations\": [\n    {\n      \"from\": {\n        \"email\": \"noreply@differentexample.com\"\n      }\n    }\n  ]\n}\n```\n\nThe following shows how to send multiple emails using three different `from` addresses on the same domain.\n\n<call-out type=\"warning\">\n\nYou must complete [domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) to send email from multiple addresses. SendGrid will reject requests from a sending domain that has not been authenticated.\n\n</call-out>\n\n```json\n{\n  \"from\": {\n    \"email\": \"default@samedomain.com\"\n  },\n  \"personalizations\": [\n    {\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\",\n      \"to\": [\n        {\n          \"email\": \"recipient1@example1.com\"\n        }\n      ],\n      \"from\": {\n        \"email\": \"sender1@samedomain.com\"\n      }\n    },\n    {\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\",\n      \"to\": [\n        {\n          \"email\": \"recipient2@example2.com\"\n        }\n      ],\n      \"from\": {\n        \"email\": \"sender2@samedomain.com\"\n      }\n    },\n    {\n      \"subject\": \"YOUR SUBJECT LINE GOES HERE\",\n      \"to\": [\n        {\n          \"email\": \"recipient3@example3.com\"\n        }\n      ],\n      \"from\": {\n        \"email\": \"sender3@samedomain.com\"\n      }\n    }\n  ]\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/phpbb.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: phpBB\ngroup: open-source\nnavigation:\n  show: true\n---\n\nphpBB supports sending email over SMTP. To have phpBB relay email through SendGrid go to *Client Communication \\> E-mail settings* in the admin panel and change:\n\n-   **Use SMTP server for e-mail** - Yes\n-   **SMTP server address:** - smtp.sendgrid.net\n-   **SMTP server port** - 587\n-   **Authentication method for SMTP** - PLAIN\n-   **SMTP username** - sendgrid_username\n-   **SMTP api_key** - sendgrid_api_key\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/piesync.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: plugins\ntitle: Sync your SendGrid contacts using PieSync\nnavigation:\n  show: true\nseo:\n  title: Sync your SendGrid contacts using PieSync\n  description: Learn how to keep your SendGrid contacts in sync with 100+ other apps using PieSync\n  keywords: integrate, tutorial, contact sync, PieSync, Mailchimp, Zendesk, Salesforce, HubSpot, Quickbooks\n---\n\nFollow these steps to set up a sync:\n\n1. [Create a PieSync account](#-Create-a-PieSync-account)\n2. [Select your apps](#Select-your-apps)\n3. [Authorize your apps](#Authorize-your-apps)\n4. [Set up your sync configuration](#Set-up-your-sync-configuration)\n\n\n## Create a PieSync account\n\nPieSync is free during a 14 day trial, and is a paid service after. Check beforehand if your app is one of [the many available apps supported by PieSync](https://www.piesync.com/sendgrid). You can sign up for a PieSync account directly [here](https://app.piesync.com/referrer/2gc9v) to get $50 off your first PieSync invoice(s).\n\n\n## Select your apps\n\nSelect SendGrid and the app you would like to sync with from within the PieSync application.\n\n\n## Authorize your apps\n\nTo authorize, follow the steps as described and make sure you have your [API Key]({{root_url}}/ui/account-and-settings/api-keys/) before getting started.\n\nIf you have already authorized SendGrid account(s) in the past or have another PieSync integration, you can skip the first part of the authorization and choose from your **Connected Accounts**.\n\n![]({{root_url}}/img/piesync-verify-api-key.png \"Verify your SendGrid API Key\")\n\n## Set up your sync configuration\n\nFrom within the connection setup screen, you'll be able to manage the following:\n\n### Filters and actions\n\n```\n[IF] Supported Conditions/Filters\n   ALREADY EXISTING IN APP YOU SYNC WITH\n   FIELD VALUES (INCLUDING CUSTOM FIELDS)\n```\n\n```\n[THEN] Supported Actions\n   UPDATING FIELD VALUES (INCLUDING CUSTOM FIELDS)\n```\n\n![]({{root_url}}/img/piesync-if-then-filters.png \"Add then filters\")\n\n### Default Mapping\n\nDepending on the other app you're syncing with, you'll see a number of standard SendGrid fields being mapped by default. For instance, in a connection with Google Contacts, the default field mapping looks like this:\n\n![]({{root_url}}/img/piesync-default-fields.png \"Standard fields\")\n\n\n### Customizable Field Mapping\n\nYou can custom map your SendGrid Custom Fields and any additional standard fields that aren't included in the default mapping yet. Remember, a mapping between 2 fields can only exist if the types of fields are compatible, and the particular compatibility will determine the direction of the mapping. See our documentation [Customizable Field Mapping](https://help.piesync.com/features/new-customizable-field-mapping) for more information.\n\n![]({{root_url}}/img/piesync-field-mapping.png \"Field mapping\")\n\n## Additional Resources\n\n- [Learn More](https://www.piesync.com/sendgrid/)\n- [PieSync Help Desk](https://help.piesync.com/connector-apps/send-grid)\n- [Free PieSync 14-day trial including USD 50 voucher!](https://app.piesync.com/referrer/2gc9v)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/postfix.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Postfix\ngroup: mail-servers\nseo:\n  title: Integrate SendGrid with Postfix - SendGrid Documentation | SendGrid\n  description: Setup SendGrid as a Postfix relay host for better deliverability and advanced statistics on your email.\nnavigation:\n  show: true\n---\n\nUpdating the Postfix configuration to use SendGrid as a relay host is easy. For more advanced configuration scenarios, you'll need to refer to the Postfix documentation.\n\n<call-out type=\"warning\">\n\nSome implementations of Postfix only allow passwords to contain letters and numbers, meaning you may need to ensure your SendGrid password is only alphanumeric.\n\n</call-out>\n\nFind your Postfix config file, typically **/etc/postfix/main.cf**, and add the following:\n\n```\nsmtp_sasl_auth_enable = yes\nsmtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd\nsmtp_sasl_security_options = noanonymous\nsmtp_sasl_tls_security_options = noanonymous\nsmtp_tls_security_level = encrypt\nheader_size_limit = 4096000\nrelayhost = [smtp.sendgrid.net]:587\n```\n\n<call-out>\n\nWe highly recommend using an API key as your credential for any service that supports it. API keys are both more secure and easier to work with.\n\n</call-out>\n\nNow you need to specify your credentials (use `apikey` as username and an API Key as password) in the separate file **/etc/postfix/sasl_passwd** (you'll likely need to create it):\n\n```\n[smtp.sendgrid.net]:587 apikey:yourSendGridApiKey\n```\n\nNext, make sure the file has restricted read and write access only for root, and use the `postmap` command to update Postfix's hashtables to use this new file:\n\n```bash\n$ sudo chmod 600 /etc/postfix/sasl_passwd\n$ sudo postmap /etc/postfix/sasl_passwd\n```\n\nFinally, restart Postfix:\n```bash\n$ sudo systemctl restart postfix\n```\n\n\n<call-out>\n\nIf you are getting ***no mechanism available*** error messages, it generally indicates that you are missing some SASL authentication libraries.\n\n</call-out>\n\nInstall the missing module dependency using apt-get (i.e., Debian, Ubuntu):\n\n```bash\n$ apt-get install libsasl2-modules\n```\n\n Or using a yum (i.e., RedHat, Fedora, CentOS):\n\n```bash\n$ yum install cyrus-sasl-plain\n```\n\n## Troubleshooting\n \t\nIf port 587 is not working for you, please try 2525 in your postfix config. You may also need to edit /etc/postfix/master.cf to remove # from `tlsmgr unix - - n 1000? 1 tlsmgr`. \n\nFor other potential errors, please navigate to the default maillog file on your server for debugging purposes. For a CentOS server, the file is in path /var/log/maillog by default. \n\nThis file not only reports that the server was unable to use SendGrid to send email but also serves as an excellent debugging tool for new users that catalogues server parameters.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/qmail.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Qmail\ngroup: mail-servers\nnavigation:\n  show: true\n---\n\nQmail does not come with SMTP authentication functionality installed. However you can add [the netqmail TLS+SMTPauth patch](http://notes.sagredo.eu/node/84).\n\nAlternately, you can [take a look at Fehcom's very complete description of authentication on mail servers](http://www.fehcom.de/qmail/smtpauth.html), or just jump down to the section about [configuring SMTPAUTH for qmail](https://www.fehcom.de/qmail/smtpauth.html##SETUP).\n\nIn general, you will need to add the following to **/var/qmail/control/smtproutes**, but you should verify the actual path and file you need to update.\n\n```\n :smtp.sendgrid.net:587 username api_key\n```\n\nAs with all configuration changes, make sure to restart qmail.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/quickstart-go.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Go\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Email API Quickstart for Go\n  description: Sending your first email using the SendGrid REST API and Go.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, Go, Golang.\n---\n\nIn this quickstart, you'll learn how to send your first email using the [Twilio SendGrid Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) and [Go](https://golang.org/).\n\n## Prerequisites\n\nBe sure to perform the following prerequisites to complete this tutorial. You can skip ahead if you've already completed these tasks.\n\n1. Sign up for a SendGrid account.\n2. Enable Two-factor authentication.\n3. Create and store a SendGrid API Key with **Mail Send** > **Full Access** permissions.\n4. Complete Domain Authentication.\n5. Install Go.\n\n<a href=\"#starting-the-project\" class=\"btn btn-primary\">Skip the prerequisites</a>\n\n### Sign up for a SendGrid account\n\nWhen you sign up for a free [SendGrid account](https://signup.sendgrid.com/), you'll be able to send 100 emails per day forever. For more account options, see our [pricing page](https://sendgrid.com/pricing/).\n\n### Enable Two-factor authentication\n\nTwilio SendGrid requires customers to enable Two-factor authentication (2FA). You can enable 2FA with SMS or by using the [Authy](https://authy.com/) app. See the [2FA section of our authentication documentation]({{root_url}}/for-developers/sending-email/authentication/#two-factor-authentication) for instructions.\n\n### Create and store a SendGrid API key\n\nUnlike a username and password — credentials that allow access to your full account — an API key is authorized to perform a limited scope of actions. If your API key is compromised, you can also cycle it (delete and create another) without changing your other account credentials.\n\nVisit our [API Key documentation]({{root_url}}/ui/account-and-settings/api-keys/) for instructions on creating an API key and [storing an API key in an environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable). To complete this tutorial, you can create a Restricted Access API key with **Mail Send** > **Full Access** permissions only, which will allow you to send email and schedule emails to be sent later. You can edit the permissions assigned to an API key later to work with additional services.\n\nOnce your API key is assigned to an environment variable — this quickstart uses `SENDGRID_API_KEY` — you can proceed to the next step.\n\n```shell\nexport SENDGRID_API_KEY=<Your API Key>\n```\n\n### Verify your Sender Identity\n\nTo ensure our customers maintain the best possible sender reputations and to uphold legitimate sending behavior, we require customers to verify their [Sender Identities]({{root_url}}/for-developers/sending-email/sender-identity/) by completing [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A Sender Identity represents your 'From' email address—the address your recipients see as the sender of your emails.\n\n<call-out>\n\nTo get started quickly, you may be able to skip Domain Authentication and begin by completing [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification). Single Sender Verification is recommended for testing only. Some email providers have [DMARC]({{root_url}}/glossary/dmarc) policies that restrict email from being delivered using their domains. For the best experience, please complete Domain Authentication. Domain Authentication is also required to upgrade from a free account. To better understand why Domain Authentication is necessary, see our [\"Spoofing\"]({{root_url}}/glossary/spoofing/) and [\"Everything about DMARC\"]({{root_url}}/ui/sending-email/dmarc/) articles.\n\n</call-out>\n\n### Go\n\nBefore installing Go, you can see if you already have a version on your machine.\n\n<call-out>\n\nThe Twilio SendGrid Go helper library requires Go version 1.7 or later.\n\n</call-out>\n\n#### Go version check\n\nCheck your Go version by opening your terminal (also known as a command line, or console) and typing the following command.\n\n```shell\ngo version\n```\n\nIf you have Go installed, the terminal will print something like the following output.\n\n```shell\ngo version go1.15.7 darwin/amd64\n```\n\n#### Install Go\n\nIf you do not already have a version of Go installed, visit the [Go website](https://golang.org/dl/) to download and install a version appropriate for your operating system.\n\n## Starting the project\n\nUsing a [Twilio SendGrid helper library](https://github.com/sendgrid/sendgrid-go) is the fastest way to deliver your first email.\n\nStart by creating a project folder for this app. The following examples will use a folder called `sendmail`.\n\n```shell\nmkdir sendmail\n```\n\nNext, navigate into the sendmail directory where you will complete the rest of the tutorial.\n\n```shell\ncd sendmail\n```\n\nThis quickstart assumes you are using [Go Modules](https://blog.golang.org/using-go-modules) to manage your Go project and dependencies. If you prefer to use the `$GOPATH` workspace, the Twilio SendGrid helper library will still work, but the project creation steps that follow will differ slightly from your setup.\n\n<call-out>\n\nThere are multiple ways to handle projects and their dependencies when writing Go. Beginning with version 1.11, Go introduced Go Modules as an official dependency management tool. For more information about Go dependencies, see [\"Migrating to Go Modules\"](https://blog.golang.org/migrating-to-go-modules).\n\n</call-out>\n\n### Initialize your project\n\nThe Go [mod](https://golang.org/ref/mod) package manager is included as part of the Go standard library beginning with version 1.11. You can use the `mod` command to initialize your project. You must pass `mod` a path for your module. The following examples will use `example.com/sendgrid/sendmail`, but you will use the path appropriate for your project. For example, if you intend to store your project on GitHub under the username `sg_gopher`, your path will be `github.com/sg_gopher/sendmail`.\n\n```shell\ngo mod init example.com/sendgrid/sendmail\n```\n\nYou will now have a `go.mod` file that lists the path for your module and the version of Go used to create it. You will also have a `go.sum` file that stores a cryptographic hash for the content of each dependency in your project.\n\nNext, use the `go get` command to install the Twilio SendGrid helper library and save it as a project dependency.\n\n### Install the helper library\n\n```shell\ngo get github.com/sendgrid/sendgrid-go\n```\n\nThe terminal will print something like the following output.\n\n```shell\ngo: github.com/sendgrid/sendgrid-go upgrade => v3.7.2+incompatible\ngo: finding module for package github.com/sendgrid/rest\ngo: found github.com/sendgrid/rest in github.com/sendgrid/rest v2.6.2+incompatible\n```\n\nYour `go.mod` file will now include the Twilio SendGrid `sendgrid-go` and `rest` libraries as project dependencies.\n\n## Send an email\n\nYou're now ready to write some code. First, create a `main.go` file in your project directory.\n\n### Complete code block\n\nThe following Go block contains all the code needed in your `main.go` file to successfully deliver a message with the SendGrid Mail Send API. You can copy this code, modify the `to` and `from` variables, and run the code if you like. We'll break down each piece of this code in the following sections.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/sendgrid/sendgrid-go\"\n\t\"github.com/sendgrid/sendgrid-go/helpers/mail\"\n)\n\nfunc main() {\n\tfrom := mail.NewEmail(\"Tira\", \"tiramisu@example.com\") // Change to your verified sender\n\tsubject := \"Sending with Twilio SendGrid is Fun\"\n\tto := mail.NewEmail(\"Sou\", \"souffle@example.com\") // Change to your recipient\n\tplainTextContent := \"and easy to do anywhere, even with Go\"\n\thtmlContent := \"<strong>and easy to do anywhere, even with Go</strong>\"\n\tmessage := mail.NewSingleEmail(from, subject, to, plainTextContent, htmlContent)\n\tclient := sendgrid.NewSendClient(os.Getenv(\"SENDGRID_API_KEY\"))\n\tresponse, err := client.Send(message)\n\tif err != nil {\n\t\tlog.Println(err)\n\t} else {\n\t\tfmt.Println(response.StatusCode)\n\t\tfmt.Println(response.Headers)\n\t}\n}\n```\n\n### Build your API call\n\nYour API call must have the following components.\n\n- A host (the host for Web API v3 requests is always `https://api.sendgrid.com/v3/`)\n- An API key passed in an Authorization Header\n- A request (when submitting data to a resource via `POST` or `PUT`, you must submit your request body in JSON format)\n\nIn your `main.go` file, set the package to `main`, import the SendGrid helper library, and import the SendGrid mail helper from the library. The library will handle setting the Host, `https://api.sendgrid.com/v3/`, for you.\n\n```go\npackage main\n\nimport(\n\t\"github.com/sendgrid/sendgrid-go\"\n\t\"github.com/sendgrid/sendgrid-go/helpers/mail\"\n)\n```\n\nNext, declare a function named `main`. This function is where you will build your email message and make a request to the Twilio SendGrid Mail Send API.\n\n```go\nfunc main() {\n\n}\n```\n\nNow you're ready to set up the `from`, `to`, `subject`, and message body `htmlContent`. These values are passed to the API in a [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/) object when using the v3 Mail Send API. You can assign each of these values to variables, and the SendGrid library will handle creating a `personalizations` object for you. Be sure to set the `to` variable to an email address with an inbox you can access.\n\nThe `subject` and `htmlContent` variables are just strings. However, you will set the `from` and `to` variables using the helper library's `NewEmail` constructor. The `NewEmail` constructor takes two arguments, a `name` and an `address`.\n\n<call-out>\n\nNotice that there is a `plainTextContent` and an `htmlContent` variable in the full code block. Only one of these values is needed. If you include both variables, only the `htmlContent` value will be used as the body text of your email.\n\n</call-out>\n\n```go\nfrom := mail.NewEmail(\"Tira\", \"tiramisu@example.com\") // Change to your verified sender\nsubject = \"Sending with SendGrid is Fun\"\nto := mail.NewEmail(\"Sou\", \"souffle@example.com\") // Change to your recipient\nhtmlContent := \"<strong>and easy to do anywhere, even with Go</strong>\"\n```\n\nTo properly construct the message, pass each of the previous variables into the SendGrid library's `NewSingleEmail` function. You can assign this to a variable named `message`.\n\n```go\nmessage := mail.NewSingleEmail(from, subject, to, htmlContent)\n```\n\nNext, use the API key you set up earlier. Remember, the API key is stored in an environment variable, so you can use the `os.Getenv()` method to access it. This means you also need to import Go's os library.\n\n```go\nimport (\n\t\"os\"\n)\n```\n\nAssign the key to a variable named `client` using the helper library's `NewSendClient` method. The helper library will pass your key to the v3 API in an Authorization header using Bearer token authentication.\n\n```go\nclient := sendgrid.NewSendClient(os.Getenv(\"SENDGRID_API_KEY\"))\n```\n\nLastly, you need to make a `POST` request to the SendGrid Mail Send API to deliver your message. The SendGrid helper library provides a `Send` function from [SendGrid's REST library](https://github.com/sendgrid/rest) to make this request. Call the `Send` method on the `client` and pass in your `message` as an argument.\n\n```go\n# Send an HTTP POST request to /mail/send\nclient.Send(message)\n```\n\nYou can also print the response status code and headers. Import the fmt and log libraries to do this. You can then assign your `client.Send` call to `response` and `err` variables for logging.\n\n```go\nimport (\n\t\"fmt\"\n\t\"log\"\n)\n\nresponse, err := client.Send(message)\n\tif err != nil {\n\t\tlog.Println(err)\n\t} else {\n\t\tfmt.Println(response.StatusCode)\n\t\tfmt.Println(response.Headers)\n}\n```\n\nWith all this code in place, you can run your `main.go` file in your terminal to send the email.\n\n```go\ngo run main.go\n```\n\nIf you receive a [`202` status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202) printed to the console, your message was sent successfully. Check the inbox of the `to` address, and you will see your demo message.\n\nIf you don’t see the email, you may need to check your spam folder.\n\n### Troubleshooting\n\nIf you receive an error message, you can reference our [response message documentation](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes) for clues about what may have gone wrong.\n\n#### API Response messages\n\nAll responses are returned in JSON format. We specify this by sending the Content-Type header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next Steps\n\nThis is just the beginning of what you can do with our APIs. To learn more, check the resources below.\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [The Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Twilio SendGrid helper library for Go](https://github.com/sendgrid/sendgrid-go)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/quickstart-nodejs.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Node.js\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Email API Quickstart for Node.js\n  description: Sending your first email using the SendGrid REST API and Node.js.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, Node.js, JavaScript\n---\n\nIn this quickstart, you'll learn how to send your first email using the [Twilio SendGrid Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) and [Node.js](https://nodejs.org/).\n\n## Prerequisites\n\nBe sure to perform the following prerequisites to complete this tutorial. You can skip ahead if you've already completed these tasks.\n\n1. Sign up for a SendGrid account.\n2. Enable Two-factor authentication.\n3. Create and store a SendGrid API Key with **Mail Send** > **Full Access** permissions.\n4. Complete Domain Authentication.\n5. Install Node.js.\n\n<a href=\"#starting-the-project\" class=\"btn btn-primary\">Skip the prerequisites</a>\n\n### Sign up for a SendGrid account\n\nWhen you sign up for a free [SendGrid account](https://signup.sendgrid.com/), you'll be able to send 100 emails per day forever. For more account options, see our [pricing page](https://sendgrid.com/pricing/).\n\n### Enable Two-factor authentication\n\nTwilio SendGrid requires customers to enable Two-factor authentication (2FA). You can enable 2FA with SMS or by using the [Authy](https://authy.com/) app. See the [2FA section of our authentication documentation]({{root_url}}/for-developers/sending-email/authentication/#two-factor-authentication) for instructions.\n\n### Create and store a SendGrid API key\n\nUnlike a username and password — credentials that allow access to your full account — an API key is authorized to perform a limited scope of actions. If your API key is compromised, you can also cycle it (delete and create another) without changing your other account credentials.\n\nVisit our [API Key documentation]({{root_url}}/ui/account-and-settings/api-keys/) for instructions on creating an API key and [storing an API key in an environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable). To complete this tutorial, you can create a Restricted Access API key with **Mail Send** > **Full Access** permissions only, which will allow you to send email and schedule emails to be sent later. You can edit the permissions assigned to an API key later to work with additional services.\n\nOnce your API key is assigned to an environment variable — this quickstart uses `SENDGRID_API_KEY` — you can proceed to the next step.\n\n```shell\nexport SENDGRID_API_KEY=<Your API Key>\n```\n\n### Verify your Sender Identity\n\nTo ensure our customers maintain the best possible sender reputations and to uphold legitimate sending behavior, we require customers to verify their [Sender Identities]({{root_url}}/for-developers/sending-email/sender-identity/) by completing [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A Sender Identity represents your 'From' email address—the address your recipients see as the sender of your emails.\n\n<call-out>\n\nTo get started quickly, you may be able to skip Domain Authentication and begin by completing [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification). Single Sender Verification is recommended for testing only. Some email providers have [DMARC]({{root_url}}/glossary/dmarc) policies that restrict email from being delivered using their domains. For the best experience, please complete Domain Authentication. Domain Authentication is also required to upgrade from a free account. To better understand why Domain Authentication is necessary, see our [\"Spoofing\"]({{root_url}}/glossary/spoofing/) and [\"Everything about DMARC\"]({{root_url}}/ui/sending-email/dmarc/) articles.\n\n</call-out>\n\n### Node.js\n\nBefore installing Node.js, you can see if you already have a version on your machine.\n\n<call-out>\n\nThe Twilio SendGrid Node.js helper library supports the current LTS version of Node.js and versions 6, 7, 8, and 10.\n\n</call-out>\n\n#### Node.js version check\n\nCheck your Node.js version by opening your terminal (also known as a command line or console) and typing the following command:\n\n```shell\nnode --version\n```\n\nIf you have Node.js installed, the terminal should print something like the following output:\n\n```shell\nv12.16.1\n```\n\nThough the SendGrid helper library supports Node.js back to version 6, we recommend using the latest version. Node.js version 12.16.1 was used to build this quickstart.\n\n#### Install Node.js\n\nIf you do not already have a version of Node.js installed, visit the [Node.js website](https://nodejs.org/en/) for instructions on downloading and installing a version appropriate for your operating system. The npm package manager also has a helpful [installation guide](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm).\n\n## Starting the project\n\nUsing a [Twilio SendGrid helper library](https://github.com/sendgrid/sendgrid-nodejs) is the fastest way to deliver your first email.\n\nStart by creating a project folder for this app. You can name the project anything you like. We use `sgQuickstart` in the following examples.\n\n```shell\nmkdir sgQuickstart\n```\n\nNext, navigate into the sgQuickstart directory where you will complete the rest of the tutorial.\n\n```shell\ncd sgQuickstart\n```\n\n### Initialize your project\n\nThe [npm](https://www.npmjs.com/) package manager was included when you installed Node.js. You can use npm to install the Twilio SendGrid helper library as a project dependency. If you want to verify that npm is installed, you can type the following into the terminal.\n\n```shell\nnpm --version\n```\n\nThe terminal should print something like the following output.\n\n```shell\n6.13.4\n```\n\n<call-out>\n\nYou can install the helper library using [yarn](https://yarnpkg.com/) if you prefer.\n\n</call-out>\n\nBefore installing the package, you should first initialize your project with the following command.\n\n```shell\nnpm init\n```\n\nThis command will print a chain of questions that help you create a `package.json` file. The `package.json` file stores a list of project dependencies. You can hit **Enter** or **Return** to skip any of the questions and use the default values.\n\nOnce you complete the initialization process, your package.json will contain a `“main”` property. This property stores the application entry point, which is `\"index.js\"`. The application entry point is the _main_ file Node.js will look for when running your application code. This will be important later. You can use any file name you want, but we’ll use the default `\"index.js\"` in this quickstart.\n\n### Install the helper library\n\nTo install the Twilio SendGrid helper library, type the following command into the terminal.\n\n```shell\nnpm install --save @sendgrid/mail\n```\n\nThe terminal should print something like.\n\n```shell\n$npm install --save @sendgrid/mail\n+ @sendgrid/mail@7.2.1\nadded 15 packages from 19 contributors and audited 15 packages in 1.625s\nfound 0 vulnerabilities\n```\n\n<call-out>\n\nIf you see errors printed above the message, they are likely related to missing information in your package.json file. You can ignore these errors for this quickstart.\n\n</call-out>\n\n## How to send an API email\n\nYou're now ready to write some code. First, create a file in your project directory. Again, you can use `index.js` because that's the name of the `\"main\"` entry point file in the `package.json` file.\n\n### Complete code block\n\nThe following Node.js block contains all the code needed to successfully deliver a message with the SendGrid Mail Send API. You can copy this code, modify the `to` and `from` fields, and run the code if you like. We'll break down each piece of this code in the following sections.\n\n```javascript\nconst sgMail = require('@sendgrid/mail')\nsgMail.setApiKey(process.env.SENDGRID_API_KEY)\n\nconst msg = {\n  to: 'test@example.com', // Change to your recipient\n  from: 'test@example.com', // Change to your verified sender\n  subject: 'Sending with SendGrid is Fun',\n  text: 'and easy to do anywhere, even with Node.js',\n  html: '<strong>and easy to do anywhere, even with Node.js</strong>',\n}\n\nsgMail\n  .send(msg)\n  .then((response) => {\n    console.log(response[0].statusCode)\n    console.log(response[0].headers)\n  })\n  .catch((error) => {\n    console.error(error)\n  })\n```\n\n### Build your API call\n\nYour API call must have the following components:\n\n- A host (the host for Web API v3 requests is always `https://api.sendgrid.com/v3/`)\n- An API key passed in an Authorization Header\n- A request (when submitting data to a resource via `POST` or `PUT`, you must submit your request body in JSON format)\n\nIn your `index.js` file, require the Node.js helper library. The library will handle setting the Host, `https://api.sendgrid.com/v3/`, for you.\n\n```javascript\nconst sgMail = require('@sendgrid/mail')\n```\n\nNext, use the API key you set up earlier. Remember, the API key is stored in an environment variable, so you can use the `process.env()` method to access and assign it using the helper library's `setApiKey()` method. The helper library will pass your key to the API in an Authorization header using Bearer token authentication.\n\n```javascript\nsgMail.setApiKey(process.env.SENDGRID_API_KEY)\n```\n\nNow you're ready to set up your `\"to\"`, `\"from\"`, `\"subject\"`, and message body `\"text\"`. These values are passed to the API in a [\"personalizations\"](https://sendgrid.com/docs/for-developers/sending-email/personalizations/) object when using the v3 Mail Send API. The helper library allows you to store all this data in a single flat JavaScript object. Assign the object to a variable named `msg`.\n\nChange the `“to”` value to a valid email address you can access. This is where your message will be delivered. Change the `“from”` value to the address you verified during the Sender Identity set up.\n\nThe `\"subject\"` can be any text. The email body can be either plain text or HTML. The helper library allows you to specify the type of email body by using either the `\"text\"` or `\"html\"` properties.\n\n```javascript\nconst msg = {\n  to: 'test@example.com', // Change to your recipient\n  from: 'test@example.com', // Change to your verified sender\n  subject: 'Sending with SendGrid is Fun',\n  text: 'and easy to do anywhere, even with Node.js',\n  html: '<strong>and easy to do anywhere, even with Node.js</strong>',\n}\n```\n\nTo send the message, pass the `msg` object as an argument to the helper library's `send()` method. You can also add `then()` and `catch()` methods to log the response status code and headers or catch and log any errors.\n\n```javascript\nsgMail\n  .send(msg)\n  .then((response) => {\n    console.log(response[0].statusCode)\n    console.log(response[0].headers)\n  })\n  .catch((error) => {\n    console.error(error)\n  })\n```\n\nThe code block is now complete. To send the message, you can run the `index.js` file with Node.js.\n\n```shell\nnode index.js\n```\n\nIf you receive a [`202` status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202) printed to the console, your message was sent successfully. Check the inbox of the `“to”` address, and you should see your demo message.\n\nIf you don’t see the email, you may need to check your spam folder.\n\n### Troubleshooting\n\nIf you receive an error message, you can reference our [response message documentation](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes) for clues about what may have gone wrong.\n\n#### API Response messages\n\nAll responses are returned in JSON format. We specify this by sending the Content-Type header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next Steps\n\nThis is just the beginning of what you can do with our APIs. To learn more, check the resources below.\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [The Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Twilio SendGrid helper library for Node.js](https://github.com/sendgrid/sendgrid-nodejs)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/quickstart-php.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for PHP\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Email API Quickstart for PHP\n  description: Sending your first email using the SendGrid REST API and PHP.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, PHP\n---\n\nIn this quickstart, you'll learn how to send your first email using [PHP](https://www.php.net/) and the [Twilio SendGrid Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\n\n## Prerequisites\n\nBe sure to perform the following prerequisites to complete this tutorial. You can skip ahead if you've already completed these tasks.\n\n1. Sign up for a SendGrid account.\n2. Enable Two-factor authentication.\n3. Create and store a SendGrid API key.\n4. Complete Domain Authentication.\n5. Install PHP.\n6. Install Composer.\n\n<a href=\"#starting-the-project\" class=\"btn btn-primary\">Skip the prerequisites</a>\n\n### Sign up for a SendGrid account\n\nWhen you sign up for a free [Twilio SendGrid account](https://signup.sendgrid.com/), you'll be able to send 100 emails per day forever. For more account options, see our [pricing page](https://sendgrid.com/pricing/).\n\n### Enable Two-factor authentication\n\nTwilio SendGrid requires customers to enable Two-factor authentication (2FA) on their accounts. You can do this either with SMS or by using the [Authy](https://authy.com/) app. See the [2FA section of our authentication documentation]({{root_url}}/for-developers/sending-email/authentication/#two-factor-authentication) for instructions.\n\n### Create and store a SendGrid API key\n\nUnlike a username and password — credentials that allow access to your full account — an API key is authorized to perform a limited scope of actions. If your API key is compromised, you can cycle it (delete it and create another one) without changing your other account credentials.\n\nVisit our [API Key documentation]({{root_url}}/ui/account-and-settings/api-keys/) for instructions on creating an API key and [storing an API key in an environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable). To complete this tutorial, you can create a **Restricted Access** API key with **Mail Send** > **Full Access** permissions only, which will allow you to send email and schedule emails to be sent later. You can edit the permissions assigned to an API key later to work with additional services.\n\nOnce your API key is assigned to an environment variable — this quickstart uses `SENDGRID_API_KEY` — you can proceed to the next step.\n\n```shell\nexport SENDGRID_API_KEY=<Your API Key>\n```\n\n### Verify your Sender Identity with Domain Authentication\n\nTo ensure our customers maintain the best possible sender reputations, and to uphold legitimate sending behavior, Twilio SendGrid requires customers to verify their [Sender Identities]({{root_url}}/for-developers/sending-email/sender-identity/) by completing [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A Sender Identity represents your 'From' email address — the address your recipients see as the sender of your emails.\n\n<call-out>\n\nTo get started quickly, you may be able to skip Domain Authentication and begin by completing [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification). Single Sender Verification is recommended for testing only. Some email providers have [DMARC]({{root_url}}/glossary/dmarc) policies that restrict email from being delivered using their domains.\n\nFor the best experience, please complete Domain Authentication. Domain Authentication is also required to upgrade from a free account. To better understand why Domain Authentication is necessary, see our [\"Spoofing\"]({{root_url}}/glossary/spoofing/) and [\"Everything about DMARC\"]({{root_url}}/ui/sending-email/dmarc/) articles.\n\n</call-out>\n\n### PHP\n\nBefore installing PHP, you can see if you already have a version on your machine.\n\n<call-out>\n\nThe Twilio SendGrid PHP helper library requires PHP version 5.6, 7.0, 7.1, 7.2, 7.3, or 7.4. However, we strongly encourage you to use the latest, stable version, 7.4.\n\n</call-out>\n\n#### PHP version check\n\nCheck if you already have a version installed on your machine by opening your terminal (also known as a command line or console) and typing the following command.\n\n```shell\nphp -v\n```\n\nIf you have PHP installed, the terminal will print something like the following output.\n\n```shell\nPHP 8.0.3 (cli) (built: Mar  4 2021 20:42:56) ( NTS )\nCopyright (c) The PHP Group\nZend Engine v4.0.3, Copyright (c) Zend Technologies\n    with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies\n```\n\n<call-out>\n\nYou may already have a version of PHP included by your operating system. For example, macOS includes a version of PHP; however, you will often want to build your applications with a different version. You can install and manage different versions of PHP on macOS using [Homebrew](https://formulae.brew.sh/formula/php).\n\n</call-out>\n\n#### Install PHP\n\nIf you do not already have a version of PHP installed, visit the [PHP website](https://www.php.net/manual/en/install.php) to download and install a version appropriate for your operating system. Alternatively, use your operating system's package manager (such as APT, Yum, Pacman, Ports, or Homebrew) to install the latest supported version of PHP.\n\n#### Install Composer\n\nSee the [Composer installation documentation](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos) for download and installation instructions. We recommend installing Composer globally, so that you don't have to install each time you create a new project.\n\nTo check if you already have it installed, run the following command.\n\n```shell\ncomposer --version\n```\n\n## Starting the project\n\nWith the prerequisites completed, create a project folder for this app by running the following command.\n\n```shell\nmkdir send_mail\n```\n\nNext, navigate into the `send_mail` directory to complete the rest of the tutorial.\n\n```shell\ncd send_mail\n```\n\n### Initialize your project\n\nWhile you could use an HTTP helper library such as Guzzle or cURL to interact with the Mail Send API, it is far more efficient to use the [SendGrid helper library for PHP](https://github.com/sendgrid/sendgrid-php) instead.\n\nTo install the SendGrid helper library, run the following Composer command. It will create a `composer.json` file at the root of your project, and install the SendGrid helper library for PHP, along with its dependencies in a new directory named `vendor`.\n\n```shell\ncomposer require sendgrid/sendgrid\n```\n\nAs the command runs, the terminal will print output something like the following example.\n\n```shell\nUsing version ^7.9 for sendgrid/sendgrid\n./composer.json has been created\nRunning composer update sendgrid/sendgrid\nLoading composer repositories with package information\nUpdating dependencies\nLock file operations: 3 installs, 0 updates, 0 removals\n  - Locking sendgrid/php-http-client (3.14.0)\n  - Locking sendgrid/sendgrid (7.9.2)\n  - Locking starkbank/ecdsa (0.0.4)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 3 installs, 0 updates, 0 removals\n  - Downloading sendgrid/php-http-client (3.14.0)\n  - Installing starkbank/ecdsa (0.0.4): Extracting archive\n  - Installing sendgrid/php-http-client (3.14.0): Extracting archive\n  - Installing sendgrid/sendgrid (7.9.2): Extracting archive\n1 package suggestions were added by new dependencies, use `composer suggest` to see details.\nGenerating autoload files\n```\n\n## Send an email\n\nYou're now ready to write some code to send your first email. Start by creating a new PHP file named `send_mail.php` in the root of your project directory.\n\n### Complete code block\n\nThe following PHP block contains all the code needed in your `send_mail.php` file to successfully deliver a message with the Twilio SendGrid Mail Send API. You can copy this code to the `send_mail.php` file, modify the values passed to the `setFrom` and `addTo` methods, and run the code to see what happens. We'll break down each piece of this code in the following sections.\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nrequire 'vendor/autoload.php';\n\nuse \\SendGrid\\Mail\\Mail;\n\n$email = new Mail();\n// Replace the email address and name with your verified sender\n$email->setFrom(\n    'test@example.com',\n    'Example Recipient'\n);\n$email->setSubject('Sending with Twilio SendGrid is Fun');\n// Replace the email address and name with your recipient\n$email->addTo(\n    'test@example.com',\n    'Example Sender'\n);\n$email->addContent(\n    'text/html',\n    '<strong>and easy to do anywhere, even with PHP</strong>'\n);\n$sendgrid = new \\SendGrid(getenv('SENDGRID_API_KEY'));\ntry {\n    $response = $sendgrid->send($email);\n    printf(\"Response status: %d\\n\\n\", $response->statusCode());\n\n\t$headers = array_filter($response->headers());\n\techo \"Response Headers\\n\\n\";\n\tforeach ($headers as $header) {\n    \techo '- ' . $header . \"\\n\";\n    }\n} catch (Exception $e) {\n    echo 'Caught exception: '. $e->getMessage() .\"\\n\";\n}\n```\n\n### Build your API call\n\nYour API call must have the following components. The helper library abstracts this away, reducing the code you must write.\n\n- A host (the host for Web API v3 requests is always `https://api.sendgrid.com/v3/`)\n- An API key passed in an Authorization Header\n- A request (when submitting data to a resource via `POST` or `PUT`, you must submit your request body in JSON format)\n\nThe code starts by loading [Composer's autoloader](https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa), which makes all of the required classes available to our code.\n\n```php\nrequire 'vendor/autoload.php'\n```\n\nIt then initializes a new variable, `$email`, as an instance of the library's `Mail` class.\n\n```php\n$email = new Mail();\n```\n\nThe code then sets the message's sender, subject, recipient, and content using the `setFrom`, `setSubject`, `addTo`, and `addContent` methods. The values passed to these methods are formatted and sent to the API in a [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/) object when using the v3 Mail Send API.\n\nThe `setSubject` method accepts a string. The `setFrom` and `addTo` methods accept an email address and an optional sender name as strings. Be sure to assign `addTo` an address with an inbox that you can access.\n\nThe `addContent` method takes the message's type, which can be either `text/plain` or `text/html`, and a string value, which is the content you wish to send in the message body.\n\n```php\n// Replace with your verified sender\n$email->setFrom(\n    'test@example.com',\n    'Example Recipient'\n);\n$email->setSubject(\n    'Sending with Twilio SendGrid is Fun'\n);\n// Replace with your recipient\n$email->addTo(\n    'test@example.com',\n    'Example Sender'\n);\n$email->addContent(\n    'text/html',\n    '<strong>and easy to do anywhere, even with PHP</strong>'\n);\n```\n\nWith the message object initialized, a new variable, `$sendgrid`, is initialized, which provides the ability to send the message. This variable is a `SendGrid` object. The `SendGrid` class accepts two arguments: your API key and an options array. You need to pass in your API key only, which the code does using [PHP's `getenv` method](https://www.php.net/manual/en/function.getenv.php). The helper library will handle setting the host, constructing your personalizations object, and formatting the message for you.\n\n```php\n$sendgrid = new \\SendGrid(getenv('SENDGRID_API_KEY'));\n```\n\nLastly, the code calls the `$sendgrid` `send` method, to which you pass your `$email`. This method makes a request to the Mail Send API to deliver the email message, assigning the response to a variable, aptly, named `$response`.\n\n```php\n$response = $sendgrid->send($email);\n```\n\nWith all the code in place, run the `send_mail.php` file in your terminal to send the email using the command below.\n\n```php\nphp send_mail.php\n```\n\nYou can also wrap your API call in a try block to print the status code and headers of the response or log exceptions in the try block's corresponding catch block.\n\n```php\ntry {\n  $response = $sendgrid->send($email);\n  print $response->statusCode() . \"\\n\";\n  print_r($response->headers());\n} catch (Exception $e) {\n  echo 'Caught exception: '. $e->getMessage() .\"\\n\";\n}\n```\n\nIf a [`202` status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202) is printed to the console, your message was sent successfully. Check the inbox of the `addTo` address, and you will see your demo message. If you don’t see the email, check your spam folder.\n\n### Troubleshooting\n\nIf you receive an error message, you can reference our [response message documentation](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes) for clues about what may have gone wrong.\n\n#### API Response messages\n\nAll responses are returned in JSON format. We specify this by sending the Content-Type Header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next Steps\n\nThis is just the beginning of what you can do with our APIs. To learn more, check the resources below.\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [The Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Twilio SendGrid helper library for PHP](https://github.com/sendgrid/sendgrid-php)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/quickstart-python.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Python\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Email API Quickstart for Python\n  description: Sending your first email using the SendGrid REST API and Python.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, Python, Python 3.\n---\n\nIn this quickstart, you'll learn how to send your first email using the [Twilio SendGrid Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) and [Python](https://www.python.org/).\n\n## Prerequisites\n\nBe sure to perform the following prerequisites to complete this tutorial. You can skip ahead if you've already completed these tasks.\n\n1. Sign up for a SendGrid account.\n2. Enable Two-factor authentication.\n3. Create and store a SendGrid API Key with **Mail Send** > **Full Access** permissions.\n4. Complete Domain Authentication.\n5. Install Python.\n\n<a href=\"#starting-the-project\" class=\"btn btn-primary\">Skip the prerequisites</a>\n\n### Sign up for a SendGrid account\n\nWhen you sign up for a free [SendGrid account](https://signup.sendgrid.com/), you'll be able to send 100 emails per day forever. For more account options, see our [pricing page](https://sendgrid.com/pricing/).\n\n### Enable Two-factor authentication\n\nTwilio SendGrid requires customers to enable Two-factor authentication (2FA). You can enable 2FA with SMS or by using the [Authy](https://authy.com/) app. See the [2FA section of our authentication documentation]({{root_url}}/for-developers/sending-email/authentication/#two-factor-authentication) for instructions.\n\n### Create and store a SendGrid API key\n\nUnlike a username and password — credentials that allow access to your full account — an API key is authorized to perform a limited scope of actions. If your API key is compromised, you can also cycle it (delete and create another) without changing your other account credentials.\n\nVisit our [API Key documentation]({{root_url}}/ui/account-and-settings/api-keys/) for instructions on creating an API key and [storing an API key in an environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable). To complete this tutorial, you can create a Restricted Access API key with **Mail Send** > **Full Access** permissions only, which will allow you to send email and schedule emails to be sent later. You can edit the permissions assigned to an API key later to work with additional services.\n\nOnce your API key is assigned to an environment variable — this quickstart uses `SENDGRID_API_KEY` — you can proceed to the next step.\n\n```shell\nexport SENDGRID_API_KEY=<Your API Key>\n```\n\n### Verify your Sender Identity\n\nTo ensure our customers maintain the best possible sender reputations and to uphold legitimate sending behavior, we require customers to verify their [Sender Identities]({{root_url}}/for-developers/sending-email/sender-identity/) by completing [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A Sender Identity represents your 'From' email address—the address your recipients see as the sender of your emails.\n\n<call-out>\n\nTo get started quickly, you may be able to skip Domain Authentication and begin by completing [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification). Single Sender Verification is recommended for testing only. Some email providers have [DMARC]({{root_url}}/glossary/dmarc) policies that restrict email from being delivered using their domains. For the best experience, please complete Domain Authentication. Domain Authentication is also required to upgrade from a free account. To better understand why Domain Authentication is necessary, see our [\"Spoofing\"]({{root_url}}/glossary/spoofing/) and [\"Everything about DMARC\"]({{root_url}}/ui/sending-email/dmarc/) articles.\n\n</call-out>\n\n### Python\n\nBefore installing Python, you can see if you already have a version on your machine.\n\n<call-out>\n\nThe Twilio SendGrid Python helper library supports Python 2.7, 3.5, 3.6, 3.7, and 3.8.\n\n</call-out>\n\n#### Python version check\n\nCheck your Python version by opening your terminal (also known as a command line or console) and typing the following command.\n\n```shell\npython --version\n```\n\nIf you have Python installed, the terminal should print something like the following output.\n\n```shell\nPython 3.8.5\n```\n\n<call-out>\n\nThough the SendGrid helper library supports Python back to version 2.7, we recommend using a 3.x version now that Python 2 has reached end-of-life status.\n\nIt is possible to have multiple versions of Python on your computer. Some operating systems come with a version of Python already installed. If you run `python --version` and receive `Python 2.7.x` after installing Python 3, try running `python3 --version` to see which 3.x version of Python you have installed. This tutorial will use the `python` command, assuming you are working with Python 3. If you have not set up Python 3 in a virtual environment, you may need to run the command `python3` instead.\n\nFor more about running multiple versions of Python, see [\"Virtual Environments and Packages\"](https://docs.python.org/3/tutorial/venv.html) in the Python documentation.\n\n</call-out>\n\n#### Install Python\n\nIf you do not already have a version of Python installed, visit the [Python website](https://www.python.org/downloads) to download and install a version appropriate for your operating system.\n\n## Starting the project\n\nUsing a [Twilio SendGrid helper library](https://github.com/sendgrid/sendgrid-python) is the fastest way to deliver your first email.\n\nStart by creating a project folder for this app. You can name the project anything you like. We use `sg_quickstart` in the following examples.\n\n```shell\nmkdir sg_quickstart\n```\n\nNext, navigate into the sg_quickstart directory where you will complete the rest of the tutorial.\n\n```shell\ncd sg_quickstart\n```\n\n### Initialize your project\n\nThe [pip](https://pypi.org/project/pip/) package manager was included when you installed Python. You can use pip to install the Twilio SendGrid helper library and save it as a project dependency. If you want to verify that pip is installed, you can type the following into the terminal.\n\n```shell\npip --version\n```\n\nThe terminal should print something like the following output.\n\n```shell\npip 20.1.1 from /usr/locallib/python3.8/site-packages/pip (python 3.8)\n```\n\n<call-out>\n\nIf you do not have a version of pip installed, you can download and install it using the [pip installation instructions on python.org](https://packaging.python.org/tutorials/installing-packages/).\n\n</call-out>\n\n### Install the helper library\n\nTo install the Twilio SendGrid helper library, type the following command into the terminal.\n\n```shell\npip install sendgrid\n```\n\nThe terminal should print something like.\n\n```shell\nCollecting sendgrid\n  Using cached sendgrid-6.4.6-py3-none-any.whl (73 kB)\nRequirement already satisfied: python-http-client>=3.2.1 in /usr/local/lib/python3.8/site-packages (from sendgrid) (3.3.1)\nRequirement already satisfied: starkbank-ecdsa>=1.0.0 in /usr/local/lib/python3.8/site-packages (from sendgrid) (1.0.0)\nInstalling collected packages: sendgrid\nSuccessfully installed sendgrid-6.4.6\n```\n\n## How to send an API email\n\nYou're now ready to write some code. First, create a file in your project directory. You can use `app.py`.\n\n### Complete code block\n\nThe following Python block contains all the code needed to successfully deliver a message with the SendGrid Mail Send API. You can copy this code, modify the `from_email` and `to_email` variables, and run the code if you like. We'll break down each piece of this code in the following sections.\n\n```python\nimport sendgrid\nimport os\nfrom sendgrid.helpers.mail import Mail, Email, To, Content\n\nsg = sendgrid.SendGridAPIClient(api_key=os.environ.get('SENDGRID_API_KEY'))\nfrom_email = Email(\"test@example.com\")  # Change to your verified sender\nto_email = To(\"test@example.com\")  # Change to your recipient\nsubject = \"Sending with SendGrid is Fun\"\ncontent = Content(\"text/plain\", \"and easy to do anywhere, even with Python\")\nmail = Mail(from_email, to_email, subject, content)\n\n# Get a JSON-ready representation of the Mail object\nmail_json = mail.get()\n\n# Send an HTTP POST request to /mail/send\nresponse = sg.client.mail.send.post(request_body=mail_json)\nprint(response.status_code)\nprint(response.headers)\n```\n\n### Build your API call\n\nYour API call must have the following components:\n\n- A host (the host for Web API v3 requests is always `https://api.sendgrid.com/v3/`)\n- An API key passed in an Authorization Header\n- A request (when submitting data to a resource via `POST` or `PUT`, you must submit your request body in JSON format)\n\nIn your `app.py` file, import the SendGrid helper library. The library will handle setting the Host, `https://api.sendgrid.com/v3/`, for you.\n\n```python\nimport sendgrid\n```\n\nNext, use the API key you set up earlier. Remember, the API key is stored in an environment variable, so you can use the `os.environ.get()` method to access it. This means we also need to import Python's os library.\n\n```python\nimport os\n```\n\nAssign the key to a variable named `sg` using the helper library's `SendGridAPIClient()` method. The helper library will pass your key to the v3 API in an Authorization header using Bearer token authentication.\n\n```python\nsg = sendgrid.SendGridAPIClient(api_key = os.environ.get('SENDGRID_API_KEY'))\n```\n\nNow you're ready to set up the `from_email`, `to_email`, `subject`, and message body `content`. These values are passed to the API in a [\"personalizations\"]({{root_url}}/for-developers/sending-email/personalizations/) object when using the v3 Mail Send API. You can assign each of these values to variables, and the SendGrid library will handle creating a personalizations object for you.\n\nFirst, import the library's `Mail`, `Email`, `To`, and `Content` classes.\n\n```python\nfrom sendgrid.helpers.mail import Mail, Email, To, Content\n```\n\nWith the helpers imported, define and assign values for `from_email`, `to_email`, `subject`, and `content` variables. Assigning an email address like `from_email = \"sender@example.com\"` will work. However, the constructors imported in the previous step allow you to pass data to them to be sure your final message is formatted properly. Be sure to assign the `to_email` to an address with an inbox you can access.\n\nNote that the `Content()` helper takes two arguments: the content type and the content itself. You have two options for the content type: `text/plain` or `text/html`. The second parameter will take the plain text or HTML content you wish to send.\n\n```python\nfrom_email = Email(\"test@example.com\")  # Change to your verified sender\nto_email = To(\"test@example.com\")  # Change to your recipient\nsubject = \"Sending with SendGrid is Fun\"\ncontent = Content(\"text/plain\", \"and easy to do anywhere, even with Python\")\n```\n\nTo properly construct the message, pass each of the previous variables into the SendGrid library's Mail constructor. You can assign this to a variable named `mail`. You can then use the the Mail constructor's `get()` method to get a JSON-ready representation of the Mail object.\n\n```python\nmail = Mail(from_email, to_email, subject, content)\n\n# Get a JSON-ready representation of the Mail object\nmail_json = mail.get()\n```\n\nLastly, you need to make a request to the SendGrid Mail Send API to deliver your message.\n\nThe helper library uses SendGrid's [python-http-client](https://github.com/sendgrid/python-http-client) library to construct the request URL by chaining together portions of your desired path. The path to the SendGrid v3 Mail Send endpoint is `https://api.sendgrid.com/v3/mail/send`. The helper library sets the client for you, so the `https://api.sendgrid.com/v3` portion is taken care of by typing `sg.client`. The next parts of the path are `/mail` and `/send`. You can chain the the words `mail` and `send` onto `client` to build the rest of the URL.\n\nWith the URL built, python-http-client then allows you to chain on the type of HTTP request you wish to make with a method matching the name of the HTTP verb appropriate for your desired endpoint. To send a message, you should make an HTTP `POST` request, so you can use `post()`. The `post()` method takes a `request_body`, which you should set to the JSON version of your message (remember, this JSON-ready version is stored in the `mail_json` variable). You can assign this full call to a variable named `response` and print the response status code and headers.\n\n```python\n# Send an HTTP POST request to /mail/send\nresponse = sg.client.mail.send.post(request_body=mail_json)\nprint(response.status_code)\nprint(response.headers)\n```\n\nWith all this code in place, you can run your `app.py` file with Python to send the email.\n\n```shell\npython app.py\n```\n\nIf you receive a [`202` status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202) printed to the console, your message was sent successfully. Check the inbox of the `“to_email”` address, and you should see your demo message.\n\nIf you don’t see the email, you may need to check your spam folder.\n\n### Troubleshooting\n\nIf you receive an error message, you can reference our [response message documentation](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes) for clues about what may have gone wrong.\n\n#### API Response messages\n\nAll responses are returned in JSON format. We specify this by sending the Content-Type header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next Steps\n\nThis is just the beginning of what you can do with our APIs. To learn more, check the resources below.\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [The Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Twilio SendGrid helper library for Python](https://github.com/sendgrid/sendgrid-python)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/quickstart-ruby.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Ruby\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Email API Quickstart for Ruby\n  description: Sending your first email using the SendGrid REST API and Ruby.\n  keywords: Getting Started, API, v3, REST, SendGrid REST API, Ruby.\n---\n\nIn this quickstart, you'll learn how to send your first email using the [Twilio SendGrid Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) and [Ruby](https://www.ruby-lang.org/en/).\n\n## Prerequisites\n\nBe sure to perform the following prerequisites to complete this tutorial. You can skip ahead if you've already completed these tasks.\n\n1. Sign up for a SendGrid account.\n2. Enable Two-factor authentication.\n3. Create and store a SendGrid API Key with **Mail Send** > **Full Access** permissions.\n4. Complete Domain Authentication.\n5. Install Ruby.\n\n<a href=\"#starting-the-project\" class=\"btn btn-primary\">Skip the prerequisites</a>\n\n### Sign up for a SendGrid account\n\nWhen you sign up for a free [SendGrid account](https://signup.sendgrid.com/), you'll be able to send 100 emails per day forever. For more account options, see our [pricing page](https://sendgrid.com/pricing/).\n\n### Enable Two-factor authentication\n\nTwilio SendGrid requires customers to enable Two-factor authentication (2FA). You can enable 2FA with SMS or by using the [Authy](https://authy.com/) app. See the [2FA section of our authentication documentation]({{root_url}}/for-developers/sending-email/authentication/#two-factor-authentication) for instructions.\n\n### Create and store a SendGrid API key\n\nUnlike a username and password — credentials that allow access to your full account — an API key is authorized to perform a limited scope of actions. If your API key is compromised, you can also cycle it (delete and create another) without changing your other account credentials.\n\nVisit our [API Key documentation]({{root_url}}/ui/account-and-settings/api-keys/) for instructions on creating an API key and [storing an API key in an environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable). To complete this tutorial, you can create a Restricted Access API key with **Mail Send** > **Full Access** permissions only, which will allow you to send email and schedule emails to be sent later. You can edit the permissions assigned to an API key later to work with additional services.\n\nOnce your API key is assigned to an environment variable — this quickstart uses `SENDGRID_API_KEY` — you can proceed to the next step.\n\n```shell\nexport SENDGRID_API_KEY=<Your API Key>\n```\n\n### Verify your Sender Identity\n\nTo ensure our customers maintain the best possible sender reputations and to uphold legitimate sending behavior, we require customers to verify their [Sender Identities]({{root_url}}/for-developers/sending-email/sender-identity/) by completing [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A Sender Identity represents your 'From' email address—the address your recipients see as the sender of your emails.\n\n<call-out>\n\nTo get started quickly, you may be able to skip Domain Authentication and begin by completing [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification). Single Sender Verification is recommended for testing only. Some email providers have [DMARC]({{root_url}}/glossary/dmarc) policies that restrict email from being delivered using their domains. For the best experience, please complete Domain Authentication. Domain Authentication is also required to upgrade from a free account. To better understand why Domain Authentication is necessary, see our [\"Spoofing\"]({{root_url}}/glossary/spoofing/) and [\"Everything about DMARC\"]({{root_url}}/ui/sending-email/dmarc/) articles.\n\n</call-out>\n\n### Ruby\n\nBefore installing Ruby, you can see if you already have a version on your machine.\n\n<call-out>\n\nThe Twilio SendGrid Ruby helper library supports Ruby versions 2.4 through the current version of Ruby 2.x, [excluding version 2.6.0](https://github.com/sendgrid/sendgrid-ruby/blob/main/TROUBLESHOOTING.md#ruby-versions).\n\n</call-out>\n\n#### Ruby version check\n\nCheck your Ruby version by opening your terminal (also known as a command line or console) and typing the following command.\n\n```shell\nruby -v\n```\n\nIf you have Ruby installed, the terminal will print something like the following output.\n\n```shell\nruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]\n```\n\n<call-out>\n\nYou may already have a version of Ruby included on your operating system. For example, MacOS includes a version of Ruby for its own system uses. [It is not recommended to develop your application using the MacOS system installation of Ruby](https://www.freecodecamp.org/news/do-not-use-mac-system-ruby-do-this-instead/).\n\nYou can use a version manager such as rbenv or rvm to manage multiple versions of Ruby on one machine. See the [rbenv](https://github.com/rbenv/rbenv) and [RVM](https://rvm.io/) projects for more information.\n\n</call-out>\n\n#### Install Ruby\n\nIf you do not already have a version of Ruby installed, visit the [Ruby website](https://www.ruby-lang.org/en/documentation/installation/) to download and install a version appropriate for your operating system.\n\n## Starting the project\n\nUsing a [Twilio SendGrid helper library](https://github.com/sendgrid/sendgrid-ruby) is the fastest way to deliver your first email.\n\nStart by creating a project folder for this app. The following examples will use a folder called `send_mail`.\n\n```shell\nmkdir send_mail\n```\n\nNext, navigate into the `send_mail` directory where you will complete the rest of the tutorial.\n\n```shell\ncd send_mail\n```\n\n### Initialize your project\n\nThe [RubyGems](https://rubygems.org/) package manager is included when installing Ruby. You can use RubyGems to install the Twilio SendGrid helper library and save it as a project dependency. If you want to verify that RubyGems is installed, you can type the following into the terminal.\n\n```shell\ngem -v\n```\n\nThe terminal should print something like the following output.\n\n```shell\n3.1.4\n```\n\n### Install the helper library\n\nTo install the Twilio SendGrid helper library, type the following command into the terminal.\n\n```shell\ngem install sendgrid-ruby\n```\n\nThe terminal will output something like the following output.\n\n```shell\nFetching ruby_http_client-3.5.2.gem\nFetching sendgrid-ruby-6.4.0.gem\nSuccessfully installed ruby_http_client-3.5.2\nSuccessfully installed sendgrid-ruby-6.4.0\nParsing documentation for ruby_http_client-3.5.2\nInstalling ri documentation for ruby_http_client-3.5.2\nParsing documentation for sendgrid-ruby-6.4.0\nInstalling ri documentation for sendgrid-ruby-6.4.0\nDone installing documentation for ruby_http_client, sendgrid-ruby after 0 seconds\n2 gems installed\n```\n\n## Send an email\n\nYou're now ready to write some code. First, create a `send_mail.rb` file in your project directory.\n\n### Complete code block\n\nThe following Ruby block contains all the code needed in your `send_mail.rb` file to successfully deliver a message with the SendGrid Mail Send API. You can copy this code, modify the `to` and `from` variables, and run the code if you like. We'll break down each piece of this code in the following sections.\n\n```ruby\nrequire 'sendgrid-ruby'\ninclude SendGrid\n\nfrom = SendGrid::Email.new(email: 'test@example.com', name: \"Test\") # Change to your verified sender\nto = SendGrid::Email.new(email: 'test@example.com', name: \"Test\") # Change to your recipient\nsubject = 'Sending with Twilio SendGrid is Fun'\ncontent = SendGrid::Content.new(type: 'text/html', value: 'and easy to do anywhere, even with <strong>Ruby</strong>.')\nmail = SendGrid::Mail.new(from, subject, to, content)\n\nsg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])\nresponse = sg.client.mail._('send').post(request_body: mail.to_json)\nputs response.status_code\nputs response.headers\n```\n\n### Build your API call\n\nYour API call must have the following components.\n\n- A host (the host for Web API v3 requests is always `https://api.sendgrid.com/v3/`)\n- An API key passed in an Authorization Header\n- A request (when submitting data to a resource via `POST` or `PUT`, you must submit your request body in JSON format)\n\nIn your `send_mail.rb` file, require the SendGrid helper library, and include the SendGrid module. The library will handle setting the Host, `https://api.sendgrid.com/v3/`, for you.\n\n```ruby\nrequire 'sendgrid-ruby'\ninclude SendGrid\n```\n\nNow you're ready to set up the `from`, `to`, `subject`, and message body `content`. These values are passed to the API in a [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/) object when using the v3 Mail Send API. You can assign each of these values to variables, and the SendGrid library will handle creating a `personalizations` object for you.\n\nThe `subject` variable is a string. However, you will set the `from` and `to` variables using the helper library's `Email` method. The `Email` method takes two arguments: an optional `name` and an `email` address. Be sure to set the `to` value to an address with an inbox you can access.\n\nThe `content` variable is set with the `Content` method. The `Content` method takes a `type`, which can be either `text/plain` or `text/html`, and a `value`, which is a string of the content you wish to send in the message body.\n\n```ruby\nfrom = SendGrid::Email.new(email: 'test@example.com', name: \"Test\") # Change to your verified sender\nto = SendGrid::Email.new(email: 'test@example.com', name: \"Test\") # Change to your recipient\nsubject = 'Sending with Twilio SendGrid is Fun'\ncontent = SendGrid::Content.new(type: 'text/html', value: 'and easy to do anywhere, even with <strong>Ruby</strong>.')\n```\n\nTo properly construct the message, pass each of the previous variables into the SendGrid library's `Mail` method. You can assign this to a variable named `mail`.\n\n```ruby\nmail = SendGrid::Mail.new(from, subject, to, content)\n```\n\nNext, use the API key you set up earlier. Remember, the API key is stored in an environment variable, so you can use Ruby's `ENV` class to access it. Assign the key to a variable named `sg` using the helper library's `API` method. The helper library will pass your key to the v3 API in an Authorization Header using Bearer token authentication.\n\n```ruby\nsg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])\n```\n\nLastly, you need to make a request to the SendGrid Mail Send API to deliver your message.\n\nThe helper library uses SendGrid's [ruby-http-client](https://github.com/sendgrid/ruby-http-client) library to construct the request URL by chaining together portions of your desired path. The path to the SendGrid v3 Mail Send endpoint is `https://api.sendgrid.com/v3/mail/send`. The helper library sets the client for you, so the `https://api.sendgrid.com/v3` portion is taken care of by typing `sg.client`. The next parts of the path are `/mail` and `/send`. You can chain the words `mail` and `send` onto `client` to build the rest of the URL.\n\nWith the URL built, `ruby-http-client` then allows you to chain on the type of HTTP request you wish to make with a method matching the name of the HTTP verb appropriate for your desired endpoint. To send a message, you should make an HTTP `POST` request, so you can use `post()`. The `post()` method takes a `request_body`, which you should set to a JSON version of your message. You can assign this full call to a variable named `response`. You can also print the response status code and headers.\n\n```ruby\n# Send an HTTP POST request to /mail/send\nresponse = sg.client.mail._('send').post(request_body: mail.to_json)\nputs response.status_code\nputs response.headers\n```\n\nWith all this code in place, you can run your `mail_send.rb` file in your terminal to send the email.\n\n```shell\nruby mail_send.rb\n```\n\nIf you receive a [`202` status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202) printed to the console, your message was sent successfully. Check the inbox of the `to` address, and you will see your demo message.\n\nIf you don’t see the email, you may need to check your spam folder.\n\n### Troubleshooting\n\nIf you receive an error message, you can reference our [response message documentation](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes) for clues about what may have gone wrong.\n\n#### API Response messages\n\nAll responses are returned in JSON format. We specify this by sending the Content-Type Header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Next Steps\n\nThis is just the beginning of what you can do with our APIs. To learn more, check the resources below.\n\n- [API Reference]({{root_url}}/api-reference/)\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [The Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Twilio SendGrid helper library for Ruby](https://github.com/sendgrid/sendgrid-ruby)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/rubyonrails.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Ruby on Rails\nseo:\n  title: Send Email with Ruby on Rails\n  description: View instructions on how to easily send email with Ruby on Rails using SendGrid, by setting up setting up ActionMailer or using a gem.\nnavigation:\n  show: true\n---\n  \nThis example shows how to send an email for user signups. You can also checkout <a href='https://github.com/sendgrid/sendgrid-ruby'>this gem</a> for more advanced features.\n\n## Setup ActionMailer\n\nLet's generate a Mailer class. Mailer classes function as our\ncontrollers for email views.\n\n``` bash\n$ rails generate mailer UserNotifierMailer\n```\n\nNow we open up the mailer we've just generated, `app/mailers/user_notifier_mailer.rb` and add a mailer action that sends users a signup email.\n\n``` ruby\nclass UserNotifierMailer < ApplicationMailer\n  default :from => 'any_from_address@example.com'\n\n  # send a signup email to the user, pass in the user object that   contains the user's email address\n  def send_signup_email(user)\n    @user = user\n    mail( :to => @user.email,\n    :subject => 'Thanks for signing up for our amazing app' )\n  end\nend\n```\n\nNow we need a view that corresponds to our action and outputs HTML for our email. Create a file `app/views/user_notifier_mailer/send_signup_email.html.erb` as follows:\n\n``` html\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />\n  </head>\n  <body>\n    <h1>Thanks for signing up, <%= @user.name %>!</h1>\n    <p>Thanks for joining and have a great day! Now sign in and do\nawesome things!</p>\n  </body>\n</html>\n```\n\nIf you don't have a user model quite yet, generate one quickly.\n\n``` bash\n$ rails generate scaffold user name email login\n$ rake db:migrate\n```\n\nNow in the controller for the user model `app/controllers/users_controller.rb`, add a call to `UserNotifierMailer.send_signup_email` when a user is saved.\n\n``` ruby\nclass UsersController < ApplicationController\n  def create\n    # Create the user from params\n    @user = User.new(user_params)\n    if @user.save\n      # Deliver the signup email\n      UserNotifierMailer.send_signup_email(@user).deliver\n      redirect_to(@user, :notice => 'User created')\n    else\n      render :action => 'new'\n    end\n  end\n\n  private\n\n  def user_params\n    params.require(:user).permit(:name, :email, :login)\n  end\nend\n```\n\nAlright, now we're cooking! Let's get it all going through SendGrid.\n\n## Configure ActionMailer to Use SendGrid\n\nIn `config/environment.rb` specify your ActionMailer settings to point to SendGrid's servers.\n\n``` ruby\nActionMailer::Base.smtp_settings = {\n  :user_name => 'apikey', # This is the string literal 'apikey', NOT the ID of your API key\n  :password => '<SENDGRID_API_KEY>', # This is the secret sendgrid API key which was issued during API key creation\n  :domain => 'yourdomain.com',\n  :address => 'smtp.sendgrid.net',\n  :port => 587,\n  :authentication => :plain,\n  :enable_starttls_auto => true\n}\n```\n\nThat's it! When a new user object is saved, an email will be sent to\nthe user via SendGrid.\n\n<call-out type=\"warning\">\n\nAs a best practice, you should not store your credentials directly in\nthe source but should instead store them in configuration files or\nenvironment variables. See this tutorial on <a\n  href='http://railsapps.github.io/rails-environment-variables.html'>environment\n  variables in Rails</a>. And for Rails Versions 5.2+ see <a href='https://guides.rubyonrails.org/security.html#custom-credentials'>Securely storing custom credentials in Rails.</a>\n\n</call-out>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/sandbox-mode.md",
    "content": "---\nseo:\n  title: Sandbox Mode\n  description: Learn how to use Sandbox Mode when sending mail over SendGrid's Web API v3.\n  keywords: sandbox mode, test, validation, v3 mail send\ntitle: Sandbox Mode\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n\n<call-out>\n\nSandbox mode is only used to validate your request. The email will never be delivered while this feature is enabled!\nAny requests made in sandbox mode will not generate events in either Event Webhook or Email Activity. No Credits will be consumed.\n\n</call-out>\n\nSandbox mode is an optional parameter within `mail_settings`. Enabling sandbox mode allows you to send a test email to ensure that your request body is formatted correctly without delivering the email to any of your recipients.\n\nWhen making a request with sandbox mode enabled, we will validate the form, type, and shape of your request. In other words, sandbox mode will validate each parameter you include and the structure of your JSON payload. If you include a `template_id` in your sandbox mode request, it will be assumed that you have included a subject line and body within the template. We will not validate this content.\n\n## Using Sandbox Mode\n\n<call-out type=\"warning\">\n\nWhen using sandbox mode, you must include the \"enable\" parameter, and it must be given a boolean value of either true or false. **Do not enclose the boolean value in quotes** or you will receive the error:\n\n`The sandbox mode enable param should be a boolean value.`\n\n</call-out>\n\n### Valid Request Body\n\nWhen your request validates, you will receive a 200 OK response (as opposed to the 202 ACCEPTED response that is returned for successful non-sandbox requests).\n\n### Invalid Request Body\n\nIf you submit a request with sandbox mode enabled, but your request body is invalid, you will receive one or more error messages with error codes, detailed explanations for the error or errors, and links to any relevant documentation.\n\n### Example Sandbox Mode JSON\n\nThe following is an invalid request body intended to demonstrate the validation behavior of sandbox mode for a bad request.\n\n#### Request\n\n```json\n{\n\t\"personalizations\": [{\n\t\t\"to\": [{\n\t\t\t\"email\": \"john@example.com\"\n\t\t}],\n\t\t\"subject\": \"Hello, World!\"\n\t}],\n\t\"from\": {\n\t\t\"email\": \"John Doe\"\n\t},\n\t\"content\": {\n\t\t\"type\": \"text\",\n\t\t\"value\": \"Hello, World!\"\n\t},\n\t\"mail_settings\": {\n\t\t\"sandbox_mode\": {\n\t\t\t\"enable\": true\n\t\t}\n\t}\n}\n```\n\n**Response**\n\n```json\n{\n  \"errors\": [\n    {\n      \"field\": \"from\",\n      \"message\": \"The from object must at least have an 'email'\nparameter with a valid email address and may also contain a 'name' parameter. e.g. {\"email\": \"example@example.com\"} or {\"email\": \"example@example.com\", \"name\": \"Example Recipient\"}\"\n    }\n  ]\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/scheduling-email.md",
    "content": "---\nseo:\n  title: Scheduling Email\n  description: How can I schedule emails to send at specific times?\n  keywords: drip, newsletter, email, future, automate, automated, delay, schedule, delivery\ntitle: Scheduling Email\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nThere are 3 easy ways to schedule your emails; use the [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/), use the [SMTP API]({{root_url}}/for-developers/sending-email/scheduling-parameters/) header, or use the API.\n\n<call-out>\n\nIf you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail.\n\n</call-out>\n\n## 1. Marketing Campaigns\n\nIf you are using Marketing Campaigns, you can schedule a time to send your campaign from the Settings tab by turning Off the option to Send Immediately. Next, verify that you are using the correct time zone, and then simply choose the date and time that you would like to send your campaign at.\n\nYou can also schedule your campaigns with the [Marketing Campaigns API](https://sendgrid.api-docs.io/v3.0/single-sends/schedule-single-send).\n\n## 2. API\n\nYou can schedule a time to send your email by using the `send_at` object of the `POST /mail/send` method of the [V3 API]({{root_url}}/api-reference). For more information about scheduling and stopping scheduled sends with the API, see [Can I Stop an in-progress send]({{root_url}}/for-developers/sending-email/stopping-an-in-progress-send/).\n\n## 3. SMTP API\n\nYou can use the [SMTP API]({{root_url}}/for-developers/sending-email/scheduling-parameters/) header to schedule your emails when sending via [SMTP]({{root_url}}/for-developers/sending-email/getting-started-smtp/) or our [mail.send API endpoint](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send). SendGrid will allow you to queue batches of emails targeting individual recipients by using a UNIX time stamp parameter in your SMTP API header.\n\nThis parameter allows SendGrid to begin processing your email requests before sending. SendGrid will then queue those messages and release them when the specified time rolls around.\n\nHere's an example of how this timestamp might look in your SMTP API JSON header:\n\n`{ \"send_at\": 1409348513 }`\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/scheduling-parameters.md",
    "content": "---\nseo:\n  title: Scheduling Parameters\n  description: Scheduling an email with SMTP\n  keywords: SMTP, send email, scheduling\ntitle: Scheduling Parameters\ngroup: x-smtpapi\nweight: 10\nlayout: page\nnavigation:\n  show: true\n---\n\nWith scheduling, you can send large volumes of email in queued batches or target individual recipients by specifying a custom UNIX timestamp parameter.\nUsing the parameters defined below, you can queue batches of emails targeting individual recipients.\n\n<call-out>\n\n**Emails can be scheduled up to 72 hours in advance.** However, this scheduling constraint does not apply to campaigns sent via [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/).\n\n</call-out>\n\nThis parameter allows SendGrid to begin processing a customer’s email requests before sending. SendGrid queues the messages and releases them when the timestamp indicates. This technique allows for a more efficient way to distribute large email requests and can **improve overall mail delivery time** performance. This functionality:\n\n- Improves efficiency of processing and distributing large volumes of email.\n- Reduces email pre-processing time.\n- Enables you to time email arrival to increase open rates.\n- Is available for free to all SendGrid customers.\n\n<call-out>\n\nCancel Scheduled sends by including a batch ID with your send. For more information, check out [Cancel Scheduled Sends](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends)!\n\n</call-out>\n\nWhen passing `send_at` or `send_each_at` please make sure to only use UNIX timestamps passed as integers, as shown in our examples. Any other type could result in unintended behavior.\n\n </call-out>\n\n<call-out type=\"warning\">\n\nUsing both `send_at` and `send_each_at` is not valid. Setting both causes your request to be dropped.\n\n</call-out>\n\n## Send At\n\nTo schedule a send request for a large batch of emails, use the `send_at` parameter which will send all emails at approximately the same time. `send_at` is a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time).\n\n### Example of send_at email header\n\n```json\n{\n  \"send_at\": 1409348513\n}\n```\n\n## Send Each At\n\nTo schedule a send request for individual recipients; use `send_each_at` to send emails to each recipient at the specified time. `send_each_at` is a sequence of UNIX timestamps, provided as an array. There must be one timestamp per email you wish to send.\n\n### Example of send_each_at email header\n\n```json\n{\n  \"to\": [\n    \"ben@example.com\",\n    \"john@example.com\",\n    \"mikeexampexample@example.com\",\n    \"example@example.com\",\n    \"example@example.com\",\n    \"example@example.com\"\n  ],\n  \"send_each_at\": [1409348513, 1409348514, 1409348515]\n}\n```\n\nTo allow for the cancellation of a scheduled send, you must include a `batch_id` with your send. To generate a valid `batch_id`, use the [batch id generation endpoint](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends). A `batch_id` is valid for 10 days (864,000 seconds) after generation.\n\n### Example of including a batch_id\n\n```json\n{\n  \"to\": [\n    \"ben@example.com\",\n    \"john@example.com\",\n    \"mikeexampexample@example.com\",\n    \"example@example.com\",\n    \"example@example.com\",\n    \"example@example.com\"\n  ],\n  \"send_at\": 1409348513,\n  \"batch_id\": \"MWQxZmIyODYtNjE1Ni0xMWU1LWI3ZTUtMDgwMDI3OGJkMmY2LWEzMmViMjYxMw\"\n}\n```\n\n## Additional Resources\n\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-smtp-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/section-tags.md",
    "content": "---\nseo:\n  title: Section Tags\n  description: Section tags allow you to substitute in content in an SMTP message.\n  keywords: SMTP, send email, section tags\ntitle: Section Tags\ngroup: x-smtpapi\nweight: 10\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been deprecated and has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nSection tags allow you to substitute in content in an SMTP message. Section tags are similar to [substitution tags]({{root_url}}/for-developers/sending-email/substitution-tags/) but are specific to the message, and not the recipient. You have to have a substitution tag value for **each** recipient, but you can have any number of section tags. Section tags can then contain Substitution tags for the recipient if needed. Section tags have to be contained within a Substitution tag since SendGrid needs to know which data to populate for the recipient.\nSee the [Section Tag Example Walkthrough](#section-tag-example-walkthrough) below.\n\nIt's possible and acceptable to use only Substitution tags. However, that method is not [DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself), and you may come against [message size limitations]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/).\n\n<call-out type=\"warning\">\n\nWhen passing `section` please make sure to only use strings as shown in our examples. Any other type could result in unintended behavior.\n\n</call-out>\n\nThe format of the SMTP API section tag has the form:\n\n```json\n{\n  \"section\": {\n    \":sectionName1\": \"section 1 text\",\n    \":sectionName2\": \"section 2 text\"\n  }\n}\n```\n\n<call-out>\n\nHow you flag your section tags may depend on the library you use to create your SMTP connection, the language you are writing your code in, or any intermediate mail servers that your servers will send mail through. In some cases `-subVal-` may be the best choice while in other cases, `%subVal%`, `#subVal#`, or `:subVal` may make more sense. The flag doesn't matter, as long as it's a unique string.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDo not use spaces inside your section or substitution tags! For example: `%first name%`. The space breaks the string.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDo not nest section tags in sections! This causes your section to not be replaced.\n\n</call-out>\n\n## Section Tag Walkthrough\n\nMessage body sent to SendGrid:\n\n```html\n<html>\n  <body>\n    Hi :salutation,<br />\n    Thanks so much for joining us at our event!\n\n    <p>\n      You have registered for the following event:<br />\n      :event_details.\n    </p>\n\n    Thanks,<br />\n    The SendGrid Team\n  </body>\n</html>\n```\n\nThe accompanying X-SMTPAPI JSON header would look like:\n\n```json\n{\n  \"to\": [\n    \"example1@example.com\",\n    \"example2@example.com\",\n    \"example3@example.com\"\n  ],\n  \"sub\": {\n    \":salutation\": [\":female\", \":male\", \":neutral\"],\n    \":name\": [\"Alice\", \"Bob\", \"Casey\"],\n    \":event_details\": [\":event1\", \":event2\", \":event1\"],\n    \":event_date\": [\"Jan 1\", \"Feb 14\", \"Aug 11\"]\n  },\n  \"section\": {\n    \":male\": \"Mr. :name\",\n    \":female\": \"Ms. :name\",\n    \":neutral\": \":name\",\n    \":event1\": \"New User Event on :event_date\",\n    \":event2\": \"Veteran User Appreciation on :event_date\"\n  }\n}\n```\n\nAlice receives:\n\n```html\n<html>\n  <body>\n    Hi Ms. Alice,<br />\n    Thanks so much for joining us at our event!\n\n    <p>\n      You have registered for the following event:<br />\n      New User Event on Jan 1.\n    </p>\n\n    Thanks,<br />\n    The SendGrid Team\n  </body>\n</html>\n```\n\nBob receives:\n\n```html\n<html>\n  <body>\n    Hi Mr. Bob,<br />\n    Thanks so much for joining us at our event!\n\n    <p>\n      You have registered for the following event:<br />\n      Veteran User Appreciation on Feb 14.\n    </p>\n\n    Thanks,<br />\n    The SendGrid Team\n  </body>\n</html>\n```\n\nCasey receives:\n\n```html\n<html>\n  <body>\n    Hi Casey,<br />\n    Thanks so much for joining us at our event!\n\n    <p>\n      You have registered for the following event:<br />\n      New User Event on Aug 11.\n    </p>\n\n    Thanks,<br />\n    The SendGrid Team\n  </body>\n</html>\n```\n\n## Additional Resources\n\n- [Substitution Tags]({{root_url}}/for-developers/sending-email/substitution-tags/)\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-smtp-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/segmentation-query-language.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Segmentation Query Language Reference\ngroup: sending-email\nnavigation:\n  show: true\nseo:\n  title: Segmentation Query Language Reference\n  description: SendGrid Segmentation Query Language Reference\n  keywords: SendGrid, segmentation, segmenting contacts, SGQL\n---\n\n## Data Types\n\n### Numeric\n\nAny numeric type that can be an integer or float.\n\n**Integer**: [1-9][0-9]*  \n**Float**: [0-9]+.[0-9]+\n\n### String\n\nA set of characters delimited by double or single quotes.\n\n#### Escaping\n\nEscaping must be done for the character used as the delimiter if it is found within the string. The escape character is the backslash, `\\`, which must also be escaped with a preceding `\\`.\n\n##### Escaping example\n\n```text\n'Hello, World! It\\'s a beautiful day'\n```\n\n#### Wildcards\n\nWhen using the `LIKE` or `NOT LIKE` operators, The percentage symbol, `%`, will be interpreted as a wildcard character. To escape this character and not treat it as a wildcard, a second `%` should be used.\n\n##### Wildcard example\n\n```text\n\"email LIKE '%gmail.com'\"\n```\n\n### DateTime\n\nA timestamp whose literal value is formatted as a string in ISO 8601 format: `YYYY-MM-DDTHH:mm:SSZ(-)HH:mm`\n\n### Interval\n\nA time interval with an integral scalar value and some unit of time, which can be one of the following: second, minute, hour, day, month, or year.\n\n##### Interval example\n\n```text\n\"10 day\"\n```\n\n### Boolean\n\nBoolean values are true or false.\n\n### Null\n\nNull is a special type that represents a lack of a value.\n\n## Operators\n\n### Logical\n\n<table>\n  <tr>\n    <th>Operator</th>\n    <th>Associativity</th>\n    <th>Operands</th>\n  </tr>\n  <tr>\n    <td>AND</td>\n    <td>Left</td>\n    <td>2</td>\n  </tr>\n  <tr>\n    <td>OR</td>\n    <td>Left </td>\n    <td>2</td>\n  </tr>\n  <tr>\n    <td>NOT</td>\n    <td>Right</td>\n    <td>2 (binary)</td>\n  </tr>\n  <tr>\n    <td>NOT</td>\n    <td>Right</td>\n    <td>1 (unary)</td>\n  </tr>\n</table>\n\n### Arithmetic\n\nPrecedence from low to high:\n\n   <table>\n  <tr>\n    <th>Operator</th>\n    <th>Associativity</th>\n    <th>Operands</th>\n    <th>Supported Types</th>\n  </tr>\n  <tr>\n    <td>-</td>\n    <td>Left</td>\n    <td>2 (binary)</td>\n    <td>Numeric - Numeric<br>DateTime - Interval</td>\n  </tr>\n  <tr>\n    <td>+ </td>\n    <td>Left</td>\n    <td>2</td>\n    <td>Numeric + Numeric<br>DateTime + Interval<br>String + String (concatenation)</td>\n  </tr>\n  <tr>\n    <td>/</td>\n    <td>Left</td>\n    <td>2 </td>\n    <td>Numeric / Numeric</td>\n  </tr>\n  <tr>\n    <td>*</td>\n    <td>Left</td>\n    <td>2</td>\n    <td>Numeric * Numeric</td>\n  </tr>\n  <tr>\n    <td>%</td>\n    <td>Left</td>\n    <td>2</td>\n    <td>Numeric % Numeric (modulo)</td>\n  </tr>\n  <tr>\n    <td>- </td>\n    <td>Left</td>\n    <td>1 (unary)</td>\n    <td>- Numeric</td>\n  </tr>\n</table>\n\n### Comparison\n\n<table>\n  <tr>\n    <th>Operator</th>\n    <th>Supported Types (T represents any type)</th>\n  </tr>\n  <tr>\n    <td>=</td>\n    <td>T = T</td>\n  </tr>\n  <tr>\n    <td>!=</td>\n    <td>T != T</td>\n  </tr>\n  <tr>\n    <td>&lt;</td>\n    <td>Numeric &lt; Numeric<br>DateTime &lt; DateTime<br>String &lt; String</td>\n  </tr>\n  <tr>\n    <td>&gt;</td>\n    <td>Numeric &lt; Numeric<br>DateTime &lt; DateTime<br>String &lt; String</td>\n  </tr>\n  <tr>\n    <td>&lt;=</td>\n    <td>Numeric &lt; Numeric<br>DateTime &lt; DateTime<br>String &lt; String</td>\n  </tr>\n  <tr>\n    <td>&gt;=</td>\n    <td>Numeric &lt; Numeric<br>DateTime &lt; DateTime<br>String &lt; String</td>\n  </tr>\n  <tr>\n    <td>LIKE/ NOT LIKE</td>\n    <td>String (NOT) LIKE String</td>\n  </tr>\n  <tr>\n    <td>IS (NOT)</td>\n    <td>T is (NOT) NULL</td>\n  </tr>\n  <tr>\n    <td>(NOT) IN</td>\n    <td>T IN (T)</td>\n  </tr>\n  <tr>\n    <td>(NOT) BETWEEN</td>\n    <td>Numeric (NOT) BETWEEN Numeric AND Numeric<br>DateTime (NOT) BETWEEN DateTime AND DateTime<br>String (NOT) BETWEEN String AND String</td>\n  </tr>\n</table>\n\n## Identifiers\n\nIdentifiers are named things within a given query. These include both function names and field/column names. Identifiers cannot be a keyword and must only allow the characters: `[a-zA-Z_]+.`.\n\n<call-out>\n\nIdentifiers that do not meet the previous format may still be used. However, they must be encapsulated within backticks.  I.E. \\`000supercoolid\\`\n\n</call-out>\n\n## Functions\n\nFunctions can be invoked with or without parameters by providing the function name—remember, function names are identifiers—followed by a list of comma separated arguments enclosed in parentheses.\n\n##### Function called with arguments example\n\n```text\nMY_FUNCTION(a,b,c)\n```\n\n### Well Defined Functions\n\nThese are functions that should be used consistently across consumers of the parser. Whether or not your implementation actually supports them is up to you.\n\n#### CONTAINS()\n\n```text\nCONTAINS(array_or_map, value_or_key)\n```\n\nContains should return a boolean indicating the presence of a value in an array or map. When used with an array, true should be returned when the array holds the given value. When used with a map, true should be returned when the map has an element with the given key.\n\n#### CONCAT()\n\n```text\nCONCAT(string_one,string_two)\n```\n\nConcat takes two strings, combines them as a single string in the order they are passed in, and returns the result.\n\n#### LENGTH()\n\n```text\nLENGTH(string)\n```\n\nLength takes a single string and returns the number of characters in the string.\n\n#### LOWER()\n\n```text\nLOWER(string)\n```\n\nLower returns a lowercase version of the given string.\n\n#### NOW()\n\n```text\nNOW()\n```\n\nReturns the current date and time.\n\n## Fields\n\nA number of fields are available on every contact. These include the strings:\n\n- `alternate_emails`\n- `address_line_1`\n- `address_line_2`\n- `city`\n- `contact_id`\n- `country`\n- `created_at`\n- `email`\n- `email_domains`\n- `event_data`\n- `event_source`\n- `event_timestamp`\n- `event_type`\n- `first_name`\n- `list_ids`\n- `last_name`\n- `postal_code`\n- `state_province_region`\n- `updated_at`\n\n<call-out>\n\nIn the future, the address fields may be used with a third-party service to populate a `location` type field when contacts are added or updated. In addition, a contact's `alternate_emails` field represents a set of strings.\n\n</call-out>\n\n## Examples and Use Cases\n\n### A query for getting all gmail users:\n\n```json\n{\n  \"name\": \"All Gmail Users\",\n  \"query_dsl\": \"email LIKE '%gmail.com'\"\n}\n```\n\n### A query for getting contacts in specific zip codes:\n\n```json\n{\n  \"name\": \"My Favorite Zip Codes\",\n  \"query_dsl\": \"postal_code IN ('90124', '90125', '90126')\"\n}\n```\n\n### A query for getting contacts NOT in specific zip codes:\n\n```json\n{\n  \"name\": \"My Least Favorite Zip Codes\",\n  \"query_dsl\": \"postal_code NOT IN ('90124', '90125', '90126')\"\n}\n```\n\n### A query showing how to use lowercase text:\n\n```json\n{\n  \"name\": \"Everyone named Bob, BOB or bob\",\n  \"query_dsl\": \"lower(first_name) = 'bob'\"\n}\n```\n\n### A query for contacts that received any email in the last 10 days:\n\n```json\n{\n  \"name\": \"All Delivered in Last 10 days\",\n  \"query_dsl\": \"(event_source = 'mail' AND event_type = 'delivered' AND event_timestamp >= (NOW() - interval 10 day))\"\n}\n```\n\n### A query for contacts that received any email between two dates:\n\n```json\n{\n  \"name\": \"All Delivered in Last 10 days\",\n  \"query_dsl\": \"(event_source = 'mail' AND event_type = 'delivered' AND event_timestamp BETWEEN TIMESTAMP '2019-08-07T18:00:00Z' AND TIMESTAMP '2019-08-08T18:00:00Z')\"\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/send-mime-messages-with-sendgrid.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Send Mime Messages With SendGrid\ngroup: api-v3\nnavigation:\n  show: true\n---\n\n## Sending MIME Mail\n\nSome mail clients, such as Outlook and Thunderbird, appear to insert double spacing line breaks at every line. The reason is that those mail clients set the 'content-transfer-encoding' in MIME to 'quoted-printable' which adds Carriage Return Line Feed (CRLF) line breaks to the source content of the email which are characters interpreted by these mail clients. To alleviate this problem, please do the following:\n\n1. If you can customize the MIME settings for your email, set the 'Content-Transfer-Encoding' to '7bit' instead of 'Quoted-Printable.'\n1. Ensure that your content follows the line length limits.\n1. Line breaks appear as CRLF characters in the source of an email with the character combination of \" =0D\" in the source of an email. These characters appear only with 'quoted-printable' (Content-Transfer-Encoding set in MIME) emails. Email clients such as Outlook and Thunderbird render these characters which resulting in additional breaks in the content of your emails.\n\nUse the MIME layout in your email below when sending through SendGrid. It is best to reference files using separate links to download since it lowers the percentage of spam threshold for most domains you are sending to.\n\n## Sending email with multiple content types (text+html)\n\n``` language\nemail = SendGrid::Mail.new\n\nemail.from = SendGrid::Email.new(email: 'team@email.com')\n\nemail.subject = \"App - Reset Password\"\n\nper = SendGrid::Personalization.new\n\nper.to = SendGrid::Email.new(email: user.email, name: user.name)\n\nper.substitutions = SendGrid::Substitution.new(key: \"user_name\", value: user.name.split(\" \")[0].capitalize)\n\nper.substitutions = SendGrid::Substitution.new(key: \"reset_link\", value: some_func(token, email: user.email))\n\nemail.personalizations = per\n\nemail.contents = Content.new(type: 'text/html', value: 'test')\n\nemail.contents = SendGrid::Content.new(type: 'text/plain', value: \"Hi #{user.name}.. Click the following link to reset your password.. #{function_reset(token, email: user.email)}... This link will expire in two hours.. If you did not request your password to be reset, please ignore this email and your password will stay as it is.\")\n\nemail.template_id = \"6ede18bb-2eba-4958-8a57-43a58a559a0a\"\n\nresponse = @@sg.client.mail._('send').post(request_body: email.to_json)\n\nputs response.status_code\n\nputs response.body\n\nputs response.headers\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/sender-identity.md",
    "content": "---\nlayout: page\ntitle: Sender Identity\ngroup: sending-email\nnavigation:\n  show: false\nseo:\n  title: Sender Identity\n  override: true\n  description: Understanding the difference between Domain Authentication and verifying a Single Sender.\n---\n\nTo ensure our customers maintain the best possible sender reputations and to uphold legitimate sending behavior, we require customers to verify their Sender Identities. A Sender Identity represents your “From” email address—the address your recipients will see as the sender of your emails.\n\nYou can verify one or more Sender Identities using either Domain Authentication or Single Sender Verification. There are advantages to both verification methods, and we provide detailed guides to configure whichever option you choose.\n\nThis page offers a high-level overview of Single Sender Verification and Domain Authentication to help you decide which option best fits your needs.\n\n### Single Sender Verification\n\nSingle Sender Verification is a fast way to verify your Sender Identity when you don’t have access to the DNS settings for your domain. Though you will want to complete Domain Authentication for your production mail send, Single Sender Verification is a great way to start quickly while building a proof of concept or test.\n\n#### Advantages of Single Sender Verification\n\n- Single Sender Verification is a quick method of verification when starting.\n- You can send from a single email address that you confirm ownership of by clicking a verification link in the email’s inbox.\n\n#### Disadvantages of Single Sender Verification\n\n- Single Sender Verification is recommended for testing only.\n- You can send only from the address you verify rather than any address on an authenticated domain.\n\nTo verify a Single Sender, see our [Single Sender Verification page]({{root_url}}/ui/sending-email/sender-verification).\n\n### Domain Authentication\n\n<call-out>\n\nPlease note, you must have the ability to edit the DNS records on the domain you want to authenticate.\n\n</call-out>\n\nDomain Authentication is the preferred method of verification. Though Single Sender Verification provides a quick start, Domain Authentication should be completed before you launch your mail send into production. If access to DNS records is a barrier for you, you can always start with Single Sender Verification and return to Domain Authentication once you obtain DNS access.\n\n#### Advantages of Domain Authentication\n\n- An authenticated domain improves mail deliverability and a sender's reputation.\n- Domain Authentication is an industry best practice that's ideal for production sending.\n- You can send from any email address on your authenticated domain.\n\nTo authenticate your domain, see [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/sendmail.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Sendmail\ngroup: mail-servers\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nSendmail requires libsasl in order to properly send authentication requests to SendGrid servers. The saslauthd server daemon is not required unless you plan to receive authentication requests to the same server. [For more information on configuring sendmail for SASL support, check the official documentation](http://www.sendmail.com/sm/open_source/tips/compiling_sendmail/#SASL).\n\n</call-out>\n\nSet the authorization credentials in **/etc/mail/access**\n\n<call-out type=\"warning\">\n\nWe have had reports that some customers have needed to install `cyrus-sasl-plain` in order to avoid authentication issues as well. We have not validated this requirement, so please make sure your system administrators, Ops, and/or InfoSec people approve this change before you make it!\n\n</call-out>\n\n```bash\nAuthInfo:smtp.sendgrid.net \"U:apikey\" \"P:yourAPIKey\" \"M:PLAIN\"\n```\n\nDefine the Smart Host in **/etc/mail/sendmail.mc** You should add these lines just after the commented \"\\#dnl define('SMART_HOST', 'smtp.your.provider')dnl\" line in the file\n\n```bash\ndefine(`SMART_HOST', `smtp.sendgrid.net')dnl\nFEATURE(`access_db')dnl\ndefine(`RELAY_MAILER_ARGS', `TCP $h 587')dnl\ndefine(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl\n```\n\nUpdate sendmail.cf and access.db files\n\n(You will need to run these commands as 'su' or 'root')\n\n```bash\n$ cd /etc/mail\n$ m4 sendmail.mc >sendmail.cf\n$ makemap hash access.db < access\n```\n\nOn older distros, you can run restart sendmail like so:\n\n```bash\n$ /etc/init.d/sendmail restart\n```\n\nIf, however, you're using a newer version, do the following to restart:\n\n```bash\n$ service sendmail restart\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/single-sends-2020-update.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Single Sends 2020 Update\ngroup: sending-email\nnavigation:\n  show: false\nseo:\n  title: Single Sends 2020 Update\n  description: Instructions for migrating to the updated Single Sends API\n  keywords:\n---\n\n<call-out type=\"warning\">\n\n**Action required to ensure successful create, read, and update operations using the Single Sends API**.\n\nThe Single Sends API has changed. Please check this page for instructions.\n\n</call-out>\n\nTo improve your experience when working with the Single Sends API, Twilio SendGrid has streamlined the API’s request and response formats. You can now pass all the required information to create a Single Send in one request, eliminating the need to first create a template.\n\nThese improvements require modifications to your code. To ease this transition, we initially released the updated API while continuing to provide the previous API at a new root path until June 6, 2020. The previous API should not be relied on after June 6, 2020 and will be removed. The information below outlines the changes between the two APIs to help you migrate your code if have not done so already.\n\n## Migrating to the new API\n\n**New API available at**: `https://api.sendgrid.com/v3/marketing/singlesends`\n\nAll requests to the `/marketing/singlesends` root path must use the updated request format. Any requests to `/marketing/singlesends` using the previous Single Sends format will result in a 400-level error.\n\n## API request and response bodies\n\nThe new Single Sends API request and response bodies have been refined to contain only five top level fields: `name`, `categories`, `send_at`, `send_to`, and `email_config`. Both `send_to` and `email_config` are object types containing additional fields.\n\nThe `email_config` field provides the ability to send data that would currently be associated with a template. Rather than first creating a template and then passing a template ID to the Single Sends create endpoint, all template data can be passed in the initial request using the fields in the `email_config` object.\n\nThe table below provides a list of all available fields for both the existing API and updated API. Notes are made where fields have been reorganized in the schema. Please see our [API reference](https://sendgrid.api-docs.io/v3.0/single-sends) for full documentation and code samples.\n\n### Single Sends API fields\n\n <table>\n      <tbody>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span style=\"font-weight: bold\">Field: Existing Single Sends API</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span style=\"font-weight: bold\">Field: Updated Single Sends API</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span style=\"font-weight: bold\">Notes</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span style=\"font-weight: bold\">Response or Request Field</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span style=\"font-weight: bold\">Data Type</span></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>name</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>name</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>Both</p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>categories</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>categories</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>array[string]</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>sender_id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>sender_id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span>Moved to <code>email_config</code>: <code>sender_id</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>Both</p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>integer</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>status</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>status</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Response</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>custom_unsubscribe_url</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <code>email_config</code>: <code>custom_unsubscribe_url</code>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span\n                >Moved to <code>email_config</code>: <code>custom_unsubscribe_url</code></span\n              >\n            </p>\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Response</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>suppression_group_id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span\n                >Moved to <code>email_config</code>: <code>suppression_group_id</code></span\n              >\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p ><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>integer</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>filter</code>: <code>list_ids</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>send_to</code>: <code>list_ids</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span>Moved to <code>send_to</code>: <code>list_ids</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p class=\"c0\"><code>array[string]</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>filter</code>: <code>send_to_all</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>send_to</code>: <code>all</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Moved to <code>send_to</code>: <code>all</code></span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>boolean</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>send_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>send_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>template_id</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>updated_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>updated_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Response</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>created_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>created_at</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Response</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>ip_pool</code></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span><code>email_config</code>: <code>ip_pool</code></span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span>Moved to <code>email_config</code>: <code>ip_pool</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span><code>send_to</code>: <code>segment_ids</code></span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>array[string]</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span><code>email_config</code>: <code>subject</code></span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span><code>email_config</code>: <code>html_content</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span><code>email_config</code>: <code>plain_content</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>string</span></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span><code>email_config</code>: <code>generate_plain_content</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>boolean</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p>\n              <span><code>email_config</code>: <code>design_id</code></span>\n            </p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Request</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n        <tr>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>NA</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span><code>email_config</code>: <code>editor</code></span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><span>Both</span></p>\n          </td>\n          <td colspan=\"1\" rowspan=\"1\">\n            <p><code>string</code></p>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-errors-and-troubleshooting.md",
    "content": "---\nseo:\n  title: SMTP Errors and Troubleshooting\n  description: SMTP Response codes and troubleshooting tips\n  keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients\ntitle: SMTP Errors and Troubleshooting\ngroup: smtp\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n## Response codes\n\nEach SMTP call you make returns a response. `200` responses are usually success responses, and `400` responses are usually deferrals. SendGrid continues to retry resending `400` messages for up to 72 hours. `500` responses are hard failures that are not retried by our servers. This table has possible response codes with example errors and a general explanation of that sort of response.\n\n<table class=\"table\">\n  <colgroup>\n  <col class=\"table-col-100\">\n  <col>\n  <col>\n  </colgroup>\n  <tr>\n    <th>Error</th>\n    <th>Message</th>\n    <th>Explanation</th>\n  </tr>\n  <tr>\n    <td>250</td>\n    <td>`Queued mail for delivery`</td>\n    <td>Your mail has been successfully queued! This response indicates that the recipient server has accepted the message.</td>\n  </tr>\n    <tr>\n    <td>403</td>\n    <td>`You are not authorized to send from that email address`</td>\n    <td>This means the \"from\" address does not match a verified Sender Identity. Mail cannot be sent until this error is resolved. To learn how to resolve this error, see our [Sender Identity requirements]({{root_url}}for-developers/sending-email/sender-identity/).</td>\n  </tr>\n  <tr>\n    <td>421</td>\n    <td>`Message from (X.X.X.X) temporarily deferred`</td>\n    <td>Messages are temporarily deferred because of recipient server policy - often it's because of too many messages or connections in too short of a timeframe. We continue to retry deferred messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried.</td>\n  </tr>\n  <tr>\n    <td>450</td>\n    <td>`too frequent connects from 198.37.147.135, please try again later.`</td>\n    <td>The message failed because the recipient's mailbox was unavailable, perhaps because it was locked or was not routable at the time. We continue to retry messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried.</td>\n  </tr>\n  <tr>\n    <td>451</td>\n    <td>`Temporary local problem - please try later`</td>\n    <td>The message simply failed, usually due to a far-end server error. We continue to retry messages for up to 72 hours.</td>\n  </tr>\n  <tr>\n    <td>451</td>\n    <td>`Authentication failed: Maximum credits exceeded`</td>\n    <td>There is a credit limit of emails per day enforced in error. <a href=\"https://support.sendgrid.com/hc/en-us\">Contact support</a> to remove that limit.</td>\n  </tr>\n  <tr>\n    <td>452</td>\n    <td>`Too many recipients received this hour (throttled)`</td>\n    <td>The message has been deferred due to insufficient system storage. We continue to retry messages for up to 72 hours.</td>\n  </tr>\n  <tr>\n    <td>550</td>\n    <td>`Requested action not taken: mailbox unavailable`</td>\n    <td>The user’s mailbox was unavailable. Usually because it could not be found, or because of incoming policy reasons. Remove these address from your list - it is likely a fake, or it was mistyped.</td>\n  </tr>\n  <tr>\n    <td>551</td>\n    <td>`User does not exist.`</td>\n    <td>The intended mailbox does not exist on this recipient server. Remove these addresses from your list.</td>\n  </tr>\n  <tr>\n    <td>552</td>\n    <td>`This message is larger than the current system limit or the recipient’s mailbox is full. Create a shorter message body or remove attachments and try sending it again.`</td>\n    <td>The recipients mailbox has exceeded its storage limits. We don't resend messages with this error code because this is usually a sign this is an abandoned email.</td>\n  </tr>\n  <tr>\n    <td>553</td>\n    <td>`Invalid/inactive user.`</td>\n    <td>The message was refused because the mailbox name is either malformed or does not exist. Remove these addresses from your list.</td>\n  </tr>\n  <tr>\n    <td>554</td>\n    <td>`ERROR: Mail refused`</td>\n    <td>This is a default response that can be caused by a lot of issues. There is often a human readable portion of this error that gives more detailed information, but if not, remove these addresses from your list.</td>\n  </tr>\n  <tr>\n    <td>Other</td>\n    <td>`Delayed Bounce - Unable to Parse Server Reason`</td>\n    <td>This is what SendGrid displays when the reciepients server returns a blank reason code.</td>\n  </tr>\n</table>\n\n## Turning off click tracking\n\nTo turn off click tracking, add this to your X-SMTPAPI header:\n\n```json\n{\n  \"filters\": {\n    \"clicktrack\": {\n      \"settings\": {\n        \"enable\": 0\n      }\n    }\n  }\n}\n```\n\n## Invalid SMTP API header\n\nWhen you try to send an invalid X-SMTPAPI header, you will get an email with details about the invalidations. You may also see errors on your Email Activity page or in your Event Webhook data. If this happens, the email should give you the information you need to begin troubleshooting. We also recommend uploading your JSON into a JSON validator, because this is often an invalid JSON issue.\n\n## Certificate verification failed for smtp.sendgrid.net\n\n`\"certificate verification failed for [smtp.sendgrid.net](http://smtp.sendgrid.net/)[198.37.144.225]:587: untrusted issuer /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority\"`\n\nIf you receive this error, the connection is still encrypted; it's just that your server doesn't have the necessary CA (certificate authority) certificates to confirm that our certificate is valid.\n\n_To update your certificates:_\n\n1. Download the GoDaddy CA bundle from [https://certs.godaddy.com/anonymous/repository.pki](https://certs.godaddy.com/anonymous/repository.pki) (grab the one called `\"gd_bundle-g2-g1.crt\"`).\n1. Save that on your server.\n1. Tell Postfix where to find it by adding or editing the following line in `/etc/postfix/` [main.cf](http://main.cf/): `\"smtp_tls_CAfile = /etc/postfix/ssl/gd_bundle-g2-g1.crt\"`\n1. Restart Postfix to make the change take effect.\n\nIf the mail server communicates with more than just us, add this certificate to your existing CA bundle (frequently called `ca-bundle.crt`).\n\n## 550 Unauthenticated Senders Not Allowed\n\nIf you’re getting an “Unauthenticated Senders Not Allowed” error, the problem usually lies in authenticating with our SMTP server. This error gets triggered when there was an attempt to hand over an email message through smtp.sendgrid.net before authenticating the connection with your SendGrid username and API key.\n\nTo fix this issue, you’ll want to make sure that you’ve configured your setup to connect to `smtp.sendgrid.net` using authentication, and that the credentials you’re using are your SendGrid username and a properly configured API key as the password. For more on API keys, see [API Keys]({{root_url}}/ui/account-and-settings/api-keys/).\n\nIf you’re using cPanel/Exim, you’ll want to make sure it’s configured to authenticate every time it connects to `smtp.sendgrid.net`.\n\n## Additional Resources\n\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-filters.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Filters\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\n\nFollowing are the settings that can be specified in the filters section of the X-SMTPAPI header. All filters and setting names must be lowercase.\n\n<call-out>\n\n- If you're enabling a Setting, also called a filter, via SMTPAPI, you are required to define all of the parameters for that Setting.\n- If you enable a disabled setting, our system will not pull your settings for the disabled setting. You will need to define the settings in your X-SMTPAPI header <em>Example:</em> If you have a footer designed but disabled, you can't just enable it via the API; you need to define the footer in the API call itself.\n- All filter names and setting names must be lowercase.\n\n</call-out>\n\nFor more information on the utility of these settings, please check out the [Settings]({{root_url}}/ui/account-and-settings/account/) section.\n\n<call-out>\n\nSome Settings are not listed here because they cannot be defined on a per-message basis. To update these other Settings, please refer to the\n[Web API Filter Settings](https://sendgrid.api-docs.io/v3.0/settings-mail) commands.\n\n</call-out>\n\n## Filter: bcc\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\n<p>Sends a BCC copy of the email created in this transaction to the address specified.</p>\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>email</td>\n<td><code>email</code></td>\n<td>email address destination for the bcc message</td>\n</tr>\n</tbody>\n</table>\n\n```json\n{\n  \"filters\": {\n    \"bcc\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"email\": \"example@example.com\"\n      }\n    }\n  }\n}\n```\n\n## Filter: bypass_list_management\n\n<call-out type=\"warning\">\n\nThis setting is very powerful, and can only be used on a per-message basis. Use with extreme caution. To learn more about the more granular bypass settings available in the v3 Mail Send API, see our [Suppressions Overview documentation]({{root_url}}/ui/sending-email/index-suppressions/#bypass-suppressions).\n\n</call-out>\n\nSome emails are too important to do normal list management checks, such as password resets or critical alerts. Enabling this filter will bypass the normal unsubscribe / bounce / spam report checks and queue the email for delivery.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n</tbody>\n</table>\n\n```json\n{\n  \"filters\": {\n    \"bypass_list_management\": {\n      \"settings\": {\n        \"enable\": 1\n      }\n    }\n  }\n}\n```\n\n## Filter: clicktrack\n\nRewrites links in email text and html bodies to go through our webservers, allowing for tracking when a link is clicked on.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n  <td>enable_text</td>\n  <td><code>true</code> | <code>false</code></td>\n  <td>Enable or Disable click-tracking links in the Plain-Text portion of the message.</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"clicktrack\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"enable_text\": true\n      }\n    }\n  }\n}\n```\n\n## Filter: dkim\n\nAllows you to specify the domain to use to sign messages with DKIM\ncertification. This domain should match the domain in the From address\nof your email.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>domain</td>\n<td><code>domain</code></td>\n<td>The domain you would like your DKIM certification signed with</td>\n</tr>\n<tr>\n<td>use_from</td>\n<td><code>0</code> | <code>1</code></td>\n<td>If enabled, the domain in the From: header of the email will be used to sign your DKIM</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"dkim\": {\n      \"settings\": {\n        \"domain\": \"example.com\",\n        \"use_from\": false\n      }\n    }\n  }\n}\n```\n\n## Filter: footer\n\nInserts a footer at the bottom of the text and HTML bodies.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>text/html</td>\n<td><code>string</code></td>\n<td>String containing html body</td>\n</tr>\n<tr>\n<td>text/plain</td>\n<td><code>string</code></td>\n<td>String containing text body</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"footer\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"text/html\": \"<p>Thanks,<br />The SendGrid Team<p>\",\n        \"text/plain\": \"Thanks,\\n The SendGrid Team\"\n      }\n    }\n  }\n}\n```\n\n## Filter: ganalytics\n\nRe-writes links to integrate with Google Analytics.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>utm_source</td>\n<td><code>string</code></td>\n<td>Value for the utm_source field</td>\n</tr>\n<tr>\n<td>utm_medium</td>\n<td><code>string</code></td>\n<td>Value for the utm_medium field</td>\n</tr>\n<tr>\n<td>utm_term</td>\n<td><code>string</code></td>\n<td>Value for the utm_term field</td>\n</tr>\n<tr>\n<td>utm_content</td>\n<td><code>string</code></td>\n<td>Value for the utm_content field</td>\n</tr>\n<tr>\n<td>utm_campaign</td>\n<td><code>string</code></td>\n<td>Value for the utm_campaign field</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"ganalytics\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"utm_source\": \"Transactional Email\",\n        \"utm_medium\": \"email\",\n        \"utm_content\": \"Reset Your Password\",\n        \"utm_campaign\": \"Redesigned Transactional Messaging\"\n      }\n    }\n  }\n}\n```\n\n## Filter: opentrack\n\nIf you don't use 'replace' this will insert an <code>&lt;img&gt;</code> tag at the bottom of the html section of an email which will be used to track if an email is opened. If you choose to use 'replace', you can put the tracking pixel wherever you would like in the email and SendGrid will replace it at send time.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>replace</td>\n<td>string</td>\n<td>A string to be replaced by SendGrid with the tracking image at send time.</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"opentrack\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"replace\": \"%opentrack%\"\n      }\n    }\n  }\n}\n```\n\n## Filter: spamcheck\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nTests message with [SpamAssassin](http://spamassassin.apache.org/) to determine if it is spam, and drop it if it is.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>maxscore</td>\n<td><code>1</code> to <code>10.0</code></td>\n<td>Score after which the message will be dropped (default is 5.0, higher scores indicate higher likelihood of spam)</td>\n</tr>\n<tr>\n<td>url</td>\n<td><code>url</code></td>\n<td>an optional url to POST the email and a copy of the report to. Refer to the <a href=\"https://sendgrid.com/docs/ui/account-and-settings/mail/#spam-checker\">Spam Checker documentation</a> for POST details.</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"spamcheck\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"maxscore\": 3.5,\n        \"url\": \"http://example.com/compliance\"\n      }\n    }\n  }\n}\n```\n\n## Filter: subscriptiontrack\n\nInserts a subscription management link at the bottom of the text and html bodies or insert the link anywhere in the email.\n\nIf you wish to append an unsubscription link, use the <code>text/html</code> and <code>text/plain</code> parameters. However, if you wish to have the link replace a tag (such as <code>[unsubscribe]</code>), use the <code>replace</code> parameter.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this App</td>\n</tr>\n<tr>\n<td>text/html</td>\n<td><code>string</code></td>\n<td>HTML to be appended to the email, with the subscription tracking link. You may control where the link is by using a tag like so: <code><% link text %></code></td>\n</tr>\n<tr>\n<td>text/plain</td>\n<td><code>string</code></td>\n<td>Text to be appended to the email, with the subscription tracking link. You may control where the link is by using a tag like so: <code><% %></code></td>\n</tr>\n<tr>\n<td>replace</td>\n<td><code>string</code></td>\n<td>A tag that will be replaced with the unsubscribe URL (e.g. <code>[unsubscribe_url]</code>). If this parameter is included, it will override <code>text/html</code> and <code>text/plain</code> The URL of the link will be placed at the replace tag's location, with no html or other formatting.</td>\n</tr>\n</tbody>\n</table>\n\n<call-out type=\"warning\">\n\nThe `landing` argument cannot be used in SMTPAPI. It can only be setup via the UI or WebAPI, as an account-level setting.\n\n</call-out>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"subscriptiontrack\": {\n      \"settings\": {\n        \"text/html\": \"If you would like to unsubscribe and stop receiving these emails <% click here %>.\",\n        \"text/plain\": \"If you would like to unsubscribe and stop receiving these emails click here: <% %>.\",\n        \"enable\": 1\n      }\n    }\n  }\n}\n```\n\n## Filter: templates\n\n<call-out>\n\nThis setting refers to SendGrid's [transactional templates](https://sendgrid.api-docs.io/v3.0/transactional-templates). SendGrid supports versioning, and the ability to create multiple transactional templates. Previously, we had a Template App, which is now referred to as the [Legacy Template App](#template).\n\n</call-out>\n\nUses a [transactional template](https://sendgrid.api-docs.io/v3.0/transactional-templates) when sending an email.\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>template_id</td>\n<td><code>string</code></td>\n<td>The ID of the template to use when sending a message, represented by a string.</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"templates\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"template_id\": \"5997fcf6-2b9f-484d-acd5-7e9a99f0dc1f\"\n      }\n    }\n  }\n}\n```\n\n## Filter: template\n\n<call-out type=\"warning\">\n\nThis setting refers to our original Email Template app. We now support more fully featured [transactional templates](#templates). You may create multiple transactional templates that allow for versioning, in addition to several other features.\n\n</call-out>\n\n<p>Wraps a template around your email content. Useful for sending out marketing email and other nicely formatted messages.</p>\n\n<table class=\"table table-striped table-bordered\">\n<tbody>\n<tr>\n<th>Parameter Name</th>\n<th>Parameter Value</th>\n<th>Parameter Description</th>\n</tr>\n<tr>\n<td>enable</td>\n<td><code>0</code> | <code>1</code></td>\n<td>Disable or enable this Setting</td>\n</tr>\n<tr>\n<td>text/html</td>\n<td><code>string</code></td>\n<td>String containing html content for the template (must contain a <code>&lt;% body %&gt;</code> tag)</td>\n</tr>\n</tbody>\n</table>\n\n#### Example X-SMTPAPI Header Value\n\n```json\n{\n  \"filters\": {\n    \"template\": {\n      \"settings\": {\n        \"enable\": 1,\n        \"text/html\": \"<html><head></head><body bgcolor='pink'><div style='width:200px' bgcolor='#FFF'><% body %></div></body></html>\"\n      }\n    }\n  }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-go-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Go Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\n\n\nSendGrid recommends using our [Go SMTPAPI library](https://github.com/sendgrid/smtpapi-go), full documentation can be found on GitHub. Our [Go API library](https://github.com/sendgrid/sendgrid-go) allows you to fully integrate with SendGrid.\n\n\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-nodejs-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Node.js Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\nSendGrid recommends using our [Node.js SMTPAPI library](https://github.com/sendgrid/smtpapi-nodejs), full documentation can be found on GitHub. Our [Node.js API library](https://github.com/sendgrid/sendgrid-nodejs) allows you to fully integrate with SendGrid.\n\n\n\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-perl-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Perl Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n## SmtpApiHeader.pm\n\n```perl\n#!/usr/bin/perl\n\n# Version 1.0\n# Last Updated 6/22/2009\nuse strict;\npackage SmtpApiHeader;\nuse JSON;\n\nsub new\n{\nmy $self = shift;\nmy @a = ();\n$self = { 'data' => { }};\nbless($self);\nreturn $self;\n}\n\nsub addTo\n{\nmy $self = shift;\nmy @to = @_;\npush(@{$self->{data}->{to}}, @to);\n}\n\nsub addSubVal\n{\nmy $self = shift;\nmy $var = shift;\nmy @val = @_;\n\nif (!defined($self->{data}->{sub}->{$var}))\n{\n  $self->{data}->{sub}->{$var} = ();\n}\npush(@{$self->{data}->{sub}->{$var}}, @val);\n}\n\nsub setUniqueArgs\n{\nmy $self = shift;\nmy $val = shift;\nif (ref($val) eq 'HASH')\n{\n  $self->{data}->{unique_args} = $val;\n}\n}\n\nsub setCategory\n{\nmy $self = shift;\nmy $cat = shift;\n$self->{data}->{category} = $cat;\n}\n\nsub addFilterSetting\n{\nmy $self = shift;\nmy $filter = shift;\nmy $setting = shift;\nmy $val = shift;\nif (!defined($self->{data}->{filters}->{$filter}))\n{\n  $self->{data}->{filters}->{$filter} = {};\n}\nif (!defined($self->{data}->{filters}->{$filter}->{settings}))\n{\n  $self->{data}->{filters}->{$filter}->{settings} = {};\n}\n$self->{data}->{filters}->{$filter}->{settings}->{$setting} = $val;\n}\n\nsub asJSON\n{\nmy $self = shift;\nmy $json = JSON->new;\n$json->space_before(1);\n$json->space_after(1);\nreturn $json->encode($self->{data});\n}\n\nsub as_string\n{\nmy $self = shift;\nmy $json = $self->asJSON;\n$json =~ s/(.{1,72})(\\s)/$1\\n   /g;\nmy $str = \"X-SMTPAPI: $json\";\nreturn $str;\n}\n```\n\n## Example Perl Usage\n\n```perl\n#!/usr/bin/perl\nuse SmtpApiHeader;\n\nmy @receiver = ('kyle','bob','someguy');\n\nmy $hdr = SmtpApiHeader->new;\n\nmy $time = '1pm';\nmy $name = 'kyle';\n\n$hdr->addFilterSetting('subscriptiontrack', 'enable', 1);\n$hdr->addFilterSetting('twitter', 'enable', 1); #please check the apps available for your current package at https://sendgrid.com/pricing\n$hdr->addTo(@receiver);\n$hdr->addTo('kyle2');\n\n$hdr->addSubVal('-time-', $time);\n\n$hdr->addSubVal('-name-', $time);\n$hdr->setUniqueArgs({'test'=>1, 'foo'=>2});\n\nprint $hdr->as_string;\n\nprint \"\\n\";\n</code>\n\n## \tFull Perl Example\n <p>The following code builds a MIME mail message demonstrating all the portions of the SMTP API protocol. To use this example, you will need to have the following perl modules installed:</p>\n<ul class=\"regular\">\n  <li>MIME::Entity</li>\n  <li>Authen::SASL</li>\n  <li>JSON</li>\n</ul>\n<code>\n#!/usr/bin/perl\nuse strict;\nuse SmtpApiHeader;\nuse MIME::Entity;\nuse Net::SMTP;\n\nmy $hdr = SmtpApiHeader->new;\n\n# The list of addresses this message will be sent to\nmy @toList = ('isaac@example', 'tim@example', 'jose@example');\n\n# The names of the recipients\nmy @nameList = ('Isaac', 'Tim', 'Jose');\n\n# Another substitution variable\nmy @timeList = ('4pm', '1pm', '2pm');\n\n# Set all of the above variables\n$hdr->addTo(@toList);\n$hdr->addSubVal('-name-', @nameList);\n$hdr->addSubVal('-time-', @timeList);\n\n# Specify that this is an initial contact message\n$hdr->setCategory(\"initial\");\n\n# Enable a text footer and set it\n$hdr->addFilterSetting('footer', 'enable', 1);\n$hdr->addFilterSetting('footer', \"text/plain\", \"Thank you for your business\");\n\nmy $from = 'you@yourdomain.com';\n\n# For multiple recipient emails, the 'to' address is irrelevant\nmy $to = 'example@example.com';\nmy $plain = <<EOM;\nHello -name-,\n\nThank you for your interest in our products. We have set up an appointment\nto call you at -time- EST to discuss your needs in more detail.\n\nRegards,\nFred\nEOM\n\nmy $html = <<EOM;\n<html>\n<head></head>\n<body>\n<p>Hello -name-,<br />\n Thank you for your interest in our products. We have set up an appointment<br />\n to call you at -time- EST to discuss your needs in more detail.<br />\n\n  Regards,<br />\n  Fred<br />\n</p>\n</body>\n</html>\nEOM\n\n# Create the MIME message that will be sent. Check out MIME::Entity on CPAN for more details\nmy $mime = MIME::Entity->build(Type  => 'multipart/alternative' ,\n\nEncoding => '-SUGGEST',\nFrom => $from,\nTo => $to,\nSubject => 'Contact Response for <name> at <time>');\n\n# Add the header\n$mime->head->add(\"X-SMTPAPI\", $hdr->asJSON);\n\n# Add body\n$mime->attach(Type => 'text/plain',\n                  Encoding =>'-SUGGEST',\n                  Data => $plain);\n\n$mime->attach(Type => 'text/html',\n                  Encoding =>'-SUGGEST',\n                  Data => $html);\n\n# Login credentials\nmy $username = 'apikey';\nmy $api_key = \"your_api_key\";\n\n# Open a connection to the SendGrid mail server\nmy $smtp = Net::SMTP->new('smtp.sendgrid.net',\n                  Port=> 587,\n                  Timeout => 20,\n                  Hello => \"yourdomain.com\");\n\n# Authenticate\n$smtp->auth($username, $api_key);\n\n# Send the rest of the SMTP stuff to the server\n$smtp->mail($from);\n$smtp->to($to);\n$smtp->data($mime->stringify);\n$smtp->quit();\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-php-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP PHP Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\nSendGrid recommends using our [PHP SMTPAPI library](https://github.com/sendgrid/smtpapi-php), full documentation can be found on GitHub. Our [PHP API library](https://github.com/sendgrid/sendgrid-php) allows you to fully integrate with SendGrid.\n\n\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-python-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Python Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\nSendGrid recommends using our [Python SMTPAPI library](https://github.com/sendgrid/smtpapi-python), full documentation can be found on GitHub. Our [Python SMTPAPI library](https://github.com/sendgrid/smtpapi-python) allows you to fully integrate with SendGrid.\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/smtp-ruby-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SMTP Ruby Code Example\ngroup: x-smtpapi\nnavigation:\n  show: true\n---\n\nThese examples require the [JSON Ruby Library](http://www.ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html).\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n## SmtpApiHeader.rb\n\nThis header is required for each example.\n\n```ruby\n#!/usr/bin/ruby\n# Version 1.0\n# Last Updated 6/22/2009\nrequire 'json'\n\nclass SmtpApiHeader\n\n  def initialize()\n    @data = {}\n  end\n\n  def addTo(to)\n    @data['to'] ||= []\n    @data['to'] += to.kind_of?(Array) ? to : [to]\n  end\n\n  def addSubVal(var, val)\n    if not @data['sub']\n      @data['sub'] = {}\n    end\n    if val.instance_of?(Array)\n      @data['sub'][var] = val\n    else\n      @data['sub'][var] = [val]\n    end\n  end\n\n  def setUniqueArgs(val)\n    if val.instance_of?(Hash)\n      @data['unique_args'] = val\n    end\n  end\n\n  def setCategory(cat)\n\n    @data['category'] = cat\n  end\n\n  def addFilterSetting(fltr, setting, val)\n    if not @data['filters']\n      @data['filters'] = {}\n    end\n    if not @data['filters'][fltr]\n      @data['filters'][fltr] = {}\n    end\n    if not @data['filters'][fltr]['settings']\n      @data['filters'][fltr]['settings'] = {}\n    end\n    @data['filters'][fltr]['settings'][setting] = val\n  end\n\n  def asJSON()\n    json = JSON.generate @data\n    return json.gsub(/([\"\\]}])([,:])([\"\\[{])/, '\\\\1\\\\2 \\\\3')\n  end\n\n  def as_string()\n    json  = asJSON()\n    str = 'X-SMTPAPI: %s' % json.gsub(/(.{1,72})( +|$\\n?)|(.{1,72})/,\"\\\\1\\\\3\\n\")\n    return str\n  end\n\nend\n```\n\n## Example Ruby Usage\n\n```ruby\nrequire './SmtpApiHeader.rb'\nrequire 'mail'\n\nMail.defaults do\n  delivery_method :smtp, { :address   => 'smtp.sendgrid.net',\n                           :port      => 587,\n                           :domain    => 'sendgrid.com',\n                           :user_name => 'apikey',\n                           :api_key  => 'yourSendGridAPIKey',\n                           :authentication => 'plain',\n                           :enable_starttls_auto => true }\nend\n\nhdr = SmtpApiHeader.new\n\nreceiver = ['recipienteexampexample@example.com', 'recipient2@domain.com']\n\nhdr.addTo(receiver)\nhdr.setUniqueArgs({'test' => 1, 'foo' =>2})\nhdr.setCategory('yourCategory')\n\nmail = Mail.deliver do\n  header['X-SMTPAPI'] =  hdr.asJSON()\n  to 'willnotdeliver@domain.com' # When using SMTPAPI's 'to' parameter, this address will not get delivered to\n  from 'yourEmailAddress@domain.com'\n  subject 'Ruby Example using X-SMTPAPI header'\n  text_part do\n    body 'You would put your content here, but I am going to say: Hello world!'\n  end\n  html_part do\n    content_type 'text/html; charset=UTF-8'\n    body '<b>Hello world!</b><br>Glad to have you here!'\n  end\nend\n\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/ssmtp.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: ssmtp\ngroup: mail-servers\nnavigation:\n  show: true\n---\n\nAdding SendGrid as a SMTP relay for ssmtp is easy. Edit **/etc/ssmtp/ssmtp.conf** and add the following:\n```\nmailhub=smtp.sendgrid.net:587\nAuthUser=apikey\nAuthPass=sendgridapikey\nUseSTARTTLS=YES\n```\n\nYour changes will come into effect as soon as the next message is sent via `ssmtp`\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/stopping-a-scheduled-send.md",
    "content": "---\nseo:\n  title: Canceling a scheduled send\n  description: Can I stop a scheduled email or campaign?\n  keywords: pause, halt, delete, queue, stop, cancel, reschedule, unschedule\ntitle: Canceling a scheduled send\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you have scheduled an email or a campaign to be sent, but decided to cancel or reschedule the email then you have several options.\n\n<call-out type=\"warning\">\n\nIf you are looking for information on how to stop a send that is currently in progress, [click here]({{root_url}}/for-developers/sending-email/stopping-an-in-progress-send/)!\n\n</call-out>\n\n## Canceling Transactional Email\n\n### Cancel Scheduled Sends\n\nThere is a [group of endpoints](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends) in the SendGrid API v3 that makes it possible to batch transactional email together and to schedule a time for that batch to be delivered. You can also pause or cancel the delivery of one of these batches.\n\n<call-out>\n\nYou can have no more than 100 different batches (100 different groups of emails with each group identified by a unique `batch_id`) in a 'paused' or 'pending cancellation' state at one time.\n\n</call-out>\n\nTo create a batch ID, assign that ID to an email or group of emails, and cancel the send, refer to the following steps:\n\n### 1. Generate a Batch ID\n\nFirst, generate a batch id by calling the [v3/mail/batch endpoint](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends/create-a-batch-id). When successful, you should receive a 201 response along with your batch ID.\n\n`POST https://api.sendgrid.com/v3/mail/batch`\n\n```json\nHTTP/1.1 201\n  {\n    \"batch_id\": \"YOUR_BATCH_ID\"\n  }\n```\n\n### 2. Assign Batch ID to an Email\n\nThe batch ID generated in step 1 can now be used when scheduling an email via the SendGrid API v3 by setting the value of `batch_id` to your new batch ID in a [v3/mail/send](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) request and setting the value of `send_at` to a UNIX timestamp representing the time you want your email sent. For example:\n\n`POST https://api.sendgrid.com/v3/mail/send`\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john@example.com\"\n        }\n      ],\n      \"subject\": \"Hello, World!\"\n    }\n  ],\n  \"from\": {\n    \"email\": \"from_address@example.com\"\n  },\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello, World!\"\n    }\n  ],\n  \"send_at\": 1484913600,\n  \"batch_id\": \"YOUR_BATCH_ID\"\n}\n```\n\n```json\n{\n  HTTP/1.1 202\n}\n```\n\n<call-out>\n\nIf you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail.\n\n</call-out>\n\n### 3. Cancel or Pause Your Send\n\nNow that your email has been scheduled and has a batch ID assigned, you can [pause or cancel the send](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends/cancel-or-pause-a-scheduled-send) at any time up to 10 minutes before the scheduled send time.\n\n<call-out type=\"warning\">\n\nScheduled sends canceled less than 10 minutes before the scheduled time are not guaranteed to be canceled.\n\n</call-out>\n\nTo only pause your scheduled send, set the `status` parameter in your request to \"pause\". To completely cancel your request, set `status` to \"cancel\".\n\nWhen a Batch is **canceled**, all messages associated with that batch will stay in your sending queue, but when their `send_at` value is reached, they will be discarded instead of attempting delivery.\n\nWhen a Batch is **paused**, all messages associated with that batch will stay in your sending queue, even past their `send_at` value. Any messages that are more than 72 hours old will be discarded as Expired.\n\n`POST https://api.sendgrid.com/v3/user/scheduled_sends`\n\n```json\n{\n  \"batch_id\": \"YOUR_BATCH_ID\",\n  \"status\": \"pause\"\n}\n```\n\n```json\nHTTP/1.1 201\n```\n\nFor more details, please see our [Cancel Scheduled Sends API Reference](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends).\n\n## Canceling a Marketing Campaign\n\n### Using the User Interface\n\n <call-out>\n\nThese directions refer to unscheduling a Single Send in the new Marketing Campaigns product.\n\n</call-out>\n\nIf you scheduled a specific time to send your campaign, it's easy to unschedule this campaign to make changes or reschedule it. Simply navigate to your Campaigns page by clicking **Marketing Campaigns** in the left hand navigation menu and selecting **Single Sends**. Next to the Single Send you want to unschedule, click the action menu and select **Unschedule**.\n\n### Using the API\n\n  <call-out>\n\nThese directions refer to unscheduling a Campaign in the legacy Marketing Campaigns product.\n\n</call-out>\n\nYou can unschedule a campaign by making a call to [/v3/campaigns/{campaign_id}/schedules](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends/cancel-or-pause-a-scheduled-send) where `{campaign_id}` is the ID of the campaign you want to unschedule. A successful unschedule will return a 204. **You cannot unschedule campaigns that are already in the process of being sent. You should instead cancel or delete the campaign.**\n\n`DELETE https://api.sendgrid.com/v3/campaigns/{campaign_id}/schedules`\n\n`HTTP/1.1 204`\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/stopping-an-in-progress-send.md",
    "content": "---\nseo:\n  title: Stopping an in-progress send\n  description: Can I stop a send in progress?\n  keywords: pause, halt, delete, queue, stop, interrupt\ntitle: Stopping an in-progress send\ngroup: api-v3\nweight: 0\nlayout: page\nzendesk_id: 204117516\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nIf you are looking for information on how to cancel a scheduled email or campaign, [click here]({{root_url}}/for-developers/sending-email/stopping-a-scheduled-send/)!\n\n</call-out>\n\n## Stopping Transactional Email\n\nStopping an ongoing send that is using SMTP or the Web API can be tricky, because we strive to accept and send email requests as quickly as possible. Sometimes stopping an accidental send is just not possible. However, following are several suggestions for how to halt a send in progress or a send that you have scheduled.\n\n### 1. Change Your API Key or Password\n\nThe simple act of changing your [API key](https://app.sendgrid.com/settings/api_keys) or [password](https://app.sendgrid.com/settings/account) can break your existing email integration by causing a mismatch between what your app is trying to authenticate with and what we have on record.\n\nThis method is great if you have a runaway script or have just started a send accidentally. Be sure to verify that the credentials your app is using belong either to the parent account or a [teammate](https://app.sendgrid.com/settings/teammates) so you can change the proper one.\n\nUsing an API key has the added benefit of breaking only the services for which it has permissions. In addition to enhanced security, the ease of change afforded by an API key is one reason we recommend using API keys to authenticate with our services.\n\n<call-out type=\"warning\">\n\nWe cannot guarantee that changing your API key or password will prevent 100% of your email requests from being delivered. We only recommend this method as a last resort that may allow you to stop at least some of your emails from being sent.\n\n</call-out>\n\n### 2. Contact Support\n\nSupport has the ability to clear any emails currently pending delivery from your account. To be more clear, there is a very small window of opportunity between when we accept an email request and when we actually attempt delivery to the recipient. Emails can build up in this queue, and upon request, we can delete them entirely.\n\n## Stopping a Marketing Campaign\n\nYou have several options for canceling or unscheduling a campaign.\n\n### Using the User Interface\n\nIf you have **Send Immediately** under the **Scheduling** dropdown menu in the campaign builder set to OFF, then you only have a very brief window of opportunity to cancel the campaign after clicking **Send Campaign**. You have 2 options:\n\n1. **Deleting the Campaign**\n\n   Navigate to your [Campaigns page](https://sendgrid.com/marketing_campaigns/ui/campaigns). Find the campaign you want to stop, click the action menu and select **Delete**.\n\n2. **Canceling the Campaign**\n\n   Navigate to your [Campaigns page](https://sendgrid.com/marketing_campaigns/ui/campaigns). Find the campaign you want to stop and click the little red X next to the campaign name to cancel the campaign. Click **Confirm** in the confirmation window that appears. You'll see the status of your campaign change to \"Canceled\".\n\n   ![]({{root_url}}/images/cancel_campaign_1.png)\n\n   ***\n\n   ![]({{root_url}}/images/cancel_campaign_2.png)\n\n   ***\n\n   ![]({{root_url}}/images/cancel_campaign_3.png)\n\n### Using the SendGrid API\n\n#### New Marketing Campaigns\n\nYou can cancel a scheduled send by making a call to [/marketing/singlesends/{id}/schedule](https://sendgrid.api-docs.io/v3.0/single-sends/delete-single-send-schedule) where `{id}` is the ID of the Single Send you want to stop. A successful deletion will return a 200.\n\n#### Legacy Marketing Campaigns\n\nYou can delete a campaign by making a call to [/v3/campaigns/{campaign_id}](https://sendgrid.api-docs.io/v3.0/campaigns-api/unschedule-a-scheduled-campaign) where `{campaign_id}` is the ID of the campaign you want to stop. A successful deletion will return a 204.\n\n`DELETE https://api.sendgrid.com/v3/campaigns/{campaign_id}`\n\n`HTTP/1.1 204`\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/substitution-tags.md",
    "content": "---\nseo:\n  title: Substitution Tags\n  description: Section tags allow you to substitute in content for individual recipients in an SMTP message.\n  keywords: SMTP, send email, Substitution tags\ntitle: Substitution Tags\ngroup: x-smtpapi\nweight: 10\nlayout: page\nnavigation:\n  show: true\n---\n\nSubstitution tags allow you to generate dynamic content for each recipient on your list. When you send to a list of recipients over SMTP API, you can specify substitution tags specific to each recipient. For example, a first name that will then be inserted into an opening greeting like the following, where each recipient sees -firstName- replaced with their first name.\n\n```html\n\"Dear -firstName-\"\n```\n\nThese tags can also be used in more complex scenarios. For example, you could use a -customerID- to build a custom URL that is specific to that user.\n\n### A customer specific ID can replace -customerID- in the URL within your email\n\n```html\n<a href=\"http://example.com/customerOffer?id=-customerID-\">Claim your offer!</a>\n```\n\n<call-out>\n\nSubstitution tags will work in the Subject line, body of the email and in [Unique Arguments]({{root_url}}/for-developers/sending-email/unique-arguments/).\n\n</call-out>\n\n<call-out type=\"warning\">\n\nUnique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n<call-out>\n\nSubstitutions are limited to 10000 bytes per personalization block.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nWhen passing substitutions please make sure to only use strings as shown in our examples. Any other type could result in unintended behavior.\n\n</call-out>\n\nHow you format your substitution tags may depend on the library you use to create your SMTP connection, the language you are writing your code in, or any intermediate mail servers that your servers will send mail through. In some cases -subVal- may be the best choice while in other %subVal% or #subVal# may make more sense. It is best to avoid characters that have special meaning in HTML, such as <,>, and &. These might end up encoded and will not be properly substituted.\n\n<call-out>\n\nYou can have up to 4 nested substitutions.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDo not use spaces inside your substitution tags, for example: `%first name%`\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDo not nest substitution tags in substitutions as they will fail and your substitution will not take place.\n\n</call-out>\n\n## Substitution Tag Example\n\nEmail HTML content:\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello -name-,<br />\n      Thank you for your interest in our products. I have set up an appointment\n      to call you at -time- EST to discuss your needs in more detail. If you\n      would like to reschedule this call, please visit the following link: `<a\n        href=\"http://example.com/reschedule?id=-customerID-\"\n        >reschedule</a\n      >` Regards, -salesContact- -contactPhoneNumber-<br />\n    </p>\n  </body>\n</html>\n```\n\n<p>An accompanying SMTP API JSON header might look something like this:</p>\n\n```json\n{\n  \"to\": [\"example@example.com\", \"example@example.com\"],\n  \"sub\": {\n    \"-name-\": [\"John\", \"Jane\"],\n    \"-customerID-\": [\"1234\", \"5678\"],\n    \"-salesContact-\": [\"Jared\", \"Ben\"],\n    \"-contactPhoneNumber-\": [\"555.555.5555\", \"777.777.7777\"],\n    \"-time-\": [\"3:00pm\", \"5:15pm\"]\n  }\n}\n```\n\nThe resulting email for John would look like this:\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello John,<br />\n      Thank you for your interest in our products. I have set up an appointment\n      to call you at 3:00 pm EST to discuss your needs in more detail. If you\n      would like to reschedule this call, please visit the following link:\n      <a href=\"http://example.com/reschedule?id=1234\">reschedule</a>\n      Regards, Jared 555.555.5555\n    </p>\n  </body>\n</html>\n```\n\nIn contrast, the resulting email for Jane will look like the following, with her specific values replaced in for each tag:\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello Jane,<br />\n      Thank you for your interest in our products. I have set up an appointment\n      to call you at 5:15pm EST to discuss your needs in more detail. If you\n      would like to reschedule this call please visit the following link:\n      <a href=\"http://example.com/reschedule?id=5678\">reschedule</a>\n      Regards, Ben 777.777.7777\n    </p>\n  </body>\n</html>\n```\n\n## SendGrid Defined Substitution Tags\n\nWhile the tags above are tags that you define at the time of your send in the SMTP API headers, SendGrid also offers [Unsubscribe Groups tags]({{root_url}}/ui/sending-email/create-and-edit-transactional-templates/) that have been pre-defined for you. You can use these tags within the content of your email, and you do not have to and should not, define them.\n\n## Additional Resources\n\n- [Section Tags]({{root_url}}/for-developers/sending-email/section-tags/)\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-smtp-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/sugarcrm.md",
    "content": "---\nseo:\n  title: SugarCRM Integration\n  description: SugarCRM Integration\n  keywords: CRM, sugarCRM, integration, smtp\ntitle: SugarCRM Integration\ngroup: plugins\nweight: 0\nlayout: page\nzendesk_id: 200182078\nnavigation:\n  show: false\n---\n\n## What is SugarCRM?\n\nOne of the primary competitors to the Salesforce CRM, [SugarCRM](http://www.sugarcrm.com/) is a widely used customer relationship management software and as they explain on their website, \"[SugarCRM is] designed to help your business communicate with prospects, share sales information, close deals and keep customers happy. Thousands of successful companies use Sugar everyday to manage sales, marketing and support.\" Since SendGrid has become synonymous with optimized deliverability of transactional email to the inbox, some of our customers have asked us how they can send mail from their CRM software through our service so those emails can also be optimized for deliverability to the inbox. If you're a SendGrid as well as SugarCRM customer, let's get into how you'll go about doing this!\n\n## How do I integrate SugarCRM with SendGrid\n\nSendGrid customers utilizing our service for their transactional email and wanting to use SugarCRM for their email marketing campaigns can easily make a few settings changes within their SugarCRM account in order to point their outgoing mail to us, so we can deliver it to the end recipient. In order to send mail from SugarCRM to SendGrid, navigate the following on the SugarCRM site: **Admin** > **Email Settings** and choose **SMTP** as the mail transfer agent. Then enter the required server info as follows:\n\n- **SMTP Hostname** : smtp.sendgrid.net\n- **SMTP Username** : 'apikey'\n- **SMTP Password** : [your SendGrid API key]\n- **SMTP Port** : [the port of your choosing, the options for which can be found [here]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/#smtp-ports)]\n\nNote that the SMTP username is the string, \"apikey\" and not your account username. Using \"apikey\" as the username is required when using an API key as the password via Basic Authentication.\n\nOnce these changes have been made within the Email Settings page within your SugarCRM account, all outgoing mail from the application will be routed to SendGrid so we can send it to the end recipient.\n\nSugarCRM outlines this process in more detail in their own support documentation [here](<http://support.sugarcrm.com/04_Find_Answers/02KB/02Administration/100Email/Configuring_Your_Outbound_Email_Server_(SMTP)_to_Work_With_Sugar>).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/suppressions.md",
    "content": "---\nseo:\n  title: Suppression Groups\n  description: Suppression groups allow you to set up unsubscribe lists and options\n  keywords: SMTP, suppression groups, unsubscribe lists\ntitle: Suppression Groups\ngroup: x-smtpapi\nweight: 10\nlayout: page\nnavigation:\n  show: true\n---\n\n## Defining an Unsubscribe Group When Sending\n\nThe method used to specify an unsubscribe group for an email depends on how you will be sending that email:\n\n- When sending an SMTP message, add the group's ID to the X-SMTPAPI header.\n- When sending an email via the [Web API v2](https://www.twilio.com/docs/sendgrid/api/v2/mail), add the group's ID in the `x-smtpapi` parameter.\n- When sending an email via the [Web API v3](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send), define the group's ID in the `asm.group_id` parameter.\n\n<call-out type=\"warning\">\n\nYou may only specify one group per send, and you should wait one minute after creating the group before sending with it.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nWhen passing `asm_group_id` please make sure to only use integers as shown in our examples. Any other type could result in unintended behavior.\n\n</call-out>\n\n```json\n{\n  \"asm_group_id\": 1\n}\n```\n\n## Defining Unsubscribe Groups to display on the Manage Preferences page\n\nTo specify which groups to display on the Manage Preferences page of an email, add the group IDs to the X-SMTPAPI header of an SMTP message, or in the x-smtpapi parameter of a [mail.send API call](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\nIf you omit the `asm_groups_to_display` header, your default groups is shown on the Manage Preferences page instead.\n\n<call-out type=\"warning\">\n\nYou can specify up to 25 groups to display.\n\n</call-out>\n\n```json\n{\n  \"asm_groups_to_display\": [1, 2, 3]\n}\n```\n\n## Groups\n\nYou can find your group IDs by looking at the Group ID column in the Unsubscribe Groups UI, or by calling the [GET method](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups/retrieve-all-suppression-groups-associated-with-the-user) of the groups resource.\n\nRelated Articles:\n\n- You can create Unsubscribe groups via the [API V3 > Unsubscribe Groups Endpoint](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups/create-a-new-suppression-group).\n\n## Additional Resources\n\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-smtp-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/symfony.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Symfony\nseo:\n  title: Send Email with Symfony & SendGrid\n  description: View instructions on how to easily send email with Symfony using SendGrid, by setting up setting up or extending SwiftMailer.\nnavigation:\n  show: true\n---\n\nSymfony uses SwiftMailer to send email, read more about [sending emails from Symfony](https://symfony.com/doc/current/email.html).\n\nTo get started you need to modify parameters.yml and add the following: \n\n```\nmailer:\nclass: sfMailer\nparam:\nlogging: %SF_LOGGING_ENABLED%\ncharset: %SF_CHARSET%\ndelivery_strategy: realtime\ntransport:\nclass: Swift_SmtpTransport\nparam:\nhost: smtp.sendgrid.net\nport: 587\nencryption: ~\nusername: sendgridusername\napi_key: sendgrid_api_key\n```\n\nAfter that you should be able to send emails. The following shows an example:\n\n``` php\n<?php\n$message = Swift_Message::newInstance()\n  ->setFrom('from@example.com')\n  ->setTo('to@example.com')\n  ->setSubject('Subject')\n  ->setBody('Body');\n  \n$this->getMailer()->send($message);\n?>\n```\n \n### Another Option \n\nIf you want more flexibility, you can use partials to define the content of the emails. Add the a class such as **lib/myEmail.class.php**. \n\n``` php\n<?php\nclass myEmail\n{\n    /**\n     * Library to facilitate email messages being sent out, sendMail deprecated in symfony 1.2\n     *\n     * @param string $partial - Array with html and text partials ie array('text'=>'textPartial', 'html'=>'htmlPartial')\n     * @param array $parameters - Array we will pass into the partials\n     * @param string $mailFrom - Email source\n     * @param string $mailTo - Email destination\n     * @param string $subject - The subject of the email message\n     * @param array $sgHeaders - What we will be placing in the SMTPAPI header. Must be null or a non-empty array\n     * @param array $attachments - Email contains the attachments\n     */\n    \n    public static function sendEmail($partials, $parameters, $mailFrom, $mailTo, $subject, $sgHeaders = null, $attachments = null)\n    {\n        // verify we have username/api_key to send out emails - IMPORTANT\n        if (!sfconfig::has('app_sendgrid_username') or !sfconfig::has('app_sendgrid_api_key')) {\n            throw new sfException('SMTP username/api_key is required to send email out');\n        }\n        $text = null;\n        $html = null;\n        if (is_array($partials)) {\n            // load libraries\n            sfContext::getInstance()->getConfiguration()->loadHelpers('Partial');\n            if (isset($partials['text'])) {\n                $text = get_partial($partials['text'], $parameters);\n            }\n            if (isset($partials['html'])) {\n                $html = get_partial($partials['html'], $parameters);\n            }\n        }\n        if ($text === null &amp;&amp; $html === null) {\n            throw new sfException('A text and/or HTML partial must be given');\n        }\n        \n        try {\n            /*\n             * Load connection for mailer\n             */\n            $connection = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 465, 'ssl')->setUsername(sfconfig::get('app_sendgrid_username'))->setPassword(sfconfig::get('app_sendgrid_api_key'));\n            \n            // setup connection/content\n            $mailer  = Swift_Mailer::newInstance($connection);\n            $message = Swift_Message::newInstance()->setSubject($subject)->setTo($mailTo);\n            \n            if ($text &amp;&amp; $html) {\n                $message->setBody($html, 'text/html');\n                $message->addPart($text, 'text/plain');\n            } else if ($text) {\n                $message->setBody($text, 'text/plain');\n            } else {\n                $message->setBody($html, 'text/html');\n            }\n            \n            // if contains SMTPAPI header add it\n            if (null !== $sgHeaders) {\n                $message->getHeaders()->addTextHeader('X-SMTPAPI', json_encode($sgHeaders));\n            }\n            \n            // update the from address line to include an actual name\n            if (is_array($mailFrom) and count($mailFrom) == 2) {\n                $mailFrom = array(\n                    $mailFrom['email'] => $mailFrom['name']\n                );\n            }\n            \n            // add attachments to email\n            if ($attachments !== null and is_array($attachments)) {\n                foreach ($attachments as $attachment) {\n                    $attach = Swift_Attachment::fromPath($attachment['file'], $attachment['mime'])->setFilename($attachment['filename']);\n                    $message->attach($attach);\n                }\n            }\n            \n            // Send\n            $message->setFrom($mailFrom);\n            $mailer->send($message);\n        }\n        catch (Exception $e) {\n            throw new sfException('Error sending email out - ' . $e->getMessage());\n        }\n    }\n}\n?>\n```\n\n Then configure your credentials on **apps/frontend/app.yml** \n\n```\nprod:\nsendgrid:\nusername: sendgridusername\npassword: sendgrid_api_key\n```\nNow can put your partials in a module such as **apps/frontend/modules/mail**. For example, to send a registration email in both text and HTML, we would have the following structure:\n\n```\napps/\nfrontend/\nmodules/\nmail/\n_registrationHTML.php\n_registrationTEXT.php\n```\n Add this to **apps/frontend/modules/mail/_registrationTEXT.php** \n\n``` php\nDear <!--?php echo $name ?-->,\nThank you for registering. Please go to http://domain.com to finish your registration.\n```\n\n Add this to **apps/frontend/modules/mail/_registrationHTML.php** \n\n``` php\nDear <!--?php echo $name ?-->,\nThank you for registering. Please go to <a href=\"http://domain.com\">here</a> to finish your registration.\n```\n\n And send the message as follow: \n\n``` php\n<?php\nmyEmail::sendEmail(array('text'=>'mail/registrationTEXT', 'html'=>'mail/registrationHTML'), array('name'=>'Recipient Name'), 'youremail@domain.com', 'recipient@example.com', 'Registration Information');\n?>\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/thunderbird.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Thunderbird\ngroup: mail-clients\nnavigation:\n  show: true\n---\n\nTo send email using Thunderbird you will have to modify your outgoing server settings in Thunderbird accordingly. Additionally you can modify settings in Thunderbird that will allow you to include an [SMTP API]({{root_url}}/for-developers/sending-email/building-an-smtp-email/) header in your emails if you wish to leverage [categories]({{root_url}}/ui/analytics-and-reporting/categories/) or other features of the SMTP API when sending mail via the Thunderbird client.\n\n## Getting started\n\n1. Navigate to **Tools** and select **Account Settings**.\n\n![]({{root_url}}/images/thunderbird_1.png \"thunderbird_add\")\n\n2. Enter the following settings:\n\n   * **Description -** SendGrid Connection\n   * **Server Name -** smtp.sendgrid.net\n   * **Port -** 465\n   * **Connection security -** SSL/TLS\n   * **Authentication method -** Normal password\n   * **User Name -** apikey\n   * **Password -** Your SendGrid API key. (You can read more about authenticating with an API key at [this link](https://sendgrid.com/docs/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/#upgrade-to-api-keys-for-your-smtp-integration))\n\n![]({{root_url}}/images/thunderbird_2.png \"thunderbird_settings\")\n\n\n## Incorporating SMTP API headers\n\n*To incorporate SMTP API headers:*\n\n1. Select **Tools** > **Options** (Win) or **Thunderbird** > **Preferences** (Mac) from the menu in Thunderbird.\n1. Click  **Advanced**.\n1. Select **General** and click **Config Editor**.\n\n![]({{root_url}}/images/thunderbird_3.png \"thunderbird_advanced\")\n\n4. Enter \"mail.compose.other.header\" under \"Filter:\"\n5. Double-click **mail.compose.other.header**.\n6. Enter \"X-SMTPAPI\"\n7. Click **OK**.\n8. Close the configuration editor and preferences dialog.\n\n![]({{root_url}}/images/thunderbird_4.png \"thunderbird_header\")\n\n9. Restart Thunderbird\n\nCreate a mail message and just like you would add a CC or BCC to your email, click the drop down option that will now allow you to add a header of the type \"X-SMTPAPI\" in addition to \"To\".\n\n\n![]({{root_url}}/images/thunderbird_5.png \"thunderbird_compose\")\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/unique-arguments.md",
    "content": "---\nseo:\n  title: Unique Arguments\n  description: Add unique arguments to customize your SMTP emails event tracking\n  keywords: SMTP, unique arguments, email events, email activity\ntitle: Unique Arguments\ngroup: x-smtpapi\nweight: 10\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nThe SMTP API JSON string allows you to attach an unlimited number of unique arguments to your email **up to 10,000 bytes**. The arguments are used only for tracking. They can be retrieved through the [Event API]({{root_url}}/for-developers/tracking-events/event/) or the [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) page.\n\n<call-out type=\"warning\">\n\nWhen passing `unique_args` please make sure to only use strings as shown in our examples. Any other type could result in unintended behavior.\n\n</call-out>\n\nThese arguments can be added using a JSON string like this:\n\n```json\n{\n  \"unique_args\": {\n    \"customerAccountNumber\": \"55555\",\n    \"activationAttempt\": \"1\",\n    \"New Argument 1\": \"New Value 1\",\n    \"New Argument 2\": \"New Value 2\",\n    \"New Argument 3\": \"New Value 3\",\n    \"New Argument 4\": \"New Value 4\"\n  }\n}\n```\n\nThese arguments can then be seen in posts from the [SendGrid Event Webhook]({{root_url}}/for-developers/tracking-events/event/). The contents of one of these POST requests would look something like this:\n\n### Example Webhook Post Data\n\n```json\n{\n  \"sg_message_id\": \"145cea24eb8.1c420.57425.filter-132.3382.5368192A3.0\",\n  \"New Argument 1\": \"New Value 1\",\n  \"event\": \"processed\",\n  \"New Argument 4\": \"New Value 4\",\n  \"email\": \"useexampexample@example.com\",\n  \"email\": \"example@example.com\",\n  \"smtp-id\": \"<145cea24eb8.1c420.57425@localhost.localdomain>\",\n  \"timestamp\": 1399331116,\n  \"New Argument 2\": \"New Value 2\",\n  \"New Argument 3\": \"New Value 3\",\n  \"customerAccountNumber\": \"55555\",\n  \"activationAttempt\": \"1\"\n}\n```\n\n<call-out type=\"warning\">\n\nBounces returned with the Return-Path cause `unique_rgs not to be attached to an event. This can cause issues when developing unique_args POST handling.\n\n</call-out>\n\nTo apply different unique arguments to individual emails, you may use [substitution tags]({{root_url}}/for-developers/sending-email/substitution-tags/). An example of this would look like:\n\n```json\n{\n  \"sub\": {\n    \"-account_number-\": [\"314159\", \"271828\"]\n  },\n  \"unique_args\": {\n    \"customerAccountNumber\": \"-account_number-\"\n  }\n}\n```\n\n## Additional Resources\n\n- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)\n- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)\n- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-smtp-email/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys.md",
    "content": "---\nseo:\n  title: Upgrade your authentication method to API keys\n  description: How to upgrade your authentication methods in your code to use API keys\n  keywords: Authentication, authorization, API key\ntitle: Upgrade your authentication method to API keys\ngroup: sending-email\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nTwo-Factor Authentication is required as of Q4 2020, and all Twilio SendGrid API endpoints will reject new API requests and SMTP configurations made with a username and password via Basic Authentication.\n\n</call-out>\n\n## Am I Using Basic Authentication with Username and Password?\n\n- If SMTP: Check the username you're using to authenticate. If it's the word \"apikey\" then you're using an API Key. If it's not, then you're using username and password authentication.\n- If V3: If you're using the most recent version of our open sourced libraries and followed the documentation, you should already be using API keys. If you aren't using our libraries, check the Authorization header on your API calls. If you see the word \"Bearer\" - you're good. If you see the word \"Basic\" you're using username and password.\n- If V2 non-mail send: You're using username and passwords.\n- If Premier 50M and below package: Use the [Email Activity API](https://sendgrid.api-docs.io/v3.0/email-activity/) to identify mail/send API Key usage. If the `api_key_id` parameter is empty, you will need to upgrade your authentication.\n\n## Why should I use API Keys for authentication?\n\nUsing your account username and password for authentication is less secure than using an API Key. API Keys are preferred because you can limit permissions for API Keys and revoke them at any time. We recommend applying the principle of least privilege, using limited API Key permission to only provide access to what is needed for that request for maximum security.\n\nFor more about protecting your account, see our blog post, [7 Best Practices to Protect your Twilio SendGrid Account and Sending Reputation](https://sendgrid.com/blog/7-best-practices-to-protect-your-twilo-sendgrid-account-and-sending-reputation/). To learn more about the principle of least privilege, see our [Twilio blog post](https://www.twilio.com/blog/principle-of-least-privilege-details-best-practices) and [OWASP's article on Access Control](https://owasp.org/www-community/Access_Control).\n\n## Tips for upgrading to API Keys\n\n- Prioritize upgrading your authentication method to API Keys for your mail/send endpoints first\n- Store your API Keys in an [environment variable]({{root_url}}/ui/account-and-settings/api-keys/#storing-an-api-key-in-an-environment-variable)\n- Test these changes in a staging environment before rolling out to your production environment\n\n## Upgrade to API Keys for your API endpoint requests\n\nFollow these steps to identify and replace your authentication method to API Keys and then implement 2FA for enhanced security.\n\n1. Identify where you are storing your username and password credentials for basic authentication. Your credentials could be stored in environment variables or hard coded depending on how you integrated.\n1. Generate API Keys in the SendGrid UI or programmatically with the least privileged permissions required for each of the endpoints you will be updating. For more information, see [API Key Permissions]({{root_url}}/ui/account-and-settings/api-keys/#api-key-permissions).\n1. Replace your username and password credentials with API Keys.\n\n- For v3 API: Follow [these instructions](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-authentication).\n- For v2: Follow [these instructions](https://www.twilio.com/docs/sendgrid/api/v2/mail#sending-email).\n\n## Upgrade to API Keys for your SMTP integration\n\n1. Generate API Keys in the [SendGrid UI](https://app.sendgrid.com/settings/api_keys) or [programmatically](https://sendgrid.api-docs.io/v3.0/api-keys/create-api-keys) with the least privileged permissions required for each of the endpoints you will be updating. For more information, see [API Key Permissions]({{root_url}}/ui/account-and-settings/api-keys/#api-key-permissions). To send email only, your API key will require **Mail Send** > **Full Access** permissions.\n2. To use your API key with the SMTP integration, you must set your username to the string, `apikey`. Your password will be the API key you generated in the previous step.\n\n```\nuser_name: \"apikey\"\npassword: <Your API Key>\n```\n\n<call-out>\n\nWhen submitting base64 encoded API key values, be sure you have not included any newline or whitespace characters by accident. This can happen when copying the encoded key from an environment that line wraps output. SMTP is a line-oriented protocol, and linefeed characters will prevent you from authenticating successfully.\n\n</call-out>\n\nOnce the previous steps are completed, enable Two-Factor Authentication for all of your users, including [subusers]({{root_url}}/ui/account-and-settings/subusers/) and [teammates]({{root_url}}/ui/account-and-settings/teammates/).\n\nIf you are new to our SMTP integration, you will find more integration instructions at [Integrating with the SMTP API]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/).\n\n## Check for API rejections\n\nAfter enabling 2FA monitor your API calls for rejections related to continued use of username and password authentication.\n\n### Error message for API calls:\n\n`invalid authentication method` - declined because you are using basic authentication with 2FA enabled. to fix, update to using an API key or disable 2FA and switch to using IP Access Management for security. for more information, see https://sendgrid.com/docs/for-developers/sending-email/authentication/#basic-authentication\n\n### Error message for SMTP:\n\nSMTP error message is: `535 Authentication failed: Basic authentication is not allowed with 2FA enabled`. To fix, see https://sendgrid.com/docs/for-developers/sending-email/authentication/#basic-authentication\n\nFor more information on how to secure your Twilio SendGrid account visit this [blog post](https://sendgrid.com/blog/7-best-practices-to-protect-your-twilo-sendgrid-account-and-sending-reputation/).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/using-handlebars.md",
    "content": "---\nlayout: page\nweight: 50\ntitle: Using Handlebars\ngroup: api-v3\nnavigation:\n  show: true\nseo:\n  title: Using Handlebars\n  override: true\n  description:\n---\n\nTwilio SendGrid [Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/) and [Marketing Campaigns designs]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/) support the [Handlebars](https://handlebarsjs.com/) templating language to render the [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/) you send via the API and the [Substitution Tags]({{root_url}}/for-developers/sending-email/substitution-tags/) stored on your Marketing Campaigns contacts.\n\nHandlebars syntax allows you to personalize the messages in your templates by inserting customers' names and other data to make an email relevant to each individual recipient. For example, if you have a customer's name stored in a JSON property called `\"name\"`, you can insert the property's value into a template by adding `{{ name }}` wherever you want the customer's name to appear.\n\nHandlebars syntax allows all of this dynamic templating to occur outside of your code base, meaning changes are done quickly in the template with no update to a code base required.\n\n<call-out>\n\nIf you prefer to use your own templating system, you can still insert dynamic data using [Substitution Tags](/ui/sending-email/substitution-and-section-tags/).\n\n</call-out>\n\n## Personalizing email with Handlebars\n\n<call-out>\n\nYou can manage your templates programmatically with our [Mail Send with Dynamic Transactional Templates API](https://sendgrid.api-docs.io/v3.0/transactional-templates).\n\n</call-out>\n\nThe Handlebars language provides many features in addition to basic variable replacement, including iterations (loops) and conditional statements. Our templates and designs support most but not all of this Handlebars functionality. Currently, dynamic templates support the following helpers:\n\n- [Substitution](#substitution)\n- [Conditional statements](#conditional-statements)\n- [Iterations](#iterations)\n\nFor a full helper reference, see the [Handlebars reference](#handlebars-reference) on this page.\n\n## Use cases\n\nThe following use case examples come from the [dynamic-template section of our email templates GitHub repo](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates). Each example links to files you can explore on GitHub. You can also work with these templates by uploading them using the [Code Editor]({{root_url}}/ui/sending-email/editor/#the-code-editor) available in [Dynamic Transactional Templates](https://mc.sendgrid.com/dynamic-templates) and the [Marketing Campaigns Design Library](https://mc.sendgrid.com/design-library/your-designs).\n\nThe following use cases are listed with the Handlebars helpers used to build them.\n\n### Receipt\n\nThis [example receipt template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/receipt) uses the following helpers:\n\n- [Substitution](#substitution)\n- [Conditional statements](#conditional-statements)\n- [Iterations](#iterations)\n\n### Password reset\n\nThis [example transactional template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/transactional-actions) uses the following helpers:\n\n- [Substitution](#substitution)\n\n### Multiple languages\n\nThis is an [example template that lets you have content in multiple languages](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/different-languages), and it uses the following helpers:\n\n- [Conditional statements](#conditional-statements) - `if/else`\n\n### Newsletter\n\nThis [example newsletter template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/newsletter) uses the following helpers:\n\n- [Substitution](#substitution)\n- [Iterations](#iterations)\n\n### Advertisement\n\nThis is an [example template that is advertising items on sale](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/special-sale), and it uses the following helpers:\n\n- [Substitution](#substitution)\n- [Conditional statements](#conditional-statements) - `if/else`\n- [Iterations](#iterations)\n\n## Handlebars reference\n\nThe following reference provides sample code blocks for each helper, including HTML email snippets and JSON test data. The code examples are shown in three tabs. The first tab, Handlebars, shows the Handlebars tag. The second tab, JSON, shows example data that would be used to populate the Handlebars tag. The third tab, HTML, shows the final output that the Handlebars tag will be rendered to in your email. You can click each tab to switch between the code samples.\n\n### Substitution\n\nTwilio SendGrid templates support the following substitutions:\n\n- [Basic replacement](#basic-replacement)\n- [Deep object replacement](#deep-object-replacement)\n- [Object failure](#object-failure)\n- [Replacement with HTML](#replacement-with-html)\n- [formatDate](#formatdate)\n- [Insert](#insert)\n\n#### Basic replacement\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>Hello {{ firstName }}</p>\n```\n\n```json\n// Test data\n{ \"firstName\": \"Ben\" }\n```\n\n```html\n<!-- Resulting HTML !-->\n<p>Hello Ben</p>\n```\n\n</code-group>\n\n#### Deep object replacement\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>Hello {{user.profile.firstName}}</p>\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"profile\": {\n      \"firstName\": \"Ben\"\n    }\n  }\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>Hello Ben</p>\n```\n\n</code-group>\n\n#### Object failure\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>Hello {{user.profile.firstName}}</p>\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"orderHistory\": [\n      {\n        \"date\": \"2/1/2018\",\n        \"item\": \"shoes\"\n      },\n      {\n        \"date\": \"1/4/2017\",\n        \"item\": \"hat\"\n      }\n    ]\n  }\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>Hello</p>\n```\n\n</code-group>\n\n#### Replacement with HTML\n\n<call-out type=\"warning\">\n\nIf you include the characters `'`, `\"` or `&` in a subject line replacement be sure to use three brackets like below.\n\n</call-out>\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<!-- Per Handlebars' documentation: If you don't want Handlebars to escape a value, use the \"triple-stash\", {{{ -->\n<p>Hello {{{firstName}}}</p>\n```\n\n```json\n// Test data\n{ \"firstName\": \"<strong>Ben</strong>\" }\n```\n\n```html\n<!-- Resulting HTML -->\n<p>Hello <strong>Ben</strong></p>\n```\n\n</code-group>\n\n#### formatDate\n\nThe formatDate helper takes a time in either epoch or ISO8601 format and converts it to a format you specify using the tokens in the following table. If you send a date field without converting it, it will be displayed in ISO8601 format with the full timestamp (e.g., `2020-01-01T23:00:00.000Z`). The following example display results are for Tuesday, January 1st, 2020 3:00:00PM Pacific Standard Time.\n\n<table>\n    <tr>\n      <th>\n        Token\n      </th>\n      <th>\n        Displayed Result\n      </th>\n    </tr>\n    <tr>\n      <td>YYYY</td>\n      <td>2020</td>\n    </tr>\n    <tr>\n      <td>YY</td>\n      <td>20</td>\n    </tr>\n    <tr>\n      <td>MMMM</td>\n      <td>January</td>\n    </tr>\n    <tr>\n      <td>MMM</td>\n      <td>Jan</td>\n    </tr>\n    <tr>\n      <td>MM</td>\n      <td>01</td>\n    </tr>\n    <tr>\n      <td>M</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <td>DD</td>\n      <td>01</td>\n    </tr>\n    <tr>\n      <td>D</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <td>dddd</td>\n      <td>Tuesday</td>\n    </tr>\n    <tr>\n      <td>ddd</td>\n      <td>Tue</td>\n    </tr>\n    <tr>\n      <td>hh</td>\n      <td>03</td>\n    </tr>\n    <tr>\n      <td>h</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <td>HH</td>\n      <td>00</td>\n    </tr>\n    <tr>\n      <td>H</td>\n      <td>00</td>\n    </tr>\n    <tr>\n      <td>mm</td>\n      <td>00</td>\n    </tr>\n    <tr>\n      <td>m</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <td>ss</td>\n      <td>00</td>\n    </tr>\n    <tr>\n      <td>s</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <td>A</td>\n      <td>PM</td>\n    </tr>\n    <tr>\n      <td>ZZ</td>\n      <td>-0800</td>\n    </tr>\n    <tr>\n      <td>Z</td>\n      <td>-08:00</td>\n    </tr>\n</table>\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template without timezone offset -->\n<p>Join us {{formatDate timeStamp dateFormat}}</p>\n\n<!-- Template with timezone offset -->\n<p>Join us {{formatDate timeStamp dateFormat timezoneOffset}}</p>\n```\n\n```json\n// Test data\n{\n  \"timeStamp\": \"2020-01-01T23:00:00.000Z\",\n  \"dateFormat\": \"MMMM:DD:HH:mm:ss\",\n  \"timezoneOffset\": \"-0800\"\n}\n```\n\n```html\n<!-- Resulting HTML without timezone-->\n<p>Join us January 01, 2020 11:00:00PM</p>\n\n<!-- Resulting HTML with timezone-->\n<p>Join us January 01, 2020 3:00:00PM</p>\n```\n\n</code-group>\n\n#### Insert\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Insert with a default value -->\n<p>Hello {{insert name \"default=Customer\"}}! Thank you for contacting us about {{insert businessName \"your business\"}}.</p>\n```\n\n```json\n// Test data with all values\n{\n   \"name\": \"Ben\",\n   \"businessName\": \"Twilio SendGrid\"\n}\n\n// Test data with missing value\n{\n  \"name\": \"Ben\"\n}\n```\n\n```html\n<!-- Resulting HTML with all values -->\n<p>Hello Ben! Thank you for contacting us about Twilio SendGrid.</p>\n\n<!-- Resulting HTML with missing value and a default-->\n<p>Hello Ben! Thank you for contacting us about your business.</p>\n```\n\n</code-group>\n\n### Conditional statements\n\nTwilio SendGrid templates support the following conditionals:\n\n- [Basic If, Else, Else If](#basic-if-else-else-if)\n- [If with a root](#if-with-a-root)\n- [Unless](#unless)\n- [greaterThan](#greaterthan)\n- [lessThan](#lessthan)\n- [Equals](#equals)\n- [notEquals](#notequals)\n- [And](#and)\n- [Or](#or)\n- [Length](#length)\n\n#### Basic If, Else, Else If\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#if user.profile.male}}\n   <p>Dear Sir</p>\n{{else if user.profile.female}}\n   <p>Dear Madame</p>\n{{else}}\n   <p>Dear Customer</p>\n{{/if}}\n```\n\n```json\n// Test data one\n{\n   \"user\":{\n      \"profile\":{\n         \"male\":true\n      }\n   }\n}\n\n// Test data two\n{\n   \"user\":{\n      \"profile\":{\n         \"female\":true\n      }\n   }\n}\n\n// Test data three\n{\n   \"user\":{\n      \"profile\":{\n\n      }\n   }\n}\n```\n\n```html\n<!-- Resulting HTML from test data one -->\n<p>Dear Sir</p>\n\n<!-- Resulting HTML from test data two -->\n<p>Dear Madame</p>\n\n<!-- Resulting HTML from test data three -->\n<p>Dear Customer</p>\n```\n\n</code-group>\n\n#### If with a root\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#if user.suspended}}\n   <p>Warning! Your account is suspended, please call: {{@root.supportPhone}}</p>\n{{/if}}\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"suspended\": true\n  },\n  \"supportPhone\": \"1-800-555-5555\"\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>Warning! Your account is suspended, please call: 1-800-555-5555</p>\n```\n\n</code-group>\n\n#### Unless\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#unless user.active}}\n   <p>Warning! Your account is suspended, please call: {{@root.supportPhone}}</p>\n{{/unless}}\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"active\": false\n  },\n  \"supportPhone\": \"1-800-555-5555\"\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>Warning! Your account is suspended, please call: 1800-555-5555</p>\n```\n\n</code-group>\n\n#### greaterThan\n\n##### Basic greaterThan\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#greaterThan scoreOne scoreTwo}}\n    Congratulations, you have the high score today!\n{{/greaterThan}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"scoreOne\": 100,\n  \"scoreTwo\": 78\n}\n\n// Test data two\n{\n  \"scoreOne\": 55,\n  \"scoreTwo\": 78\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>\n  Hello Ben! Congratulations, you have the high score today! Thanks for playing.\n</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! Thanks for playing.</p>\n```\n\n</code-group>\n\n##### greaterThan with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#greaterThan scoreOne scoreTwo}}\n    Congratulations, you have the high score today!\n{{else}}\n    You were close, but you didn't get the high score today.\n{{/greaterThan}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"scoreOne\": 100,\n  \"scoreTwo\": 78\n}\n\n// Test data two\n{\n  \"scoreOne\": 55,\n  \"scoreTwo\": 78\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>\n  Hello Ben! Congratulations, you have the high score today! Thanks for playing.\n</p>\n\n<!-- Resulting HTML from test data two-->\n<p>\n  Hello Ben! You were close, but you didn't get the high score today. Thanks for\n  playing.\n</p>\n```\n\n</code-group>\n\n#### lessThan\n\n##### Basic lessThan\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#lessThan scoreOne scoreTwo}}\n    You were close, but you didn't get the high score today.\n{{/lessThan}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"scoreOne\": 55,\n  \"scoreTwo\": 78\n}\n\n// Test data two\n{\n  \"scoreOne\": 100,\n  \"scoreTwo\": 78\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>\n  Hello Ben! You were close, but you didn't get the high score today. Thanks for\n  playing.\n</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! Thanks for playing.</p>\n```\n\n</code-group>\n\n##### lessThan with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#lessThan scoreOne scoreTwo}}\n    You were close, but you didn't get the high score today.\n{{else}}\n    Congratulations, you have the high score today!\n{{/lessThan}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"scoreOne\": 55,\n  \"scoreTwo\": 78\n}\n\n// Test data two\n{\n  \"scoreOne\": 100,\n  \"scoreTwo\": 78\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>\n  Hello Ben! You were close, but you didn't get the high score today. Thanks for\n  playing.\n</p>\n\n<!-- Resulting HTML from test data two-->\n<p>\n  Hello Ben! Congratulations, you have the high score today! Thanks for playing.\n</p>\n```\n\n</code-group>\n\n#### Equals\n\nThe `equals` comparison can check for equality between two values of the same data type. The `equals` helper will also attempt to coerce data types to make a comparison of values independent of their data type. For example, `{{#equals 3 \"3\"}}` will evaluate to `true`.\n\n<call-out type=\"warning\">\n\nPlease be aware that the editor's Preview page will not properly render the results of a comparison between coerced values. You will see proper comparisons between coerced values only in a delivered message.\n\n</call-out>\n\nWhen checking for truthiness, be aware that empty strings, zero integers, and zero floating point numbers evaluate to `false`. Non-empty strings, non-zero integers, and non-zero floating point numbers, including negative numbers, evaluate to `true`.\n\n##### Basic equals\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#equals customerCode winningCode}}\n    You have a winning code.\n{{/equals}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"customerCode\": 289199,\n  \"winningCode\": 289199\n}\n\n// Test data two\n{\n  \"customerCode\": 167320,\n  \"winningCode\": 289199\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>Hello Ben! You have a winning code. Thanks for playing.</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! Thanks for playing.</p>\n```\n\n</code-group>\n\n##### Equals with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#equals customerCode winningCode}}\n    You have a winning code.\n{{else}}\n    You do not have a winning code.\n{{/equals}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"customerCode\": 289199,\n  \"winningCode\": 289199\n}\n\n// Test data two\n{\n  \"customerCode\": 167320,\n  \"winningCode\": 289199\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>Hello Ben! You have a winning code. Thanks for playing.</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! You do not have a winning code. Thanks for playing.</p>\n```\n\n</code-group>\n\n#### notEquals\n\nThe `notEquals` comparison can check for equality between two values of the same data type. The `notEquals` helper will also attempt to coerce data types to make a comparison of values independent of their data type. For example, {{#equals 3 \"3\"}} will return `false`.\n\nWhen checking for truthiness, be aware that empty strings, zero integers, and zero floating point numbers evaluate to `false`. Non-empty strings, non-zero integers, and non-zero floating point numbers, including negative numbers, evaluate to `true`.\n\n##### Basic notEquals\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#notEquals customerCode winningCode}}\n    You have a winning code.\n{{/notEquals}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"customerCode\": 289199,\n  \"winningCode\": 289199\n}\n\n// Test data two\n{\n  \"customerCode\": 167320,\n  \"winningCode\": 289199\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>Hello Ben! You have a winning code. Thanks for playing.</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! Thanks for playing.</p>\n```\n\n</code-group>\n\n##### notEquals with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#notEquals customerCode winningCode}}\n    You have a winning code.\n{{else}}\n    You do not have a winning code.\n{{/notEquals}}\n Thanks for playing.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"customerCode\": 289199,\n  \"winningCode\": 289199\n}\n\n// Test data two\n{\n  \"customerCode\": 167320,\n  \"winningCode\": 289199\n}\n```\n\n```html\n<!-- Resulting HTML from test data one-->\n<p>Hello Ben! You have a winning code. Thanks for playing.</p>\n\n<!-- Resulting HTML from test data two-->\n<p>Hello Ben! You do not have a winning code. Thanks for playing.</p>\n```\n\n</code-group>\n\n#### And\n\nWhen checking for truthiness, be aware that empty strings, zero integers, and zero floating point numbers evaluate to `false`. Non-empty strings, non-zero integers, and non-zero floating point numbers, including negative numbers, evaluate to `true`.\n\n##### And without else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#and favoriteFood favoriteDrink}}\n   Thank you for letting us know your dining preferences.\n{{/and}}.\n We look forward to sending you more delicious recipes.</p>\n```\n\n```json\n// Test data one\n{\n  \"favoriteFood\": \"Pasta\",\n  \"favoriteDrink\": \"\"\n}\n\n// Test data two\n{\n  \"favoriteFood\": \"Pasta\",\n  \"favoriteDrink\": \"Coffee\"\n}\n```\n\n```html\n<!-- Resulting HTML from test data one -->\n<p>Hi Ben! We look forward to sending you more delicious recipes.</p>\n\n<!-- Resulting HTML from test data two -->\n<p>\n  Hi Ben! Thank you for letting us know your dining preferences. We look forward\n  to sending you more delicious recipes.\n</p>\n```\n\n</code-group>\n\n##### And with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#and favoriteFood favoriteDrink}}\n   Thank you for letting us know your dining preferences.\n{{else}}\n   If you finish filling out your dining preferences survey, we can deliver you recipes we think you'll be most interested in.\n{{/and}}.\n We look forward to sending you more delicious recipes.</p>\n```\n\n```json\n// Test data one\n{\n  \"favoriteFood\": \"Pasta\",\n  \"favoriteDrink\": \"\"\n}\n\n// Test data two\n{\n  \"favoriteFood\": \"Pasta\",\n  \"favoriteDrink\": \"Coffee\"\n}\n```\n\n```html\n<!-- Resulting HTML from test data one -->\n<p>\n  Hi Ben! If you finish filling out your dining preferences survey, we can\n  deliver you recipes we think you'll be most interested in. We look forward to\n  sending you more delicious recipes.\n</p>\n\n<!-- Resulting HTML from test data two -->\n<p>\n  Hi Ben! Thank you for letting us know your dining preferences. We look forward\n  to sending you more delicious recipes.\n</p>\n```\n\n</code-group>\n\n#### Or\n\nWhen checking for truthiness, be aware that empty strings, zero integers, and zero floating point numbers evaluate to `false`. Non-empty strings, non-zero integers, and non-zero floating point numbers, including negative numbers, evaluate to `true`.\n\n##### Basic or\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#or isRunner isCyclist}}\n   We think you might enjoy a map of trails in your area.\n{{/or}}.\n Have a great day.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"isRunner\": true,\n  \"isCyclist\": false\n}\n\n// Test data two\n{\n  \"isRunner\": false,\n  \"isCyclist\": false\n}\n// Test data three\n{\n  \"isRunner\": false,\n  \"isCyclist\": true\n}\n```\n\n```html\n<!-- Resulting HTML from test data one -->\n<p>\n  Hi Ben! We think you might enjoy a map of trails in your area. You can find\n  the map attached to this email. Have a great day.\n</p>\n\n<!-- Resulting HTML from test data two -->\n<p>Hi Ben! Have a great day.</p>\n\n<!-- Resulting HTML from test data three -->\n<p>\n  Hi Ben! We think you might enjoy a map of trails in your area. You can find\n  the map attached to this email. Have a great day.\n</p>\n```\n\n</code-group>\n\n##### Or with else\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<p>\nHello Ben!\n{{#or isRunner isCyclist}}\n   We think you might enjoy a map of trails in your area. You can find the map attached to this email.\n{{else}}\n   We'd love to know more about the outdoor activities you enjoy. The survey linked below will take only a minute to fill out.\n{{/or}}.\n Have a great day.\n</p>\n```\n\n```json\n// Test data one\n{\n  \"isRunner\": true,\n  \"isCyclist\": false\n}\n\n// Test data two\n{\n  \"isRunner\": false,\n  \"isCyclist\": false\n}\n// Test data three\n{\n  \"isRunner\": false,\n  \"isCyclist\": true\n}\n```\n\n```html\n<!-- Resulting HTML from test data one -->\n<p>\n  Hi Ben! We think you might enjoy a map of trails in your area. You can find\n  the map attached to this email. Have a great day.\n</p>\n\n<!-- Resulting HTML from test data two -->\n<p>\n  Hi Ben! We'd love to know more about the outdoor activities you enjoy. The\n  survey linked below will take only a minute to fill out. Have a great day.\n</p>\n\n<!-- Resulting HTML from test data three -->\n<p>\n  Hi Ben! We think you might enjoy a map of trails in your area. You can find\n  the map attached to this email. Have a great day.\n</p>\n```\n\n</code-group>\n\n#### Length\n\nThe length helper will return the number of characters in a given string or array. For non-string and non-array values, length will return 0. Length can be useful in combination with other helpers as shown with greaterThan in the following example.\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Templates -->\n<p>\nHello Ben!\n{{#greaterThan 0 length cartItems}}\n It looks like you still have some items in your shopping cart. Sign back in to continue checking out at any time.\n{{else}}\n Thanks for browsing our site. We hope you'll come back soon.\n{{/greaterThan}}\n</p>\n```\n\n```json\n// Test data one\n{\n  \"cartItems\": [\"raft\", \"water bottle\", \"sleeping bag\"]\n}\n\n// Test data two\n{\n  \"cartItems\": []\n}\n```\n\n```html\n<!-- Resulting HTML with test data one-->\n<p>\n  Hello Ben! It looks like you still have some items in your shopping cart. Sign\n  back in to continue checking out at any time.\n</p>\n\n<!-- Resulting HTML with test data two-->\n<p>Hello Ben! Thanks for browsing our site. We hope you'll come back soon.</p>\n```\n\n</code-group>\n\n### Iterations\n\nYou can loop or iterate over data using the `{{#each }}` helper function to build lists and perform other useful templating actions.\n\n#### Basic Iterator with each\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n<ol>\n  {{#each user.orderHistory}}\n   <li>You ordered: {{this.item}} on: {{this.date}}</li>\n  {{/each}}\n</ol>\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"orderHistory\": [\n      {\n        \"date\": \"2/1/2018\",\n        \"item\": \"shoes\"\n      },\n      {\n        \"date\": \"1/4/2017\",\n        \"item\": \"hat\"\n      }\n    ]\n  }\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<ol>\n  <li>You ordered: shoes on: 2/1/2018</li>\n  <li>You ordered: hat on: 1/42017</li>\n</ol>\n```\n\n</code-group>\n\n### Combined examples\n\nThe following examples show you how to combine multiple Handlebars functions to create a truly dynamic template.\n\n- [Dynamic content creation](#dynamic-content-creation)\n- [Dynamic content creation with dynamic parts 1](#dynamic-content-creation-with-dynamic-parts-1)\n- [Dynamic content creation with dynamic parts 2](#dynamic-content-creation-with-dynamic-parts-2)\n\n#### Dynamic content creation\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#each user.story}}\n   {{#if this.male}}\n      <p>{{this.date}}</p>\n   {{else if this.female}}\n      <p>{{this.item}}</p>\n   {{/if}}\n{{/each}}\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"story\": [\n      {\n        \"male\": true,\n        \"date\": \"2/1/2018\",\n        \"item\": \"shoes\"\n      },\n      {\n        \"male\": true,\n        \"date\": \"1/4/2017\",\n        \"item\": \"hat\"\n      },\n      {\n        \"female\": true,\n        \"date\": \"1/1/2016\",\n        \"item\": \"shirt\"\n      }\n    ]\n  }\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>2/1/2018</p>\n<p>1/4/2017</p>\n<p>shirt</p>\n```\n\n</code-group>\n\n#### Dynamic content creation with dynamic parts 1\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#each user.story}}\n   {{#if this.male}}\n      {{#if this.date}}\n         <p>{{this.date}}</p>\n      {{/if}}\n      {{#if this.item}}\n         <p>{{this.item}}</p>\n      {{/if}}\n   {{else if this.female}}\n      {{#if this.date}}\n         <p>{{this.date}}</p>\n      {{/if}}\n      {{#if this.item}}\n         <p>{{this.item}}</p>\n      {{/if}}\n   {{/if}}\n{{/each}}\n```\n\n```json\n// Test data\n{\n  \"user\": {\n    \"story\": [\n      {\n        \"male\": true,\n        \"date\": \"2/1/2018\",\n        \"item\": \"shoes\"\n      },\n      {\n        \"male\": true,\n        \"date\": \"1/4/2017\"\n      },\n      {\n        \"female\": true,\n        \"item\": \"shirt\"\n      }\n    ]\n  }\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>2/1/2018</p>\n<p>shoes</p>\n<p>1/4/2017</p>\n<p>shirt</p>\n```\n\n</code-group>\n\n#### Dynamic content creation with dynamic parts 2\n\n<code-group langs=\"Handlebars, JSON, HTML\">\n\n```handlebars\n<!-- Template -->\n{{#if people}}\n   <p>People:</p>\n   {{#each people}}\n      <p>{{this.name}}</p>\n   {{/each}}\n{{/if}}\n```\n\n```json\n// Test data\n{\n  \"people\": [{ \"name\": \"Bob\" }, { \"name\": \"Sally\" }]\n}\n```\n\n```html\n<!-- Resulting HTML -->\n<p>People:</p>\n<p>Bob</p>\n<p>Sally</p>\n```\n\n</code-group>\n\n## Additional Resources\n\n- [Sending Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Create and edit Dynamic Transactional Templates]({{root_url}}/ui/sending-email/create-and-edit-transactional-templates/)\n- [Dynamic Templates API](https://sendgrid.api-docs.io/v3.0/transactional-templates)\n- [How to send an email with dynamic templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-csharp-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API C# Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid C#, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-csharp), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in C#](https://github.com/sendgrid/sendgrid-csharp/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n## Using SendGrid's C# Library\n\n```csharp\n// using SendGrid's C# Library - https://github.com/sendgrid/sendgrid-csharp\nusing System.Net.Http;\nusing System.Net.Mail;\n\nvar myMessage = new SendGrid.SendGridMessage();\nmyMessage.AddTo(\"test@sendgrid.com\");\nmyMessage.From = new EmailAddress(\"you@youremail.com\", \"First Last\");\nmyMessage.Subject = \"Sending with SendGrid is Fun\";\nmyMessage.PlainTextContent= \"and easy to do anywhere, even with C#\";\n\nvar transportWeb = new SendGrid.Web(\"SENDGRID_APIKEY\");\ntransportWeb.DeliverAsync(myMessage);\n// NOTE: If you're developing a Console Application,\n// use the following so that the API call has time to complete\n// transportWeb.DeliverAsync(myMessage).Wait();\n```\n\n## Using .NET's Built-in SMTP Library\n\nIf you choose not to use SendGrid's client library you may use .NET's built in library.\n\nIf you are using ASP.NET, you can specify SMTP settings in web.config. Please note that your username should be \"apikey\" as specified in [Integrating with the SMTP API]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/).\n\n```xml\n<system.net>\n  <mailSettings>\n    <smtp from=\"test@domain.com\">\n      <network host=\"smtp.sendgrid.net\" password=\"<your_api_key>\" userName=\"apikey\" port=\"587\" />\n    </smtp>\n  </mailSettings>\n</system.net>\n```\n\nThis C# program will build a MIME email and send it through SendGrid. .NET already has built in libraries to send and receive emails.\nThis example uses:\n[.NET Mail](http://msdn.microsoft.com/en-us/library/system.net.mail.aspx)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Net.Mail;\nusing System.Net.Mime;\n\nnamespace SmtpMail\n{\n  class Program\n  {\n    static void Main()\n    {\n      try\n      {\n        MailMessage mailMsg = new MailMessage();\n\n        // To\n        mailMsg.To.Add(new MailAddress(\"to@example.com\", \"To Name\"));\n\n        // From\n        mailMsg.From = new MailAddress(\"from@example.com\", \"From Name\");\n\n        // Subject and multipart/alternative Body\n        mailMsg.Subject = \"subject\";\n        string text = \"text body\";\n        string html = @\"<p>html body</p>\";\n        mailMsg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));\n        mailMsg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));\n\n        // Init SmtpClient and send\n        SmtpClient smtpClient = new SmtpClient(\"smtp.sendgrid.net\", Convert.ToInt32(587));\n        System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(\"username@domain.com\", \"your_api_key\");\n        smtpClient.Credentials = credentials;\n\n        smtpClient.Send(mailMsg);\n      }\n        catch (Exception ex)\n      {\n        Console.WriteLine(ex.Message);\n      }\n\n    }\n  }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-go-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Go Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using SendGrid Go, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-go), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Go](https://github.com/sendgrid/sendgrid-go/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n##  Using SendGrid's Go Library\n```go\n// using SendGrid's Go Library\n// https://github.com/sendgrid/sendgrid-go\npackage main\n\nimport (\n\t\"github.com/sendgrid/sendgrid-go\"\n)\n\nfunc main() {\n\tsg := sendgrid.NewSendGridClientWithApiKey(\"SENDGRID_APIKEY\")\n\n\tmessage := sendgrid.NewMail()\n\tmessage.AddTo(\"test@sendgrid.com\")\n\tmessage.SetFrom(\"you@youremail.com\")\n\tmessage.SetSubject(\"Sending with SendGrid is Fun\")\n\tmessage.SetHTML(\"and easy to do anywhere, even with Go\")\n\n\tsg.Send(message)\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-java-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Java Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using SendGrid Java, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-java), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Java](https://github.com/sendgrid/sendgrid-java/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n##  Using SendGrid's Java Library\n```java\n// using SendGrid's Java Library\n// https://github.com/sendgrid/sendgrid-java\nimport com.sendgrid.*;\n\npublic class SendGridExample {\n  public static void main(String[] args) {\n    SendGrid sendgrid = new SendGrid(\"SENDGRID_APIKEY\");\n\n    SendGrid.Email email = new SendGrid.Email();\n\n    email.addTo(\"test@sendgrid.com\");\n    email.setFrom(\"you@youremail.com\");\n    email.setSubject(\"Sending with SendGrid is Fun\");\n    email.setHtml(\"and easy to do anywhere, even with Java\");\n\n    SendGrid.Response response = sendgrid.send(email);\n  }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-nodejs-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Node.js Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using [v3]({{root_url}}/for-developers/sending-email/v3-nodejs-code-example/) SendGrid Node.js, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-nodejs), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Node.js](https://github.com/sendgrid/sendgrid-nodejs/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n##  Using SendGrid's Node.js Library\n```javascript\n// using SendGrid's Node.js Library\n// https://github.com/sendgrid/sendgrid-nodejs\nconst sendgrid = require(\"sendgrid\")(\"SENDGRID_APIKEY\");\nconst email = new sendgrid.Email();\n\nemail.addTo(\"test@sendgrid.com\");\nemail.setFrom(\"you@youremail.com\");\nemail.setSubject(\"Sending an email with SendGrid is Fun\");\nemail.setHtml(\"and easy to do anywhere, even with Node.js\");\n\nsendgrid.send(email);\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-perl-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Perl Code Example\ngroup: api-v2\nseo:\n  title: Send Email with Perl and SendGrid\n  description: View code examples showing how to easily send email with Perl using SMTP and SendGrid. Further explore SendGrid's email sending Perl library.\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Perl, our client library, <a href=\"https://github.com/sendgrid/sendgrid-perl\">available on GitHub</a>, with full documentation.\n\n</call-out>\n\n## Using SendGrid's Perl Library\n\n```perl\n# Using SendGrid's Perl Library\n# https://github.com/sendgrid/sendgrid-perl\nuse Mail::SendGrid;\nuse Mail::SendGrid::Transport::REST;\n\nmy $sendgrid = Mail::SendGrid->new(\n  from => \"test@sendgrid.com\",\n  to => \"example@example.com\",\n  subject => \"Sending with SendGrid is Fun\",\n  html => \"and easy to do anywhere, even with Perl\"\n);\n\nMail::SendGrid::Transport::REST->new( username => $api_user, api_key => $api_key );\n```\n\n## Without sendgrid-perl\n\nIf you choose not to use SendGrid's client library you may use Perl's generic SMTP library.\n\nThe following code builds a MIME mail message demonstrating all the portions of the SMTP API protocol. To use this example, you will need to have the following perl modules installed:\n\n* [MIME::Entity](http://search.cpan.org/perldoc?MIME::Entity)\n* [Authen::SASL](http://search.cpan.org/perldoc?Authen::SASL)\n\n```perl\n#!/usr/bin/perl\n\nuse strict;\nuse MIME::Entity;\nuse Net::SMTP;\n\n# from is your email address\n# to is who you are sending your email to\n# subject will be the subject line of your email\nmy $from = 'you@yourdomain.com';\nmy $to = 'example@example.com';\nmy $subject = 'Example Perl Email';\n\n# Create the MIME message that will be sent. Check out MIME::Entity on CPAN for more details\nmy $mime = MIME::Entity->build(Type  => 'multipart/alternative',\n                            Encoding => '-SUGGEST',\n                            From => $from,\n                            To => $to,\n                            Subject => $subject\n                            );\n# Create the body of the message (a plain-text and an HTML version).\n# text is your plain-text email\n# html is your html version of the email\n# if the receiver is able to view html emails then only the html\n# email will be displayed\nmy $text = \"Hi!\\nHow are you?\\n\";\nmy $html = <<EOM;\n<html>\n  <head></head>\n  <body>\n    <p>Hi!<br>\n       How are you?<br>\n    </p>\n  </body>\n</html>\nEOM\n\n# attach the body of the email\n$mime->attach(Type => 'text/plain',\n            Encoding =>'-SUGGEST',\n            Data => $text);\n\n$mime->attach(Type => 'text/html',\n            Encoding =>'-SUGGEST',\n            Data => $html);\n\n# attach a file\nmy $my_file_txt = 'example.txt';\n\n$mime->attach ( Path      => $my_file_txt,\n                   Type      => 'text/txt',\n                   Encoding  => 'base64'\n) or die \"Error adding !\\n\";\n\n# Login credentials\nmy $username = 'example@example.com';\nmy $api_key = \"your_api_key\";\n\n# Open a connection to the SendGrid mail server\nmy $smtp = Net::SMTP->new('smtp.sendgrid.net',\n                        Port=> 587,\n                        Timeout => 20,\n                        Hello => \"yourdomain.com\");\n\n# Authenticate\n$smtp->auth($username, $api_key);\n\n# Send the rest of the SMTP stuff to the server\n$smtp->mail($from);\n$smtp->to($to);\n$smtp->data($mime->stringify);\n$smtp->quit();\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-php-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API PHP Code Example\ngroup: api-v2\nseo:\n  override: true\n  title: Send Email with PHP and SendGrid - SendGrid Documentation | SendGrid\n  description: View code examples showing how to easily send email with PHP using cURL and SendGrid. Further explore SendGrid's email sending PHP library.\nnavigation:\n  show: true\n---\n\n<call-out>\n\n We recommend using SendGrid PHP, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-php), with full documentation.\n\n </call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in PHP](https://github.com/sendgrid/sendgrid-php/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n## Using SendGrid's PHP Library\n```php\n// using SendGrid's PHP Library\n// https://github.com/sendgrid/sendgrid-php\nrequire 'vendor/autoload.php';\n$sendgrid = new SendGrid(\"SENDGRID_APIKEY\");\n$email    = new SendGrid\\Email();\n\n$email->addTo(\"test@sendgrid.com\")\n      ->setFrom(\"you@youremail.com\")\n      ->setSubject(\"Sending with SendGrid is Fun\")\n      ->setHtml(\"and easy to do anywhere, even with PHP\");\n\n$sendgrid->send($email);\n```\n\n## \tUsing PHP with cURL\n \tIf you choose not to use SendGrid's client library you may use PHP's cURL function to query the web API.\n\n```php\n<?php\n\nrequire 'vendor/autoload.php';\nDotenv::load(__DIR__);\n$sendgrid_apikey = getenv('YOUR_SENDGRID_APIKEY');\n$sendgrid = new SendGrid($sendgrid_apikey);\n$url = 'https://api.sendgrid.com/';\n$pass = $sendgrid_apikey;\n$template_id = '<your_template_id>';\n$js = array(\n  'sub' => array(':name' => array('Elmer')),\n  'filters' => array('templates' => array('settings' => array('enable' => 1, 'template_id' => $template_id)))\n);\n\n$params = array(\n    'to'        => \"test@example.com\",\n    'toname'    => \"Example User\",\n    'from'      => \"you@youremail.com\",\n    'fromname'  => \"Your Name\",\n    'subject'   => \"PHP Test\",\n    'text'      => \"I'm text!\",\n    'html'      => \"<strong>I'm HTML!</strong>\",\n    'x-smtpapi' => json_encode($js),\n  );\n\n$request =  $url.'api/mail.send.json';\n\n// Generate curl request\n$session = curl_init($request);\n// Tell PHP not to use SSLv3 (instead opting for TLS)\ncurl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);\ncurl_setopt($session, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $sendgrid_apikey));\n// Tell curl to use HTTP POST\ncurl_setopt ($session, CURLOPT_POST, true);\n// Tell curl that this is the body of the POST\ncurl_setopt ($session, CURLOPT_POSTFIELDS, $params);\n// Tell curl not to return headers, but do return the response\ncurl_setopt($session, CURLOPT_HEADER, false);\ncurl_setopt($session, CURLOPT_RETURNTRANSFER, true);\n\n// obtain response\n$response = curl_exec($session);\ncurl_close($session);\n\n// print everything out\nprint_r($response);\n\n?>\n```\n\n## An Email Sent Using the SMTPAPI Header\n\nThis example takes the previous example a step further by adding our SMTPAPI header to set a category and send out to multiple recipients. The category is called test_category, and the email will go out to both example1@sendgrid.com and example2@sendgrid.com. The normal to address, example3@sendgrid.com, will not receive an email.\n\n```php\n<?php\n\n$url = 'https://api.sendgrid.com/';\n$user = 'USERNAME';\n$pass = 'APIKEY';\n\n$json_string = array(\n\n  'to' => array(\n    'example1@sendgrid.com', 'example2@sendgrid.com'\n  ),\n  'category' => 'test_category'\n);\n\n\n$params = array(\n    'api_user'  => $user,\n    'api_key'   => $pass,\n    'x-smtpapi' => json_encode($json_string),\n    'to'        => 'example3@sendgrid.com',\n    'subject'   => 'testing from curl',\n    'html'      => 'testing body',\n    'text'      => 'testing body',\n    'from'      => 'example@sendgrid.com',\n  );\n\n\n$request =  $url.'api/mail.send.json';\n\n// Generate curl request\n$session = curl_init($request);\n// Tell curl to use HTTP POST\ncurl_setopt ($session, CURLOPT_POST, true);\n// Tell curl that this is the body of the POST\ncurl_setopt ($session, CURLOPT_POSTFIELDS, $params);\n// Tell curl not to return headers, but do return the response\ncurl_setopt($session, CURLOPT_HEADER, false);\n// Tell PHP not to use SSLv3 (instead opting for TLS)\ncurl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);\ncurl_setopt($session, CURLOPT_RETURNTRANSFER, true);\n\n// obtain response\n$response = curl_exec($session);\ncurl_close($session);\n\n// print everything out\nprint_r($response);\n\n?>\n```\n\n## An Email Sent Including a File Attachment\n\nThis example adds the additional attachment parameter to attach a file called myfile. This example assumes the file is in the same directory as your code otherwise you need to specify the full path of the file in the \\$filePath variable.\n\n```php\n<?php\n\n$url = 'https://api.sendgrid.com/';\n$user = 'USERNAME';\n$pass = 'PASSWORD';\n\n$fileName = 'myfile';\n$filePath = dirname(__FILE__);\n\n$params = array(\n    'api_user'  => $user,\n    'api_key'   => $pass,\n    'to'        => 'example@sendgrid.com',\n    'subject'   => 'test of file sends',\n    'html'      => '<p> the HTML </p>',\n    'text'      => 'the plain text',\n    'from'      => 'example@sendgrid.com',\n    'files['.$fileName.']' => '@'.$filePath.'/'.$fileName\n  );\n\nprint_r($params);\n\n$request =  $url.'api/mail.send.json';\n\n// Generate curl request\n$session = curl_init($request);\n\n// Tell curl to use HTTP POST\ncurl_setopt ($session, CURLOPT_POST, true);\n\n// Tell curl that this is the body of the POST\ncurl_setopt ($session, CURLOPT_POSTFIELDS, $params);\n\n// Tell curl not to return headers, but do return the response\ncurl_setopt($session, CURLOPT_HEADER, false);\n// Tell PHP not to use SSLv3 (instead opting for TLS)\ncurl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);\ncurl_setopt($session, CURLOPT_RETURNTRANSFER, true);\n\n// obtain response\n$response = curl_exec($session);\ncurl_close($session);\n\n// print everything out\nprint_r($response);\n\n?>\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-python-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Python Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Python, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-python), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Python](https://github.com/sendgrid/sendgrid-python/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n##  Using SendGrid's Python Library\n```python\n# using SendGrid's Python Library\n# https://github.com/sendgrid/sendgrid-python\nimport sendgrid\n\nclient = sendgrid.SendGridClient(\"SENDGRID_APIKEY\")\nmessage = sendgrid.Mail()\n\nmessage.add_to(\"test@sendgrid.com\")\nmessage.set_from(\"you@youremail.com\")\nmessage.set_subject(\"Sending with SendGrid is Fun\")\nmessage.set_html(\"and easy to do anywhere, even with Python\")\n\nclient.send(message)\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v2-ruby-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v2 API Ruby Code Example\ngroup: api-v2\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Ruby, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-ruby), with full documentation.\n\n</call-out>\n\n<call-out>\n\nThe library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Ruby](https://github.com/sendgrid/sendgrid-ruby/blob/master/TROUBLESHOOTING.md#v2).\n\n</call-out>\n\n##  Using SendGrid's Ruby Library\n```ruby\n# using SendGrid's Ruby Library\n# https://github.com/sendgrid/sendgrid-ruby\nrequire 'sendgrid-ruby'\n\nsendgrid = SendGrid::Client.new do |c|\n  c.api_key = 'SENDGRID_APIKEY'\nend\n\nemail = SendGrid::Mail.new do |m|\n  m.to      = 'test@sendgrid.com'\n  m.from    = 'you@youremail.com'\n  m.subject = 'Sending with SendGrid is Fun'\n  m.html    = 'and easy to do anywhere, even with Ruby'\nend\n\nsendgrid.send(email)\n```\n\nThis example shows how to send email plain text and HTML email using Ruby. The gem [Mail](https://github.com/mikel/mail) is required.\n\n```ruby\nrequire 'mail'\nMail.defaults do\n  delivery_method :smtp, { :address   => \"smtp.sendgrid.net\",\n                           :port      => 587,\n                           :domain    => \"yourdomain.com\",\n                           :user_name => \"yourusername@domain.com\",\n                           :api_key  => \"your_api_key\",\n                           :authentication => 'plain',\n                           :enable_starttls_auto => true }\nend\n\nmail = Mail.deliver do\n  to 'yourRecipient@domain.com'\n  from 'Your Name <name@domain.com>'\n  subject 'This is the subject of your email'\n  text_part do\n    body 'Hello world in text'\n  end\n  html_part do\n    content_type 'text/html; charset=UTF-8'\n    body '<b>Hello world in HTML</b>'\n  end\nend\n```\n\n To install the [Mail](https://github.com/mikel/mail) gem please note that you need the OpenSSL library installed, then run the following:\n\n```bash\ngem install mail\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-csharp-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API C# Code Example\ngroup: api-v3\nnavigation:\n    show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid C#, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-csharp), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n## Using SendGrid's C# Library\n```csharp\n// using SendGrid's C# Library\n// https://github.com/sendgrid/sendgrid-csharp\nusing SendGrid;\nusing SendGrid.Helpers.Mail;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Example\n{\n    internal class Example\n    {\n        private static void Main()\n        {\n            Execute().Wait();\n        }\n\n        static async Task Execute()\n        {\n            var apiKey = Environment.GetEnvironmentVariable(\"NAME_OF_THE_ENVIRONMENT_VARIABLE_FOR_YOUR_SENDGRID_KEY\");\n            var client = new SendGridClient(apiKey);\n            var from = new EmailAddress(\"test@example.com\", \"Example User\");\n            var subject = \"Sending with SendGrid is Fun\";\n            var to = new EmailAddress(\"test@example.com\", \"Example User\");\n            var plainTextContent = \"and easy to do anywhere, even with C#\";\n            var htmlContent = \"<strong>and easy to do anywhere, even with C#</strong>\";\n            var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);\n            var response = await client.SendEmailAsync(msg);\n        }\n    }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-go-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API Go Code Example\ngroup: api-v3\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Go, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-go), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n## Using SendGrid's Go Library\n```go\n// using SendGrid's Go Library\n// https://github.com/sendgrid/sendgrid-go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/sendgrid/sendgrid-go\"\n\t\"github.com/sendgrid/sendgrid-go/helpers/mail\"\n)\n\nfunc main() {\n\tfrom := mail.NewEmail(\"Example User\", \"test@example.com\")\n\tsubject := \"Sending with SendGrid is Fun\"\n\tto := mail.NewEmail(\"Example User\", \"test@example.com\")\n\tplainTextContent := \"and easy to do anywhere, even with Go\"\n\thtmlContent := \"<strong>and easy to do anywhere, even with Go</strong>\"\n\tmessage := mail.NewSingleEmail(from, subject, to, plainTextContent, htmlContent)\n\tclient := sendgrid.NewSendClient(os.Getenv(\"SENDGRID_API_KEY\"))\n\tresponse, err := client.Send(message)\n\tif err != nil {\n\t\tlog.Println(err)\n\t} else {\n\t\tfmt.Println(response.StatusCode)\n\t\tfmt.Println(response.Body)\n\t\tfmt.Println(response.Headers)\n\t}\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-java-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API Java Code Example\ngroup: api-v3\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using SendGrid Java, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-java), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n## Using SendGrid's Java Library\n```java\n// using SendGrid's Java Library\n// https://github.com/sendgrid/sendgrid-java\nimport com.sendgrid.*;\nimport java.io.IOException;\n\npublic class Example {\n  public static void main(String[] args) throws IOException {\n    Email from = new Email(\"test@example.com\");\n    String subject = \"Sending with SendGrid is Fun\";\n    Email to = new Email(\"test@example.com\");\n    Content content = new Content(\"text/plain\", \"and easy to do anywhere, even with Java\");\n    Mail mail = new Mail(from, subject, to, content);\n\n    SendGrid sg = new SendGrid(System.getenv(\"SENDGRID_API_KEY\"));\n    Request request = new Request();\n    try {\n      request.setMethod(Method.POST);\n      request.setEndpoint(\"mail/send\");\n      request.setBody(mail.build());\n      Response response = sg.api(request);\n      System.out.println(response.getStatusCode());\n      System.out.println(response.getBody());\n      System.out.println(response.getHeaders());\n    } catch (IOException ex) {\n      throw ex;\n    }\n  }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-kotlin-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API Kotlin Code Example\ngroup: api-v3\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using SendGrid Java, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-java), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n## Using SendGrid's Java Library\n```kotlin\n// using SendGrid's Java Library\n// https://github.com/sendgrid/sendgrid-java\nimport com.sendgrid.*;\nimport java.io.IOException;\n\nclass Example {\n  private fun sendEmail() {\n\n        val sendgrid = SendGrid(\"SENDGRID_APIKEY\")\n        val email = SendGrid.Email()\n\n        email.addTo(\"test@sendgrid.com\")\n        email.setFrom(\"you@youremail.com\")\n        email.setSubject(\"Sending with SendGrid is Fun\")\n        email.setHtml(\"and easy to do anywhere, even with Kotlin\")\n\n        val response = sendgrid.send(email)\n  }\n}\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-mail-send-faq.md",
    "content": "---\nseo:\n  title: v3 Mail Send FAQ\n  description:\n  keywords: v2 mail send, v3 mail send, faq, frequently asked questions\ntitle: v3 Mail Send FAQ\ngroup: api-v3\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n## What is the v3 Mail Send endpoint?\n\nThe [v3 Mail Send endpoint](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) is the latest version of SendGrid’s Web API endpoint that allows you to send email by making a simple HTTP request. The introduction of the v3 Mail Send endpoint signifies the completion of our RESTful Web API v3.\n\nIf you’re looking for one of the other methods that you can use to send mail through SendGrid, please see our [SMTP]({{root_url}}/for-developers/sending-email/getting-started-smtp/), [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) feature, or [Web API v2](https://www.twilio.com/docs/sendgrid/api/v2/mail).\n\n## Do I have to have a certain type of account to use the v3 Mail Send endpoint?\n\nThe v3 Mail Send endpoint is available on all SendGrid pricing plans. The same plan based limitations on the volume of email you may send still apply to the v3 Mail Send endpoint. For more information, please visit our [Pricing Page](https://sendgrid.com/pricing).\n\n## I’m currently using the v2 Mail Send endpoint. Should I switch to v3?\n\nThe v3 Mail Send endpoint offers many improvements over the v2 endpoint, and we highly encourage all users to migrate their email programs from the v2 to the v3 endpoint. While you may not notice any significant changes in the functionality offered by the v3 mail send endpoint, you will find it to be significantly easier to use. The v3 Mail Send endpoint offers a more comprehensive and consistent [JSON schema](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-requests#making-a-request), intuitive validation with more in depth [error messages](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-errors#response-codes), and complete coverage across all [7 of our supported libraries]({{root_url}}/for-developers/sending-email/libraries/).\n\n## How do I migrate from V2 to V3?\n\nIf you are currently using the v2 Mail Send endpoint, we have provided some [helpful instructions]({{root_url}}/for-developers/sending-email/migrating-from-v2-to-v3-mail-send/) on how to migrate from sending mail over the Web API v2 to the Web API v3.\n\n## What’s the difference between sending mail via SMTP and the Web API?\n\nSending email via the [SMTP-Relay]({{root_url}}/for-developers/sending-email/getting-started-smtp/) is a quick and simple way to integrate your existing SMTP code with SendGrid’s email functionality. All you have to do is modify your SMTP configuration to point to SendGrid’s SMTP server and your email will be routed through SendGrid’s SMTP-Relay. You may then specify special instructions for how you would like SendGrid to handle your email by means of the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/).\n\nThe Web API, on the other hand, requires you to make an HTTP request to an endpoint in SendGrid’s API. Previously, SendGrid has only offered an email sending endpoint in the Web API v2, but now you can use the RESTful Web API v3 to send your email. Simply make an `HTTP POST` request to `https://api.sendgrid.com/v3/mail/send` with the data for your email included in a JSON payload. For more information, please visit our [v3 Mail Send documentation](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\n\n## Can I send marketing email over the v3 Mail Send endpoint?\n\nYou can send any type of email (transactional or marketing) over the v3 Mail Send endpoint. However, we recommend you take a look at our [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) for a more robust marketing feature set (including segmentation and templates).\n\n## Are there limits on how often I can send email and how many recipients I can send to?\n\nThere are rate limits on how frequently you can call the v3 Mail Send endpoint. Currently, you may make up to 10,000 requests per second to our endpoint. Each email you send may include up to 1000 recipients. For more information on other limitations, and how this may impact your integration, please visit our [v3 Mail Send overview](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-rate-limits).\n\n## Why did you remove the x-smtpapi parameter? Can I still change my mail settings, tracking settings, and unique arguments?\n\nEverything that could be accomplished by using the x-smtpapi parameter in the v2 Mail Send endpoint can still be done with the v3 endpoint. While the v2 Mail Send endpoint required you to include a separate block of JSON for various mail settings within the single x-smtpapi parameter, the v3 endpoint payload structure includes each setting as a separate parameter. This allows for a quicker and more consistent integration and helps with validation and debugging.\n\n## Where can I find more information about the v3 Mail Send endpoint?\n\nFor more general information about the v3 Mail Send endpoint, please visit the [v3 Mail Send Overview]({{root_url}}/api-reference). Below, you will find links to more in depth information about the endpoint.\n\n## Additional Resources\n\n- [v3 Mail Send Overview](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send)\n- [SandBox Mode]({{root_url}}/for-developers/sending-email/sandbox-mode/)\n- [Errors](https://sendgrid.api-docs.io/v3.0/mail-send/mail-send-errors)\n- [Personalizations]({{root_url}}/for-developers/sending-email/personalizations/)\n- [Examples for Common Use Cases]({{root_url}}/for-developers/sending-email/curl-examples/)\n- [How to Migrate from V2 to V3 Mail Send]({{root_url}}/for-developers/sending-email/migrating-from-v2-to-v3-mail-send/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-php-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API PHP Code Example\ngroup: api-v3\nseo:\n  override: true\n  title: Send Email with PHP and Twilio SendGrid - Twilio SendGrid Documentation | Twilio SendGrid\n  description: View code examples showing how to easily send email with PHP using cURL and Twilio SendGrid. Further explore Twilio SendGrid's email sending PHP library.\nnavigation:\n  show: true\n---\n<call-out>\n\nWe recommend using Twilio SendGrid PHP, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-php), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\nMake sure you've set the [SENDGRID_API_KEY](https://github.com/sendgrid/sendgrid-php#setup-environment-variables) environment variable in your env file.\n\n</call-out>\n\n## Using Twilio SendGrid's PHP Library\n\nPlease see the [Twilio SendGrid PHP example code at GitHub](https://github.com/sendgrid/sendgrid-php/blob/main/USE_CASES.md#send-an-email-to-a-single-recipient).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-python-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API Python Code Example\ngroup: api-v3\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Python, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-python), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n## Using SendGrid's Python Library\n```python\n# using SendGrid's Python Library\n# https://github.com/sendgrid/sendgrid-python\nimport os\nfrom sendgrid import SendGridAPIClient\nfrom sendgrid.helpers.mail import Mail\n\nmessage = Mail(\n    from_email='from_email@example.com',\n    to_emails='to@example.com',\n    subject='Sending with Twilio SendGrid is Fun',\n    html_content='<strong>and easy to do anywhere, even with Python</strong>')\ntry:\n    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))\n    response = sg.send(message)\n    print(response.status_code)\n    print(response.body)\n    print(response.headers)\nexcept Exception as e:\n    print(e.message)\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/v3-ruby-code-example.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: v3 API Ruby Code Example\ngroup: api-v3\nnavigation:\n  show: true\n---\n\n<call-out>\n\nWe recommend using SendGrid Ruby, our client library, [available on GitHub](https://github.com/sendgrid/sendgrid-ruby), with full documentation.\n\n</call-out>\n\n<call-out>\n\nDo you have an [API Key](https://app.sendgrid.com/settings/api_keys) yet? If not, go get one. You're going to need it to integrate!\n\n</call-out>\n\n##  Using SendGrid's Ruby Library\n```ruby\n# using SendGrid's Ruby Library\n# https://github.com/sendgrid/sendgrid-ruby\nrequire 'sendgrid-ruby'\ninclude SendGrid\n\nfrom = SendGrid::Email.new(email: 'test@example.com')\nto = SendGrid::Email.new(email: 'test@example.com')\nsubject = 'Sending with SendGrid is Fun'\ncontent = SendGrid::Content.new(type: 'text/plain', value: 'and easy to do anywhere, even with Ruby')\nmail = SendGrid::Mail.new(from, subject, to, content)\n\nsg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])\nresponse = sg.client.mail._('send').post(request_body: mail.to_json)\nputs response.status_code\nputs response.body\nputs response.headers\n```\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/wordpress-faq.md",
    "content": "---\nseo:\n title: Wordpress FAQ\n description: Learn how to send your WordPress email through SendGrid.\n keywords: WordPress, SendGrid, integrate, plugin, subscription widget\ntitle: Wordpress FAQ\ngroup: plugins\nweight: 100\nlayout: page\nnavigation:\n show: true\n---\n\n## \tWhat PHP versions are supported?\n\nPlugin versions 1.11.x were tested and confirmed to work on PHP 5.4, 5.5, 5.6, 7.0, 7.1. It DOES NOT work on PHP 5.3 and earlier.\nPlugin versions 1.10.x were tested and confirmed to work on PHP 5.3, 5.4, 5.5 and 5.6. It DOES NOT work on PHP 7.0 and later.\n\n## \tWhat credentials do I need to add on the settings page?\n\nIf you do not already have one, simply [create a SendGrid account](https://sendgrid.com/partner/wordpress) and [generate a new API Key](https://app.sendgrid.com/settings/api_keys).\n\n## \tHow can I define a plugin setting to be used for all sites?\n\nTo define a plugin setting that you want to use on all of your WordPress sites, simply add it into your wp-config.php file. For example, the following API Key setting would be applicable across each of your WordPress sites:\n\n```php\ndefine('SENDGRID_API_KEY', 'your_api_key');\n```\n\n## \tHow do I use SendGrid with the WP Better Emails plugin?\n\nIf you have the [WP Better Emails plugin](https://wordpress.org/plugins/wp-better-emails/) installed and you want to use the template defined here instead of the SendGrid template, you can add the following code in your functions.php file from your theme:\n\n```php\nfunction use_wpbe_template( $message, $content_type ) {\n    global $wp_better_emails;\n    if ( 'text/plain' == $content_type ) {\n      $message = $wp_better_emails->process_email_text( $message );\n    } else {\n      $message = $wp_better_emails->process_email_html( $message );\n    }\n    return $message;\n}\n\nadd_filter( 'sendgrid_override_template', 'use_wpbe_template', 10, 2 );\n```\n\nUsing the default templates from WP Better Emails will cause all emails to be sent as HTML (i.e. content-type of text/html). In order to send emails as plain text (i.e. a content-type of text/plain) you should remove the HTML Template from WP Better Emails settings page. This is can be done by removing the `%content%` tag from the HTML template.\n\n## \tWhy are my emails sent as HTML instead of plain text?\n\nFor a detailed explanation of why your emails might be converted to HTML instead of plain text, please see [Cross-platform Email Design]({{root_url}}/ui/sending-email/cross-platform-html-design/).\n\n## \tWill contacts from the widget be uploaded to Marketing Campaigns or Legacy Newsletter?\n\nThe contacts will only be uploaded to Marketing Campaigns.\n\n## \tWhat permissions should my API keys have?\n\nFor the API Key used for sending emails (the General tab):\n\n* Full Access to Mail Send.\n* Read Access to Stats.\n* Read Access to Suppressions > Unsubscribe Groups.\n* Read Access to Template Engine.\n\nFor the API Key used for contact upload (the Subscription Widget tab):\n\n* Full Access to Marketing Campaigns.\n\n## \tCan I disable the opt-in email?\n\nNo. SendGrid’s Email Policy requires that all email addresses sent to by SendGrid customers be confirmed via an opt-in email. In other words, every recipient of an email sent via SendGrid must actively confirm their desire to receive that email by means of an opt-in confirmation.\n\n## \tCan I change the content of the emails before they are sent?\n\nYes, you can change the content by adding a filter. You need to declare a function that takes the content of the email as an argument and then call `add_filter()` with the name \"sendgrid_mail_text\" or \"sendgrid_mail_html\", depending on what part of the email you want to change.\n\nIf you want to change the _text content_ of all emails before they are delivered, add the following to the functions.php file of your WordPress installation.\n\n```php\nfunction change_sendgrid_text_email( $message ) {\n    return $message . ' changed by way of text filter ';\n}\n\nadd_filter( 'sendgrid_mail_text', 'change_sendgrid_text_email' );\n```\n\nIf you want to change the _HTML content_ of all emails before they are delivered, simply add the following to the **functions.php** file of your WordPress installation.\n\n```php\nfunction change_sendgrid_html_email( $message ) {\n    return $message . ' changed by way of html filter ';\n}\n\nadd_filter( 'sendgrid_mail_html', 'change_sendgrid_html_email' );\n```\n\n<call-out>\n\n**Please note:** What is changed in your emails depends on the content-type that you have set in the settings page or overwritten in a filter.\n\nFor \"text/plain,\" only the text part is overwritten by the filter. For \"text/html,\" both the text and the HTML filters are called.\n\n</call-out>\n\nThe code snippets above are usually added in the functions.php file of your theme.\n\n## \tCan the SendGrid Plugin be used on a multisite network?\n\nYes. This plugin has basic multisite network support.\n\nTo use the SendGrid plugin on your multisite network, navigate to your WordPress dashboard and click **My Sites**, select **Network Admin**, and click on **Plugins**. Under the SendGrid WordPress plugin, click **Network Enable**.\n\nThe settings for all sites in the network can only be configured by the network admin in the Network Admin dashboard.\n\n<call-out>\n\n**Please note:** Since 1.10.5 the Network Admin can delegate the configuration for each subsite to their respective owners. This will allow any subsite to use it’s own SendGrid Plugin configuration.\n\n</call-out>\n\n## \tCan I use shortcodes to customize the subscription confirmation page?\n\nYes. You need to create custom page and select it from the settings page. You can place any of these shortcodes in the body of that page. Here’s an example :\n\n```php\n    Hi [sendgridSubscriptionFirstName] [sendgridSubscriptionLastName],\n    Your email address : [sendgridSubscriptionEmail] has been successfully added.\n\n    You'll hear from us soon!\n```\n\nYou need to enable the use of the First Name and Last Name fields from the settings page in order to use the shortcodes for them.\n\n## \tCan I use this plugin with BuddyPress?\n\nYes. Our plugin required special integration with BuddyPress and it’s regularly tested to ensure it behaves as expected. If you have noticed issues caused by installing this plugin along with BuddyPress, you can add the following line to your `wp-config.php` to disable it :\n\n```php\ndefine('SENDGRID_DISABLE_BUDDYPRESS', '1');\n```\n\n## \tRelated Content\n\n* [SendGrid’s WordPress Plugin]({{root_url}}/for-developers/sending-email/wordpress-plugin/)\n* [SendGrid’s WordPress Subscription Widget]({{root_url}}/for-developers/sending-email/wordpress-subscription-widget/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/wordpress-plugin.md",
    "content": "---\nst:\n  published_at: 2016-07-25\n  type: [integrate]\nseo:\n  title: SendGrid's WordPress Plugin\n  description: Learn how to send your WordPress email through SendGrid.\n  keywords: WordPress, SendGrid, integrate, plugin, subscription widget\ntitle: SendGrid's WordPress Plugin\ngroup: plugins\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid's cloud-based email infrastructure relieves businesses of the cost and complexity of maintaining custom email systems. SendGrid provides reliable deliverability, scalability, and real-time analytics along with flexible APIs that make custom integration with your application a breeze.\n\nSendGrid’s [WordPress plugin](https://wordpress.org/plugins/sendgrid-email-delivery-simplified/) replaces WordPress’s default **wp_mail()** function by using either an SMTP or API integration with SendGrid to send outgoing email from your WordPress installation. It also allows you to upload contacts directly to your SendGrid Marketing Campaigns account via a [subscription widget]({{root_url}}/for-developers/sending-email/wordpress-subscription-widget/).\n\nBy using the SendGrid plugin, you will be able to take advantage of improved deliverability and an expanded feature set, including tracking and analytics, to enhance user engagement on your WordPress installation. SendGrid also provides world class customer support, should you run into any issues.\n\n## Installing SendGrid’s WordPress Plugin\n\nIn order to send emails through SMTP, you first need to install the [Swift Mailer](https://wordpress.org/plugins/swift-mailer/) plugin.\n\nTo get the SendGrid plugin running after you have activated Swift Mailer, navigate to Settings and enter your SendGrid credentials. Finally, select how you want your email to be delivered: either via SMTP or API.\n\nYou can also set default values for the \"Name,\" \"Sending Address,\" and the \"Reply Address” headers so that you don’t have to define these headers every time you want to send an email.\n\nIf you would like to use [templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/), you can set the template ID to be used in all of your emails on the settings page or you can set it individually for each email in the headers.\n\nYou can have an individual email sent to each recipient by specifying the x-smtpapi-to header. For example:\n\n```php\nx-smtpapi-to: example@example.com, example2@example.com\n```\n\n<call-out>\n\nWhen using the SMTP method you must also define the `To` address. It does not matter what address you set in the `To` field since it will be overwritten by `x-smtpapi-to`.\n\n</call-out>\n\nEmails are automatically tracked, allowing you to retrieve delivery and engagement statistics from within the SendGrid Dashboard. You can also specify certain [categories](#how-to-use-categories) for any of your emails to help you organize them by type.\n\n## Configuring SendGrid’s WordPress Plugin\n\nWhile it is possible to simply install and configure the SendGrid plugin for WordPress as described above to immediately begin sending your emails through SendGrid, you may take steps to further customize the SendGrid WordPress plugin.\n\nThe following explanations and examples show how you can use SendGrid to adjust WordPress’s `wp_mail()` function.\n\n##### The wp_mail() Function\n\nThe SendGrid plugin makes adjustments to the `wp_mail()` function so that all emails sent from WordPress are delivered by SendGrid.\n\nYou can send emails using the following function:\n\n```php\nwp_mail($to, $subject, $message, $headers =\"\", $attachments = array())\n```\n\n<table class=\"table\">\n  <tr><th>Variable</th><th>Description</th></tr>\n  <tr><td><code>$to</code></td><td>An array, or comma-separated list (CSV), of email addresses to send message.</td></tr>\n  <tr><td><code>$subject</code></td><td>The subject of your email.</td></tr>\n  <tr><td><code>$message</code></td><td>The contents of your email.</td></tr>\n  <tr><td><code>$headers</code></td><td>An optional array or SendGrid\\Email() object.</td></tr>\n  <tr><td><code>$attachments</code></td><td>An optional array, a comma separated list (\", \"), or a new line separated list (\"\\n\") of files to attach.</td></tr>\n</table>\n\nIf you want to send an email with HTML content, set the content type to 'text/html' by running the following function before `wp_mail()`:\n\n```php\nadd_filter('wp_mail_content_type', 'set_html_content_type');\n```\n\n<call-out type=\"warning\">\n\nAfter you’ve run wp_mail(), you must remove the ‘text/html’ filter in order to return to your initial settings.\n\n</call-out>\n\n```php\nremove_filter('wp_mail_content_type', 'set_html_content_type');\n```\n\n## Sending HTML in Your Email Using Different Headers\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n#### Using an Array to Set Your Headers\n\n```php\n$subject = 'Test SendGrid plugin';\n$message = 'testing WordPress plugin';\n$to = array('address1@sendgrid.com', 'Address2 <address2@sendgrid.com>', 'address3@sendgrid.com');\n\n$headers = array();\n$headers[] = 'From: Me Myself <me@example.net>';\n$headers[] = 'Cc: address4@sendgrid.com';\n$headers[] = 'Bcc: address5@sendgrid.com';\n$headers[] = 'unique-args:customer=mycustomer;location=mylocation';\n$headers[] = 'categories: category1, category2';\n$headers[] = 'template: templateID';\n$headers[] = 'x-smtpapi-to: address1@sendgrid.com,address2@sendgrid.com';\n\n$attachments = array('/tmp/img1.jpg', '/tmp/img2.jpg');\n\nadd_filter('wp_mail_content_type', 'set_html_content_type');\n$mail = wp_mail($to, $subject, $message, $headers, $attachments);\n\nremove_filter('wp_mail_content_type', 'set_html_content_type');\n```\n\n#### Using SendGrid\\Email() to Set Your Headers\n\n```php\n$subject = 'Test SendGrid plugin';\n$message = 'testing WordPress plugin';\n$to = array('address1@sendgrid.com', 'Address2 <address2@sendgrid.com>', 'address3@sendgrid.com');\n\n$headers = new SendGrid\\Email();\n$headers->setFromName(\"John Doe\")\n        ->setFrom(\"example@example.net\")\n        ->setCc(\"example2@example.com\")\n        ->setBcc(\"example3@example.com\")\n        ->setUniqueArgs(array('customer' => 'mycustomer', 'location' => 'mylocation'))\n        ->addCategory('category1')\n        ->addCategory('category2')\n        ->setTemplateId('templateID');\n\n$attachments = array('/tmp/img1.jpg', '/tmp/img2.jpg');\n\nadd_filter('wp_mail_content_type', 'set_html_content_type');\n$mail = wp_mail($to, $subject, $message, $headers, $attachments);\n\nremove_filter('wp_mail_content_type', 'set_html_content_type');\n```\n\n## Substitution Tags and Sections\n\n```php\n$subject = 'Hey %name%, you work at %place%';\n$message = 'testing WordPress plugin';\n$to = array('address1@sendgrid.com');\n\n$headers = new SendGrid\\Email();\n$headers\n    ->addSmtpapiTo(\"john@somewhere.com\")\n    ->addSmtpapiTo(\"harry@somewhere.com\")\n    ->addSmtpapiTo(\"Bob@somewhere.com\")\n    ->addSubstitution(\"%name%\", array(\"John\", \"Harry\", \"Bob\"))\n    ->addSubstitution(\"%place%\", array(\"%office%\", \"%office%\", \"%home%\"))\n    ->addSection(\"%office%\", \"an office\")\n    ->addSection(\"%home%\", \"your house\");\n\n$mail = wp_mail($to, $subject, $message, $headers);\n```\n\nFor more examples of how you can use SendGrid SMTPAPI headers, please visit the [SendGrid PHP Library on GitHub](https://github.com/sendgrid/sendgrid-php#smtpapi).\n\n## How to Use Categories\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nYou can use [categories]({{root_url}}/ui/analytics-and-reporting/categories/) to help organize and track the emails sent from WordPress via the SendGrid plugin.\n\nCategories used for emails can be set either globally, or on an email-by-email basis.\n\nTo set categories globally, thus applying a category to every email sent, simply define the value for the 'Categories' field in the 'Mail settings' section\n\nYou can also assign a specific category to an email by using the headers array. Use the following format when assigning specific categories to an email:\n\n```php\n$headers[] = 'categories: category1, category2';\n```\n\nIf you would like to configure categories for statistics tracking, simply set your desired category as the value of the 'Categories' field in the 'Statistics settings' section.\n\n## Multisite\n\nIf you are using the SendGrid plugin in a multisite environment, you need to enable it for use across your multisite network.\n\nSimply navigate to **My Sites**, click on **Network Admin**, and select **Plugins**.\n\nHere you can either enable or disable your SendGrid plugin for use across your multisite network.\n\nOnce you have enabled SendGrid for use across your multisite network, you will be able to access the settings page from the network dashboard.\n\nYou can enable access for SendGrid settings to each subsite in the Multisite Settings tab. If the checkbox is unchecked then that site will not see the SendGrid settings page and it will use the settings set on the network.\n\n<call-out>\n\n**Please note!** When you activate SendGrid management for a subsite, that site will not be able to send emails until the admin updates the SendGrid settings on that subsite.\n\n</call-out>\n\nIf you have already installed the SendGrid plugin in a multisite environment and you update to any version **after** 1.9.0 you may need to re-configure your plugin.\n\n## Additional Resources\n\n- [SendGrid's WordPress Subscription Widget]({{root_url}}/for-developers/sending-email/wordpress-subscription-widget/)\n- [SendGrid's WordPress Integration FAQ]({{root_url}}/for-developers/sending-email/wordpress-faq/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/wordpress-subscription-widget.md",
    "content": "---\nst:\n  published_at: 2016-07-25\n  type: [integrate]\nseo:\n  title: WordPress Subscription Widget\n  description: Learn how to send your WordPress email through SendGrid.\n  keywords: WordPress, SendGrid, integrate, plugin, subscription widget\ntitle: WordPress Subscription Widget\ngroup: plugins\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\n## What is the Subscription Widget\n\nSendGrid’s WordPress Subscription Widget makes it easy for people visiting your WordPress site to subscribe to your marketing emails, such as any newsletters, announcements, or promotional offers you may send. Upon signup, they’ll automatically receive an opt-in email allowing them to confirm their desire to begin receiving your emails. This confirmation constitutes “double opt-in,” a deliverability best practice.\n\n## Installing the Subscription Widget\n\n### Requirements\n\n- PHP version >= 5.6 and <= 7.1. Installing this plugin on PHP versions 5.3 and earlier will cause your website to break. Installation on PHP versions 5.4 and 5.5 will work but it is not recommended.\n- To send emails through SMTP you need to install the [Swift Mailer plugin](https://wordpress.org/plugins/swift-mailer/).\n- If the `wp_mail()` function has been declared by another plugin that you have installed, you won't be able to use the SendGrid plugin.\n\n### Automatically Install the SendGrid Plugin from the WordPress Admin Page\n\n1. After logging into your WordPress account, navigate to **Plugins** and click **Add New**.\n2. Search for \"SendGrid Plugin\" and click **Install Now**\n3. Activate the plugin from the **Plugins** menu in WordPress or from the plugin installation screen.\n4. [Create a SendGrid account](http://sendgrid.com/partner/wordpress) on the WordPress Partner's Page\n5. Navigate to **Settings**, select **SendGrid Settings**, and enter your SendGrid credentials.\n\n### Manually Install the SendGrid Plugin by Uploading the SendGrid Plugin ZIP File\n\n1. Upload the WordPress SendGrid Plugin to the **/wp-contents/plugins/** folder.\n2. Activate the plugin from the **Plugins** menu in WordPress.\n3. [Create a SendGrid account](http://sendgrid.com/partner/wordpress) on the WordPress Partner's Page\n4. Navigate to **Settings**, select **SendGrid Settings**, and enter your SendGrid credentials.\n\n## Configuring the SendGrid Subscription Widget in WordPress\n\nTo set up the subscription widget from the WordPress interface, open the SendGrid WordPress plugin page, navigate to **Settings**, and click on the tab labeled **Subscription Widget**.\n\n### Configuring Your Credentials\n\nTo enable the Subscription Widget, you’ll first need an API key to authenticate your access to SendGrid services. If you’ve already set up the General settings for the plugin, you may choose to use the same API key by checking the “Use same authentication as transactional” option.\n\nAlternatively, you may create a separate API key specifically for uploading contacts from the Subscription Widget. We recommend creating this API Key dedicated to your WordPress plugin with only the [minimum permissions]({{root_url}}/for-developers/sending-email/wordpress-faq/) necessary to perform the plugin's tasks. This is a security best practice that prevents someone who might obtain your API Key from accessing all areas of your account. For a more detailed discussion of the benefits of API Key permissions, please see our documentation on [API Keys]({{root_url}}/ui/account-and-settings/api-keys/).\n\nTo create a dedicated API Key for your plugin, log into your SendGrid account, navigate to **Settings** in the lefthand sidebar, and click on **API Keys**. You can learn more about API Keys and how to create them [here]({{root_url}}/ui/account-and-settings/api-keys/).\n\n![]({{root_url}}/images/wp_subscription_widget_1.png)\n\n### Choosing Your Marketing Campaigns Recipient List\n\nAfter you set up a valid API key you must choose a specific list where your new contacts will be stored.\n\n![]({{root_url}}/images/wp_subscription_widget_2.png)\n\nIf you don't have a list set up for your signups from the Subscription Widget, open your SendGrid Dashboard, click on **Marketing Campaigns** in the sidebar, then select **Contacts** and [create a new list]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/).\n\n![]({{root_url}}/images/wp_subscription_widget_2_1.png)\n\n### Configuring Your Subscription Widget Form\n\nOnce you have selected the contact list to which you would like your new signups to be uploaded, simply complete the form to reflect your preferences. You can decide whether you’ll include first and last names on your signup form and whether they’ll be required. You can also craft the subject line and content of the opt-in confirmation email. Lastly, you’ll be able to choose the page your new signups see upon clicking the confirmation link within the opt-in confirmation email.\n\n<call-out>\n\nNote: The default text [my site name] is **not** a substitution tag. You should replace the text within the \"Signup email subject\" field with your entire desired subject text.\n\n</call-out>\n\n![]({{root_url}}/images/wp_subscription_widget_3.png)\n\nWhen writing the content for your signup confirmation email, you can choose between either HTML or Plain Text.\n\n![]({{root_url}}/images/signup_email_html_text.png)\n\nFinally, select the WordPress page that will be displayed to the user by selecting it from the drop down menu on the settings page.\n\n### Configuring Your Subscription Opt-In Confirmation Page\n\nIf you would like to create your own custom opt-in confirmation page, simply create a static WordPress page as you would for any other area of your site (for example, your \"About\" or \"Contact\" page).\n\n![]({{root_url}}/images/wp_plugin_confirmation_page.png)\n\nYou may use the following substitution tags when building your confirmation page:\n\n- **[sendgridSubscriptionFirstName]** - the first name of your new subscriber\n- **[sendgridSubscriptionLastName]** - the last name of your new subscriber\n- **[sendgridSubscriptionEmail]** - the email address for your new subscriber\n\nOnce you have created and saved this new page, it will appear in the dropdown menu alongside the \"Default Confirmation Page\" option.\n\n![]({{root_url}}/images/sign_up_confirmation_page_option.png)\n\nFor more information on how to create a new WordPress page, please visit the [WordPress documentation](https://codex.wordpress.org/Pages).\n\n### Form Customization\n\nIf you want to customize your subscription form, you can do so from the settings page. You can set labels for the \"First Name\", \"Last Name\", and \"Email\" fields in addition to the \"Subscribe\" button.\n\nYou can also adjust the padding surrounding the input fields and buttons.\n\n![]({{root_url}}/images/form_customization.png)\n\nIf you want additional or advanced configuration options (for example, CSS styles), you can use the following .css classes:\n\n- `sendgrid_mc_label` for the labels\n- `sendgrid_mc_input` for the input fields\n- `sendgrid_mc_button` for the subscribe button\n\nFor example, if you want your form to look like the following:\n\n![]({{root_url}}/images/example_form.png)\n\nYou would need to add the following to your CSS file:\n\n```css\n.sendgrid_mc_label {\n  color: #ff0000;\n}\n.sendgrid_mc_input {\n  border: 3px solid #000000 !important;\n}\n.sendgrid_mc_button {\n  background-color: #0000ff !important;\n}\n```\n\n### Testing Your Subscription Widget\n\nOnce you have configured your credentials and have selected a valid list for your new contacts, a form to test the subscription widget will appear at the bottom of the page of the Subscription Widget settings tab. You can test the subscription process by entering an email address and clicking **Test**.\n\n![]({{root_url}}/images/wp_subscription_widget_4.png)\n\nThe opt-in confirmation email you configured for the subscription widget will be sent to the test email address with a confirmation link. After clicking the confirmation link, your email address will be uploaded to your contacts within Marketing Campaigns and you will be redirected to the confirmation page that you specified in the subscription widget settings.\n\n![]({{root_url}}/images/wp_subscription_widget_5.png)\n\n### Using Your Subscription Widget\n\nTo display the widget on your website, navigate to the widgets page in WordPress and, using drag and drop, add it to the section of your page where you would like it to be displayed. Remember that only the \"email\" field is required by default, but you may include the first and last name fields.\n\n![]({{root_url}}/images/wp_subscription_widget_6.png)\n\nIf you would like to add the “First Name” and “Last Name” fields, and require users to fill these fields when subscribing to your emails, simply navigate to the Subscription Widget tab, and select **Settings**.\n\n![]({{root_url}}/images/wp_sub_widget_example.png)\n\nYou may also configure your installation of the subscription widget by defining specific SendGrid settings as global variables within the wp-config.php file. See the next section for a list of specific settings and the corresponding PHP required to add those settings to the wp-config.php file.\n\n## Manually Configuring Your Subscription Widget (Advanced)\n\nYou can manually configure your subscription widget by defining your settings within the wp-config.php file. **It is important to note that the information presented below refers to the same configuration steps previously described.** There is no added functionality that comes with manually editing your wp-config.php file, it is simply an alternative method of changing the same settings.\n\nContinue reading below for examples of what PHP should be included in your wp-config.php file to configure your subscription widget.\n\n### Manually Configuring Your Credentials In wp-config.php (Advanced)\n\nYou can use an API key to authenticate when integrating with the SendGrid WordPress Subscription Widget\n\nYou must set the Mail Send permissions to FULL ACCESS, Stats to READ ACCESS and Template Engine to READ or FULL ACCESS when creating the API Key, so you can send emails and see statistics on wordpress. For more information about API Key Permissions, click [here]({{root_url}}/ui/account-and-settings/api-keys/).\n\n### Credentials Settings for the SendGrid WordPress Subscription Widget\n\n- **API Key**: `define('SENDGRID_API_KEY', 'sendgrid_api_key');`\n\n  Your SendGrid API Key.\n\n### Manually Configuring Your Email Settings (Advanced)\n\n### Email Settings for the SendGrid WordPress Subscription Widget\n\n- **Send Method**: `define('SENDGRID_SEND_METHOD', 'api');` - The method used to deliver email. Can be either SMTP or the Web API. SMTP can only be used if the Swift Mailer plugin is installed.\n\n- **From name**: `define('SENDGRID_FROM_NAME', 'Example Name');` - The name of the sender.\n\n- **From email**: `define('SENDGRID_FROM_EMAIL', 'from_email@example.com');` - The email address of the sender.\n\n- **Reply to email**: `define('SENDGRID_REPLY_TO', 'reply_to@example.com');` - The email address that will populate the \"reply to\" field when recipients click the \"reply\" button.\n\n- **Categories**: `define('SENDGRID_CATEGORIES', 'category_1,category_2');` - Any [categories]({{root_url}}/ui/analytics-and-reporting/categories/) that you would like to tag your WordPress emails with.\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n- **Template**: `define('SENDGRID_TEMPLATE', 'templateID');` - The template that you would like to apply to your WordPress emails.\n\n- **Content**: `define('SENDGRID_CONTENT_TYPE', 'html');` - Denotes the type of data included in your email. Can be \"plaintext\" or \"html\".\n\n### Manually Configuring Your Widget Settings (Advanced)\n\n### Widget Settings\n\n- **Marketing Campaigns API Keys**: `define('SENDGRID_MC_API_KEY', 'sendgrid_mc_api_key');` - Your API Key generated to authenticate use of the Marketing Campaigns API.\n\n- **Use the same authentication as for sending emails ('true' or 'false':)**: `define('SENDGRID_MC_OPT_USE_TRANSACTIONAL', 'false');` - Indicates if your API Key used to authenticate sending emails should also be used when adding new contacts via the subscription widget.\n\n- **Contact list ID**: `define('SENDGRID_MC_LIST_ID', 'listID');`- The ID of the contact list that you would like your new subscribers to be added to.\n\n  To find your list ID, navigate to **Marketing Campaigns**, then click **Contacts**. Click on the list you would like to use. When viewing the list, the last 6 digits of the URL make up the list ID.\n\n* **Display the first and last name fields ('true' or 'false')**: `define('SENDGRID_MC_OPT_INCL_FNAME_LNAME', 'true');` - Indicates whether you want to display fields for your subscribers to enter both their first and last names on the subscription form.\n\n* **First and last name fields are required ('true' or 'false')**: `define('SENDGRID_MC_OPT_REQ_FNAME_LNAME', 'true');` - Indicates whether you want to require your subscribers to submit both their first and last names on the subscription form.\n\n* **Signup confirmation email subject**: `define('SENDGRID_MC_SIGNUP_EMAIL_SUBJECT', 'Confirm subscription');`\n\n* **Signup confirmation email content**: `define('SENDGRID_MC_SIGNUP_EMAIL_CONTENT', '&lta href=\"%confirmation_link%\"&gtclick here&lt/a&gt');`\n\n* **Signup confirmation page ID**: `define('SENDGRID_MC_SIGNUP_CONFIRMATION_PAGE', 'page_id');`\n\n  The WordPress page ID of the page you would like to link users to when confirming their subscription.\n\n  To find your page ID, log into your WordPress account and click **Pages** in the left hand nav of your dashboard. Select your confirmation page. In the URL you will see the text \"post=XX\" where XX represents your page ID.\n\n* **First Name Label**: `define('SENDGRID_MC_FIRST_NAME_LABEL', 'First Name');`\n\n* **Last Name Label**: `define('SENDGRID_MC_LAST_NAME_LABEL', 'Last Name');`\n\n* **Email Label**: `define('SENDGRID_MC_EMAIL_LABEL', ‘Email’);`\n\n* **Subscribe Label**: `define('SENDGRID_MC_SUBSCRIBE_LABEL', 'Subscribe');`\n\n## Additional Resources\n\n- [SendGrid's WordPress Plugin]({{root_url}}/for-developers/sending-email/wordpress-plugin/)\n- [SendGrid's WordPress Integration FAQ]({{root_url}}/for-developers/sending-email/wordpress-faq/)\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-for-gravity-forms-submissions.md",
    "content": "---\nseo:\n  title: Sending New Emails via SendGrid For New Gravity Forms Submissions\n  description: Learn how to send an email whenever you receive a new Gravity Form submission.\n  keywords: integration, tutorial, Gravity Forms Submissions, SendGrid, Zapier\ntitle: Sending New Emails via SendGrid For New Gravity Forms Submissions\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you want to send a new SendGrid email every time you receive a Gravity Form submission, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* a [Gravity Forms](http://www.gravityforms.com) account\n* a [SendGrid](http://sendgrid.com) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo connect your Gravity Forms account to Zapier, you will need the Gravity Forms plugin with the Zapier add-on installed. You will also need a form created in Gravity forms. To get started with Gravity forms, and for information on creating forms and installing the add-ons that you will need, check [here](https://www.gravityhelp.com/documentation/article/getting-started/). Information for getting started with Gravity Forms on Zapier can be found [here](https://zapier.com/help/gravity-forms/#how-get-started-gravity-forms).\n\nTo link your Gravity Forms to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send new emails via SendGrid for new Gravity Forms submissions](https://zapier.com/zapbook/zaps/4782/send-new-emails-via-sendgrid-for-new-gravity-forms-submissions/).\n\n1. Follow the directions on the first step of the Zap to connect your Gravity Forms account to Zapier.\n2. Choose your SendGrid account from the list of accounts, or connect a new account.\n3. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n4. Using fields from Gravity Forms, create, and customize the **To**, **From**, and **Subject** email message that the Zap will send.\n\n![Email entry](https://api.monosnap.com/rpc/file/download?id=5fpmLkDdv82LPlTeYCyhUE7bsFeSIE)\n\n5. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, new Gravity Forms submissions will automatically send an SendGrid email.\n\n<call-out>\n\nIf you ever want to change this Gravity Forms and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.\n\n</call-out>\n\nYou can also check out all that’s possible with [Gravity Forms on Zapier](https://zapier.com/zapbook/gravity-forms/), and other ways to connect [Gravity Forms and SendGrid](https://zapier.com/zapbook/gravity-forms/sendgrid).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-for-new-webhook-data.md",
    "content": "---\nseo:\n  title: Send Emails Through SendGrid For New Caught Webhook Data\n  description: Learn how to receive a SendGrid email for a new Event Webhook post by using Zapier.\n  keywords: integrate, tutorial, Event Webhook, SendGrid, Zapier\ntitle: Send Emails Through SendGrid For New Caught Webhook Data\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\nIf you want to receive a SendGrid email every time you receive a new Event Webhook post, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* a [SendGrid](http://sendgrid.com) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo establish a Webhook on Zapier, you will need only your Zapier account. Zapier will set up a custom Webhook url, for information on how to get started using these Webhooks, check [here](https://zapier.com/help/webhooks/#how-get-started-webhooks-zapier).\n\nTo link your Webhooks on Zapier to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send emails through SendGrid for new caught Webhook data](https://zapier.com/zapbook/zaps/4784/send-emails-through-sendgrid-for-new-caught-webhook-data/).\n\n1. Zapier will automatically generate a Webhook for you to send requests to. When you have this, click **Ok, continue**.\n2. Choose whether or not you wish to specify a **Child Key** for your Webhook. Click **Save + Continue**.\n3. Choose your SendGrid account from the list of accounts or connect a new account.\n4. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n5. Using fields from the Webhook, create and customize the **To**, **From**, and **Subject** email message that the Zap will send.\n\n![Email entry](https://api.monosnap.com/rpc/file/download?id=nzgrqhMuvZtnagf2ns64uWZkF8P7od)\n\n6. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, new Webhook payloads will automatically cause a corresponding SendGrid email to be sent.\n\n*Note: if you ever want to change this Zapier and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.*\n\nYou can also check out all that’s possible with [Webhooks on Zapier](https://zapier.com/zapbook/webhook/) and other ways to connect [Webhooks and SendGrid](https://zapier.com/zapbook/webhook/sendgrid).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-for-postgre-sql-row-matches.md",
    "content": "---\nseo:\n  title: Sending SendGrid Emails For New PostgreSQL Custom Query Row Matches\n  description: Learn how to use Zapier to send mail through SendGrid when new PostgreSQL rows are created.\n  keywords: integrate, tutorial, PostgreSQL, SendGrid, Zapier\ntitle: Sending SendGrid Emails For New PostgreSQL Custom Query Row Matches\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you want to send emails automatically through SendGrid when new custom PostgreSQL rows are created, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* a [PostgreSQL](http://www.postgresql.com) account\n* a [SendGrid](http://sendgrid.com) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo connect your PostgreSQL account to Zapier you will need an active PostgreSQL, and a database that you wish to pull data from. To get started with PostgreSQL, including information on how to install the program and how to create a database, go [here](http://www.postgresql.org/docs/9.4/static/tutorial-start.html). You can learn more about getting started with PostgreSQL on Zapier, [here](https://zapier.com/help/postgresql/#how-get-started-postgresql).\n\nTo link your PostgreSQL to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send SendGrid emails for new PostgreSQL custom query row matches](https://zapier.com/zapbook/zaps/4781/send-sendgrid-emails-for-new-postgresql-custom-query-row-matches/).\n\n1. Choose your PostgreSQL account from the list of accounts, or connect a new account.\n2. To connect a new account, you will need the IP address or hostname of where your database is. Input this data in the **Host** field, indicate if you use an alternate **Port**, and fill in the **Database** and **Username** fields with the appropriate data. You may also need to fill out the **Password** field if your database user requires it.\n\n![Connecting PostgreSQL](https://api.monosnap.com/rpc/file/download?id=OTK4dRBb1xZSxiiBDQXS4owNzpOlOf)\n\n3. Create or fill in the **Custom Query** you wish to use. Click **Save + Continue**.\n\n![PostgreSQL selection](https://api.monosnap.com/rpc/file/download?id=BFLSEIzfoiaq6RfAGiP6wJ7Tj7OzaH)\n\n4. Choose your SendGrid account from the list of accounts, or connect a new account.\n5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n6. Using fields from PostgreSQL, create and customize the email message that the Zap will send. The required fields for this step are **To**, **From**, and **Subject**, but you may fill in further fields if you desire to do so.\n\n![Email creation](https://api.monosnap.com/rpc/file/download?id=PMa2LUCYaqGcvdy9pPUtMhtrUtp5nW)\n\n7. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, a new SendGrid email will be sent whenever your custom query is matched in your PostgreSQL.\n\n<call-out>\n\nIf you ever want to change this PostgreSQL and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.\n\n</call-out>\n\nYou can also check out all that’s possible with [PostgreSQL on Zapier](https://zapier.com/zapbook/postgresql/), and other ways to connect [PostgreSQL and SendGrid](https://zapier.com/zapbook/postgresql/sendgrid).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-from-google-sheet-rows.md",
    "content": "---\nseo:\n  title: Sending SendGrid Emails From New Google Sheets Rows\n  description: Learn how to use Zapier to automatically send mail when you update a Google Sheets document.\n  keywords: integrate, tutorial, Google Sheets, SendGrid, Zapier\ntitle: Sending SendGrid Emails From New Google Sheets Rows\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you want to automatically send emails through your SendGrid account when you update your Google Sheets spreadsheets, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* a [Google Docs](https://docs.google.com/) account\n* a [SendGrid](http://sendgrid.com) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo connect your Google Sheets to Zapier, make sure [you have created a new sheet for this purpose](http://www.gcflearnfree.org/googlespreadsheets/8.2). You can learn more about getting started with Google Sheets on Zapier, [here](https://zapier.com/help/google-sheets/#how-get-started-google-sheets-zapier).\n\nTo link your Google Sheets to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send SendGrid emails from new Google Sheets rows](https://zapier.com/zapbook/zaps/4783/send-sendgrid-emails-from-new-google-sheets-rows/).\n\n1. Choose your Google Sheets account from the list of accounts, or connect a new account.\n2. Choose the **Spreadsheet** and the **Worksheet** you wish to use.\n\n![Google Sheets pages](https://api.monosnap.com/rpc/file/download?id=KXMJ5qmwH4piFKBkBZXiTbMFu2cTog)\n\n3. Choose your SendGrid account from the list of accounts, or connect a new account.\n4. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n5. Using fields from Google Sheets, create, and customize the **To**, **From**, and **Subject** email message that the Zap will send.\n\n![Email content](https://api.monosnap.com/rpc/file/download?id=gmK4I07JxAKFtgoEBhJBwkdUh4fD7i)\n\n6. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, newly updated rows in Google Sheets will send corresponding emails through your SendGrid account.\n\n<call-out>\n\nIf you ever want to change this Google Sheets and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.\n\n</call-out>\n\nYou can also check out all that’s possible with [Google Sheets on Zapier](https://zapier.com/zapbook/google-sheets/), and other ways to connect [Google Sheets and SendGrid](https://zapier.com/zapbook/google-sheets/sendgrid).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-to-tagged-infusionsoft-contacts.md",
    "content": "---\nseo:\n  title: Sending Emails From SendGrid to Tagged Infusionsoft Contacts\n  description: Learn how to use Zapier to send email through your SendGrid account to your Infusionsoft contacts.\n  keywords: integrate, tutorial, Infusionsoft, contacts, SendGrid, Zapier\ntitle: Sending Emails From SendGrid to Tagged Infusionsoft Contacts\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you want to send emails automatically from your SendGrid account to your Infusionsoft contacts, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* an [Infusionsoft](http://www.infusionsoft.com) account\n* a [SendGrid](http://sendgrid.com/) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo connect your Infusionsoft to Zapier you will need an active Infusionsoft account. To get started with Infusionsoft, go [here](http://help.infusionsoft.com/userguides/get-started). You can learn more about getting started with Infusionsoft on Zapier, [here](https://zapier.com/help/infusionsoft/#how-get-started-infusionsoft).\n\nTo connect your Infusionsoft account to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send emails from SendGrid to tagged Infusionsoft Contacts](https://zapier.com/zapbook/zaps/2232/send-an-email-from-sendgrid-when-you-tag-a-contact-in-infusionsoft/).\n\n1. Choose your Infusionsoft account from the list of accounts, or connect a new account.\n2. To connect a new Infusionsoft account to your Zapier, simply login and click **Allow** on the pop-up window in the Zap when prompted.\n\n![Infusionsoft login](http://cl.ly/image/2x3l3d2e0t3o/Image%202015-10-30%20at%2011.30.29%20AM.png)\n\n3. Choose your SendGrid account from the list of accounts, or connect a new account.\n4. You’ll then need to choose the Tag name you’d like the Zap to monitor.\n\n![Infusionsoft Tag](http://cl.ly/image/3N1O0g0c3r3K/Image%202015-10-30%20at%2011.33.06%20AM.png)\n\n5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n6. Using fields from Infusionsoft, create and customize the **To**, **From**, and **Subject** email message that the Zap will send.\n7. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, tagged contacts in Infusionsoft will automatically receive emails via SendGrid.\n\n<call-out>\n\nIf you ever want to change this Infusionsoft and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.\n\n</call-out>\n\nYou can also check out all that’s possible with [Infusionsoft on Zapier](https://zapier.com/zapbook/infusionsoft/), and other ways to connect [Infusionsoft and SendGrid](https://zapier.com/zapbook/infusionsoft/sendgrid/).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zapier-sending-when-new-firebase-child-records-added.md",
    "content": "---\nseo:\n  title: Sending SendGrid Email When New Firebase Child Records Are Added\n  description: Learn how to use Zapier to send email when new Firebase Child Records Are Added.\n  keywords: integrate, tutorial, Firebase, Child Records, SendGrid, Zapier\ntitle: Sending SendGrid Email When New Firebase Child Records Are Added\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nIf you want to send a SendGrid email when you add new Firebase child records, you can do that using [Zapier](http://zapier.com).\n\nYou will need:\n\n* a [Firebase](http://www.firebase.com) account\n* a [SendGrid](http://sendgrid.com) account\n* a [Zapier](http://zapier.com) account\n\n## Steps\n\n1. [Getting your accounts ready](#ready)\n2. [Connecting your accounts](#connect)\n\n### Getting your accounts ready<a name=\"ready\"></a>\n\n\nTo connect your Firebase account you will need an active Firebase account. To get started with Firebase, go [here](https://www.firebase.com/tutorial/). You can learn more about getting started with Firebase on Zapier, [here](https://zapier.com/help/firebase/#how-get-started-firebase).\n\nTo link your Firebase to SendGrid, you must have an active SendGrid account. To learn more about getting started with SendGrid basics, start [here]({{root_url}}/api-reference/). For more information about getting started with SendGrid on Zapier, go [here](https://zapier.com/help/sendgrid/#how-get-started-sendgrid).\n\n### Connecting your accounts<a name=\"connect\"></a>\n\nClick here to [Send SendGrid email when new Firebase child records are added](https://zapier.com/zapbook/zaps/3291/send-emails-with-sendgrid-when-new-firebase-child-records-are-added/).\n\n1. Choose your Firebase account from the list of accounts, or connect a new account.\n2. To connect a new Firebase account to your Zapier, you will need to enter the name of the **Firebase instance** you wish to use, and the **Secret** to authenticate the connection. You can find your secret authentication under the Auth tab.\n\n![Credentials](https://api.monosnap.com/rpc/file/download?id=mHKxFy2GGk7HAi3GiaWCjnlHFL5AwM)\n\n![Secret](https://api.monosnap.com/rpc/file/download?id=qgDlpkBImMfmQgb8TeQCQEZXNK0wnc)\n\n3. Enter the **Path to Data** that you wish for the Zap to watch for child records.\n\n![Path to data](https://api.monosnap.com/rpc/file/download?id=ftCyfZYQCYwIxgDZ7m61vK9wcdU2F3)\n\n4. Choose your  account from the list of accounts, or connect a new account.\n5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials).\n\n![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8)\n\n6. Using fields from Firebase, create and customize the **To**, **From**, and **Subject** email message that the Zap will send.\n\n![Email entry](https://api.monosnap.com/rpc/file/download?id=z8bVdXOXSPszyLTNfBf0lhSYrPMlcP)\n\n7. Click **Save + Finish**.\n\nNow test the Zap to make sure it works. Once you’re satisfied with the results, new child records created in Firebase will send corresponding emails in SendGrid.\n\n<call-out>\n\nIf you ever want to change this Firebase and SendGrid integration, just go to [your Zapier dashboard](https://zapier.com/app/dashboard) and tweak anything you'd like.\n\n</call-out>\n\nYou can also check out all that’s possible with [Firebase on Zapier](https://zapier.com/zapbook/firebase/), and other ways to connect [Firebase and SendGrid](https://zapier.com/zapbook/firebase/sendgrid).\n"
  },
  {
    "path": "content/docs/for-developers/sending-email/zend.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Zend\nseo:\n  title: Send Email with Zend & SendGrid\n  description: View instructions on how to easily send email with Zend using SendGrid, by setting up setting up Zen's mail module.\nnavigation:\n  show: true\n---\n\nYou can directly integrate Zend's mail module with SendGrid to use our SMTP servers for outgoing messages.\n\n``` php\n<?php\nrequire_once '$HOME/sendgrid/Zend/library/Zend/Mail.php';\nrequire_once '/$HOME/sendgrid/Zend/library/Zend/Mail/Transport/Smtp.php';\n\n$smtpServer = 'smtp.sendgrid.net';\n$username = 'username';\n$api_key = 'api_key';\n\n$config = array('ssl' => 'tls',\n'port' => '587',\n'auth' => 'login',\n'username' => $username,\n'api_key' => $api_key);\n\n$transport = new Zend_Mail_Transport_Smtp($smtpServer, $config);\n\n$mail = new Zend_Mail();\n\n$mail->setFrom('sendeexampexample@example.com', 'Some Sender');\n$mail->addTo('email@example.com','Some Recipient');\n$mail->setSubject('Test Subject');\n$mail->setBodyText('This is the text of the mail using Zend.');\n\n$mail->send($transport);\n?>\n```\n\nIf you prefer a modular installation, then [check out Jurian Sluiman's SlmMail project at GitHub](https://github.com/juriansluiman/SlmMail.git).\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/analytics-with-keen-io.md",
    "content": "---\nseo:\n  title: Keen Integration\n  description: Analyze, Visualize, and Store SendGrid Email Event Data\n  keywords: Keen, integrate, event data, analytics\ntitle: Analyze, Visualize, and Store SendGrid Event Data with Keen\ngroup: partners\nweight: 142\nlayout: page\nnavigation:\n  show: true\n---\nThe SendGrid [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) lets you stream all [email events]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) directly to <a href=\"https://keen.io/users/signup?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs\">Keen</a> for real-time analysis and long term raw storage.\n\nIt only takes a couple of minutes to start streaming email event data from SendGrid to Keen, and once you do, you’ll get tools to create flexible email analytics and stunning dashboards.\n\n\n## \tSending Your SendGrid Data to Keen\n\n**Create a Keen and SendGrid account**\n\n1. Create a [Keen account](https://keen.io/users/signup?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs) if you don't already have one.\n1. Add a new project in the Keen UI for your SendGrid Email Event Data.\n1. Navigate to the Access tab and copy your Project ID and API Write Key.\n1. Create a [SendGrid account](https://sendgrid.com/user/signup).\n\n**Activate SendGrid's Event Notification App**\n\n1. Log into your SendGrid account.\n1. Click **Settings** from the left menu.\n1. Select [**Mail Settings**](http://app.sendgrid.com/settings/mail_settings) and then click **Event Webhook**.\n\n![SendGrid - Mail Settings - Event Webhook]({{root_url}}/images/keen/sendgrid_mailsettings_eventwebhook.png)\n\n### \tSet the HTTP POST URL\nThe HTTP Post URL is the endpoint where SendGrid will stream all of your email data.\n\n ```\n https://api.keen.io/3.0/projects/YOUR_KEEN_PROJECT_ID/email/sendgrid/1.0?api_key=YOUR_KEEN_API_WRITE_KEY\n ```\n1. Copy and paste the above URL into the HTTP POST URL field. Make sure to replace `YOUR_KEEN_PROJECT_ID` and `YOUR_KEEN_API_WRITE_KEY` with your Project ID and API Write Key available in the Access tab. Set Authorization Method to **None**.\n2. In the settings, select the events you want to post to Keen (why not all of them?). To do this, check **Select All** under **Events to be POSTed to your URL**. You can refer to SendGrid’s [event documentation]({{root_url}}/for-developers/tracking-events/event/) for more information on these events.\n\nThat’s it! Now, as your emails make their way through SendGrid, all of the event information will be posted to Keen. A new Event Collection, aptly named for each type of email event, will be created within your Keen Project.\n\n## \tTesting Your Integration\n\nTo test that everything is working, navigate to **Event Webhook Settings** in the SendGrid app and then click **\"Test Your Integration\"**. This will send sample email data from SendGrid into your Keen Project. In the Keen UI, navigate to the **Streams** tab to check for sample SendGrid data. After you've confirmed the data was sent, enable the Event Webhook and your SendGrid email data will now be sent to Keen in real-time.\n\n## Your Data: SendGrid Data Models\n\nIn the SendGrid app, navigate to **Mail Settings** and then select  **Event Webhook**. Each email event type that is selected will be recorded as a separate Event Collection in your Keen project. We recommended checking **Select All** to access full functionality of the Keen app’s reporting.\n\n The email events that are recorded are:\n\n- `email_bounce`\n- `email_click`\n- `email_deferred`\n- `email_delivered`\n- `email_dropped`\n- `email_group_resubscribe`\n- `email_group_unsubscribe`\n- `email_open`\n- `email_processed`\n- `email_spamreport`\n- `email_unsubscribe`\n\nAs SendGrid email data streams to Keen, it will be enhanced using Keen's [Data Enrichment](https://keen.io/docs/streams/data-enrichment-overview/) capabilities. Keen’s data enrichments turn IP addresses into geographic locations and break out timestamps, URLs, and user agent strings into more easy-to-use data such as `device type`, `day_of_the_week`, and URL `path`.\n\n_To explore each data model:_\n1. Log into your Keen account.\n1. Select your SendGrid Project and click **Streams**.\n1. In the search bar type in “email” to check out your data collections associated with SendGrid email data. You can click into an email event to view all of the different data you have to work with.\n\n<call-out>\n\nUse the property `message_id` or `singlesend_name` contained in each event to track a particular email across all of these possible actions. Similarly, you can follow a particular user's behavior via the `email` property.\n\n</call-out>\n\n\n## \tUsing the Data Explorer\n\n*To use the Data Explorer:*\n\n1. Log into your Keen account and then select your project.\n1. Select **Streams**.\n1. In the \"Event Streams\" search bar type in “email” to check out your data collections associated with SendGrid email data. A separate Event Collection, aptly named for each type of email event, is created within your Keen Project.\n\n![Keen Event Streams - SenGrid Email Event Data]({{root_url}}/images/keen/sendgrid_stream_new.png)\n\n4. Run some basic queries by selecting **Explorer** and entering `count` as the “Analysis Type,” select `email_delivered` as your “Collection Name,” and click “**Run Query**.\n\n![Explorer to Run Query]({{root_url}}/images/keen/sendgrid_basic_count_new.png)\n\nThe breadth of analysis you can do is pretty vast. [Here's a link](https://keen.io/docs/compute/) to read up on the types of queries you can do with Keen. Some example query types are sums, averages, min or max, funnels, and select_unique. Keen also offers a [step-by-step guide](https://www.keen.io/blog/how-to-build-sendgrid-email-marketing-dashboard-with-keenio) on creating queries for a SendGrid email marketing dashboard.\n\nFor some extra-pretty graphs and custom analyses here are some tips:\n\n- Adding an “Interval” (e.g. “daily”) will give you a line graph over time (Ex. Number of emails processed daily for the previous 30 days)\n- Include a “Group By” property (e.g. “campaign”)  to view results categorically\n- Use “Filters” to refine the scope of your query\n- Use the chart type drop down on the  upper right to choose how you view data: as an area graph, bar chart, column chart, table, [or more](https://keen.io/docs/data-visualizations/widgets/funnel-chart/)\n- Download a CSV of the data you found by clicking on the “Download CSV” button\n\n![Explorer Sample Query]({{root_url}}/images/keen/sendgrid_sample_query.png)\n\n## Save Your Query & Make Your First Dashboard\n\nDo you often run the same analysis on a regular basis, or want to be able to save a quick link to your work to revisit again sometime?\n\nOnce you’ve found the query you need, you can either copy the URL right from your browser’s address bar and share it with a colleague, or you can save the query and make yourself a dashboard with Keen.\n\nHere’s how:\n\n1. Save your query. Create your query in the Explorer and then click **Run**.\n2. After running the query, select **Save**.\n\n![Save Your Query]({{root_url}}/images/keen/sendgrid_saved_query_new.png)\n\nSaved queries are a super user-friendly way to revisit your favorite metrics. Rather than entering the same query parameters over and over again, queries can be shared with your teammates. Notice that your saved query can be edited and cloned.\n\nNext, you'll want to add your graph to a dashboard.\n1. Navigate to **Dashboards** and select **New Dashboard**.\n1. Name your dashboard.\n1. Add the query you saved by hovering over \"Add item\" and then dragging a metric chart into the dashboard. Select the saved query from a dropdown in the right hand ribbon.\n1. Click **Save** to save your Dashboard.\n\n![Add Query to Dashboard]({{root_url}}/images/keen/sendgrid_create_dashboard_new.png)\n\nCongratulations! You’ve created your first dashboard!\n\n## Embedding SendGrid Analytics Into Your App\nWith Keen, you will have access to all of your raw data for as long as you need it. An archive of all of your email data is created, which means you will have access to your historical data and can query for past user behavior.\n\nJust like SendGrid, Keen is 100% powered by APIs. This means you can embed rich analytics anywhere you can write code.\n\nMany customers find it useful to embed analytics into their products for their customers or customer success teams. Here’s a link to our [Customer Facing Analytics Guide](https://keen.io/docs/visualize/customer-facing-analytics/) that will give you step-by-step instructions on how to embed your SendGrid analytics into your product. Some customers also take advantage of Keen's [S3 Streaming](https://keen.io/docs/streams/extended-functionality/amazon-s3/) capabilities to write a copy of all their data to AWS.\n\n\n## \tAdditional Resources:\n\n- Check out [Keen's API reference](https://keen.io/docs/api/) to learn about the full capability of the platform.\n- Build a campaign and email marketing dashboard. Create and display your email metrics using [Keen's Data Viz Library](http://keen.io/docs/data-visualizations/create-dashboard/).\n- SendGrid's complete [Event Webhook Documentation]({{root_url}}/for-developers/tracking-events/event/) is a great resource on SendGrid email events. As you start to do more analysis, it's worth a read. You can even skip a lot of the sections because we've done much of the work for you.\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/csharp-code-example.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Event Webhook C# Code Example\ngroup: code-examples\nnavigation:\n  show: true\n---\n\n## \tParse Webhook\n\nIn this example, we want to parse all emails at *address*@email.sendgrid.biz and post the parsed email to http://sendgrid.biz/upload\n\nGiven this scenario, the following are the parameters you would set at the [Parse API settings page](https://sendgrid.com/developer/reply):\n\n```\nHostname: email.sendgrid.biz\n```\n\n```\nURL: http://sendgrid.biz/upload\n```\n\n Put this C\\# model in your models folder:\n\n```csharp\n/// <summary>\n/// A model with the data format of the Inbound Parse API's POST\n/// </summary>\npublic class Email\n{\n  /// <summary>\n  /// The Domain Keys Identified Email code for the email\n  /// </summary>\n  public string Dkim { get; set; }\n\n  /// <summary>\n  /// The email address that the email was sent to\n  /// </summary>\n  public string To { get; set; }\n\n  /// <summary>\n  /// The HTML body of the email\n  /// </summary>\n  public string Html { get; set; }\n\n  /// <summary>\n  /// The email address the email was sent from\n  /// </summary>\n  public string From { get; set; }\n\n  /// <summary>\n  /// The Text body of the email\n  /// </summary>\n  public string Text { get; set; }\n\n  /// <summary>\n  /// The Ip address of the sender of the email\n  /// </summary>\n  public string SenderIp { get; set; }\n\n  /// <summary>\n  /// A JSON string containing the SMTP envelope. This will have 2 variables: to, which is an array of recipients, and from, which is the return path for the message.\n  /// </summary>\n  public string Envelope { get; set; }\n\n  /// <summary>\n  /// Number of attachments included in email\n  /// </summary>\n  public int Attachments { get; set; }\n\n  /// <summary>\n  /// The subject of the email\n  /// </summary>\n  public string Subject { get; set; }\n\n  /// <summary>\n  /// A JSON string containing the character sets of the fields extracted from the message.\n  /// </summary>\n  public string Charsets { get; set; }\n\n  /// <summary>\n  /// The results of the Sender Policy Framework verification of the message sender and receiving IP address.\n  /// </summary>\n  public string Spf { get; set; }\n}\n```\n\n To test this, we send an email to example@example.com, and put the following method in our ApiController. Note: Don't forget the attribute.\n\n```csharp\n// POST api/inbound\n[HttpPost]\npublic async Task<HttpResponseMessage> Post()\n{\n\tvar root = HttpContext.Current.Server.MapPath(\"~/App_Data\");\n\tvar provider = new MultipartFormDataStreamProvider(root);\n\tawait Request.Content.ReadAsMultipartAsync(provider);\n\n\tvar email = new Email\n\t{\n\t\tDkim = provider.FormData.GetValues(\"dkim\").FirstOrDefault(),\n\t\tTo = provider.FormData.GetValues(\"to\").FirstOrDefault(),\n\t\tHtml = provider.FormData.GetValues(\"html\").FirstOrDefault(),\n\t\tFrom = provider.FormData.GetValues(\"from\").FirstOrDefault(),\n\t\tText = provider.FormData.GetValues(\"text\").FirstOrDefault(),\n\t\tSenderIp = provider.FormData.GetValues(\"sender_ip\").FirstOrDefault(),\n\t\tEnvelope = provider.FormData.GetValues(\"envelope\").FirstOrDefault(),\n\t\tAttachments = int.Parse(provider.FormData.GetValues(\"attachments\").FirstOrDefault()),\n\t\tSubject = provider.FormData.GetValues(\"subject\").FirstOrDefault(),\n\t\tCharsets = provider.FormData.GetValues(\"charsets\").FirstOrDefault(),\n\t\tSpf = provider.FormData.GetValues(\"spf\").FirstOrDefault()\n\t};\n\n\t// The email is now stored in the email variable\n\n\treturn new HttpResponseMessage(HttpStatusCode.OK);\n}\n```\n\nThe above code used the following `using`'s\n\n```csharp\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Web.Http;\n```\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/event-kit.md",
    "content": "---\nseo:\n  title: SendGrid EventKit\n  description: Learn how to better track your data with the open source SendGrid EventKit.\n  keywords: event, store, clicks, opens, download, heroku, eventkit, event, kit, database, post, activity\ntitle: SendGrid EventKit\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid's [Event Notification]({{root_url}}/for-developers/tracking-events/event/) feature allows you to receive POST data for your email events such as Opens, Clicks, Deliveries, and much more. However, traditionally this feature requires that you set up a separate database on your own to receive and store this posted data. While highly customizable, this method can be development and time intensive.\n\nOur open source EventKit app alleviates the hassle of needing to set up an endpoint on your own domain, and provides a simple yet powerful user interface to view and sort your SendGrid event data. Check out the videos below to walk you through the setup and configuration of EventKit.\n\n[Click here](https://github.com/sendgrid/eventkit-rails) to visit the EventKit GitHub repository.\n\n\n## Learn how to install the Event Kit app using a free [Heroku](https://www.heroku.com/) instance by watching this step-by-step video:\n\n<iframe src=\"https://player.vimeo.com/video/167121552\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n\n## Once you have EventKit set up, watch this video to learn more about the features within as well as how to navigate the user interface.\n\n<iframe src=\"https://player.vimeo.com/video/179804115\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/event.md",
    "content": "---\nseo:\n  title: Event Webhook Reference\n  description: Full Event Webhook event list and descriptions, event examples, and the objects each event contains.\n  keywords: event webhook API reference, reference, events, event webhook\ntitle: Event Webhook Reference\ngroup: reference-troubleshooting\nweight: 90\nlayout: page\nnavigation:\n  show: true\n---\n\n## Security Features\n\nWe recommend securing the Event Webhook data using our Signed Event Webhook, OAuth 2.0, or both. For more information about Event Webhook security, see [Getting Started with the Event Webhook Security Features]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook-security-features/).\n\nSecurity features are not required for setup, but they are highly recommended for any use of the Event Webhook beyond initial testing.\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n## Events\n\nEvents are generated when email is processed by SendGrid and email service providers. There are 2 types of events - delivery and engagement events. Delivery events indicate the status of email delivery to the recipient. Engagement events indicate how the recipient is interacting with the email.\n\nHere is an event response that includes an example of each type of event:\n\n```json\n[\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"processed\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"deferred\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"response\": \"400 try again later\",\n    \"attempt\": \"5\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"delivered\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"response\": \"250 OK\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"open\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"useragent\": \"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n    \"ip\": \"255.255.255.255\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"click\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"useragent\": \"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n    \"ip\": \"255.255.255.255\",\n    \"url\": \"http://www.sendgrid.com/\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"bounce\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"reason\": \"500 unknown recipient\",\n    \"status\": \"5.0.0\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"dropped\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"reason\": \"Bounced Address\",\n    \"status\": \"5.0.0\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"spamreport\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"unsubscribe\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\"\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"group_unsubscribe\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"useragent\": \"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n    \"ip\": \"255.255.255.255\",\n    \"url\": \"http://www.sendgrid.com/\",\n    \"asm_group_id\": 10\n  },\n  {\n    \"email\": \"example@test.com\",\n    \"timestamp\": 1513299569,\n    \"smtp-id\": \"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n    \"event\": \"group_resubscribe\",\n    \"category\": \"cat facts\",\n    \"sg_event_id\": \"sg_event_id\",\n    \"sg_message_id\": \"sg_message_id\",\n    \"useragent\": \"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n    \"ip\": \"000.000.000.000\",\n    \"url\": \"http://www.sendgrid.com/\",\n    \"asm_group_id\": 10\n  }\n]\n```\n\n### Delivery events\n\nDelivery events include processed, dropped, delivered, deferred, and bounce.\n\n<table class=\"table\">\n  <colgroup>\n    <col class=\"table-col-100\">\n    <col class=\"table-col-200\">\n    <col>\n  </colgroup>\n   <tbody>\n      <tr>\n         <th>Event</th>\n         <th>Description</th>\n         <th>Example webhook response</th>\n      </tr>\n      <tr>\n         <td><a name=\"processed\"></a>Processed</td>\n         <td>Message has been received and is ready to be delivered.</td>\n         <td>\n```raw\n[\n  {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"pool\": {\n            \"name\": \"new_MY_test\",\n            \"id\": 210\n        },\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"processed\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"rbtnWrG1DVDGGGFHFyun0A==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.000000000000000000000\"\n  }\n]\n```\n        </td>\n      </tr>\n      <tr>\n         <td><a name=\"dropped\"></a>Dropped</td>\n         <td>You may see the following drop reasons: Invalid SMTPAPI header, Spam Content (if Spam Checker app is enabled), Unsubscribed Address, Bounced Address, Spam Reporting Address, Invalid, Recipient List over Package Quota</td>\n         <td>\n```raw\n[\n  {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"dropped\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"zmzJhfJgAfUSOW80yEbPyw==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"reason\":\"Bounced Address\",\n      \"status\":\"5.0.0\"\n  }\n]\n```\n        </td>\n      </tr>\n      <tr>\n         <td><a name=\"delivered\"></a>Delivered</td>\n         <td>Message has been successfully delivered to the receiving server.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"delivered\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"rWVYmVk90MjZJ9iohOBa3w==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"response\":\"250 OK\"\n   }\n]\n```\n      </td>\n      </tr>\n      <tr>\n         <td><a name=\"deferred\"></a>Deferred</td>\n         <td>Receiving server temporarily rejected the message.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"deferred\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"t7LEShmowp86DTdUW8M-GQ==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"response\":\"400 try again later\",\n      \"attempt\":\"5\"\n   }\n]\n```\n    </td>\n      </tr>\n      <tr>\n         <td><a name=\"bounce\"></a>Bounce</td>\n         <td>Receiving server could not or would not accept mail to this recipient permanently. If a recipient has previously unsubscribed from your emails, the message is dropped.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"bounce\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"6g4ZI7SA-xmRDv57GoPIPw==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"reason\":\"500 unknown recipient\",\n      \"status\":\"5.0.0\",\n      \"type\":\"bounce\"\n   }\n]\n```\n            </td>\n      </tr>\n      <tr>\n         <td><a name=\"blocked\"></a>Blocked</td>\n         <td>Receiving server could not or would not accept the message temporarily. If a recipient has previously unsubscribed from your emails, the message is dropped.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"bounce\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"6g4ZI7SA-xmRDv57GoPIPw==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"reason\":\"500 unknown recipient\",\n      \"status\":\"5.0.0\",\n      \"type\":\"blocked\"\n   }\n]\n```\n</td>\n      </tr>\n   </tbody>\n</table>\n\n### Engagement events\n\nEngagement events include open, click, spam report, unsubscribe, group unsubscribe, and group resubscribe.\n\n<table class=\"table\">\n  <colgroup>\n  <col class=\"table-col-100\">\n  <col class=\"table-col-200\">\n  <col>\n  </colgroup>\n   <tbody>\n      <tr>\n         <th>Event</th>\n         <th>Description</th>\n         <th>Example webhook response</th>\n      </tr>\n      <tr>\n         <td><a name=\"open\"></a>Open</td>\n         <td>Recipient has opened the HTML message. Open Tracking needs to be enabled for this type of event.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"open\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"FOTFFO0ecsBE-zxFXfs6WA==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"useragent\":\"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n      \"ip\":\"255.255.255.255\"\n   }\n]\n```\n</td>\n      </tr>\n      <tr>\n         <td><a name=\"click\"></a>Click</td>\n         <td>Recipient clicked on a link within the message. Click Tracking needs to be enabled for this type of event.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"click\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"kCAi1KttyQdEKHhdC-nuEA==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"useragent\":\"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n      \"ip\":\"255.255.255.255\",\n      \"url\":\"http://www.sendgrid.com/\"\n   }\n]\n```\n    </td>\n      </tr>\n      <tr>\n         <td><a name=\"spamreport\"></a>Spam Report</td>\n         <td>Recipient marked message as spam.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"spamreport\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"37nvH5QBz858KGVYCM4uOA==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\"\n   }\n]\n```\n    </td>\n      </tr>\n      <tr>\n         <td><a name=\"unsubscribe\"></a>Unsubscribe</td>\n         <td>Recipient clicked on the 'Opt Out of All Emails' link (available after clicking the message's subscription management link). Subscription Tracking needs to be enabled for this type of event.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"unsubscribe\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"zz_BjPgU_5pS-J8vlfB1sg==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\"\n   }\n]\n```\n      </td>\n      </tr>\n      <tr>\n         <td><a name=\"groupunsubscribe\"></a>Group Unsubscribe</td>\n         <td>Recipient unsubscribed from a specific group either by clicking the link directly or updating their preferences. Subscription Tracking needs to be enabled for this type of event.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"group_unsubscribe\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"ahSCB7xYcXFb-hEaawsPRw==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"useragent\":\"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n      \"ip\":\"255.255.255.255\",\n      \"url\":\"http://www.sendgrid.com/\",\n      \"asm_group_id\":10\n   }\n]\n```\n    </td>\n      </tr>\n      <tr>\n         <td><a name=\"groupresubscribe\"></a>Group Resubscribe</td>\n         <td>Recipient resubscribed to a specific group by updating their preferences. Subscription Tracking needs to be enabled for this type of event.</td>\n         <td>\n```raw\n[\n   {\n      \"email\":\"example@test.com\",\n      \"timestamp\":1513299569,\n      \"smtp-id\":\"<14c5d75ce93.dfd.64b469@ismtpd-555>\",\n      \"event\":\"group_resubscribe\",\n      \"category\":\"cat facts\",\n      \"sg_event_id\":\"w_u0vJhLT-OFfprar5N93g==\",\n      \"sg_message_id\":\"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0\",\n      \"useragent\":\"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\",\n      \"ip\":\"255.255.255.255\",\n      \"url\":\"http://www.sendgrid.com/\",\n      \"asm_group_id\":10\n   }\n]\n```\n</td>\n      </tr>\n   </tbody>\n</table>\n\n<call-out type=\"warning\">\n\nEvents like deferrals or bounces may or may not have an IP included in their post. Some examples where this will happen may include in internal deferrals. This is where we have already determined an issue at a specific MX records and are waiting for that issue to clear before trying to deliver more mail. Since no action is taken no IP can be logged taking an action. Another example would be a delayed bounce. This is where mail is accepted for delivery but later is rejected after the SMTP conversation is over. Since the SMTP conversation is no longer happening a new conversation is started where much of the previous context is lost. This results in delayed bounces not having an IP and other information.\n\n</call-out>\n\n## Event objects\n\n<table class=\"table auto\">\n  <tr>\n    <th></th>\n    <th><a href=\"#processed\">Processed</a></th>\n    <th><a href=\"#dropped\">Dropped</a></th>\n    <th><a href=\"#delivered\">Delivered</a></th>\n    <th><a href=\"#deferred\">Deferred</a></th>\n    <th><a href=\"#bounce\">Bounce</a></th>\n    <th><a href=\"#opened\">Opened</a></th>\n    <th><a href=\"#clicked\">Clicked</a></th>\n    <th><a href=\"#spamreport\">Spam Report</a></th>\n    <th><a href=\"#unsubscribe\">Unsubscribe</a></th>\n    <th><a href=\"#groupunsubscribe\">Group Unsubscribe</a></th>\n    <th><a href=\"#groupresubscribe\">Group Resubscribe</a></th>\n  </tr>\n  <tr>\n    <td><a href=\"#email\">email</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#timestamp\">timestamp</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#event\">event</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#smtpid\">smtp-id</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#useragent\">useragent</a></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#ip\">ip</a></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#sgeventid\">sg_event_id</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#sgmessageid\">sg_message_id</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X*</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#reason\">reason</a></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#status\">status</a></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#response\">response</a></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#tls\">tls</a></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#url\">url</a></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#category\">category</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"#asmgroupid\">asm_group_id</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#uniqueargs\">unique_args</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#marketingcampaignid\">marketing_campaign_id</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#marketingcampaignname\">marketing_campaign_name</a></td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n    <td>X</td>\n  </tr>\n  <tr>\n    <td><a href=\"#attempt\">attempt</a></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n    <tr>\n    <td><a href=\"#pool\">pool</a></td>\n    <td>X</td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n    <td></td>\n  </tr>\n</table>\n\n\\* In the case of a delayed or asynchronous bounce, the message ID will be unavailable.\n\n### JSON objects\n\n- <a name=\"email\"></a>`email` - the email address of the recipient\n- <a name=\"timestamp\"></a>`timestamp` - the <a href=\"https://en.wikipedia.org/wiki/Unix_time\">UNIX timestamp</a> of when the message was sent\n- <a name=\"event\"></a>`event` - the event type. Possible values are processed, dropped, delivered, deferred, bounce, open, click, spam report, unsubscribe, group unsubscribe, and group resubscribe.\n- <a name=\"smtpid\"></a>`smtp-id` - a unique ID attached to the message by the originating system.\n- <a name=\"useragent\"></a>`useragent` - the user agent responsible for the event. This is usually a web browser. For example, \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36\".\n- <a name=\"ip\"></a>`ip` - the IP address used to send the email. For `open` and `click` events, it is the IP address of the recipient who engaged with the email.\n- <a name=\"sgeventid\"></a>`sg_event_id` - a unique ID to this event that you can use for deduplication purposes. These IDs are up to 100 characters long and are URL safe.\n- <a name=\"sgmessageid\"></a>`sg_message_id` - a unique, internal SendGrid ID for the message. The first half of this ID is pulled from the `smtp-id`. The message ID will be included in most cases. In the event of an asynchronous bounce, the message ID will not be available. An asynchronous bounce occurs when a message is first accepted by the receiving mail server and then bounced at a later time. When this happens, there is less information available about the bounce.\n- <a name=\"reason\"></a>`reason` - any sort of error response returned by the receiving server that describes the reason this event type was triggered.\n- <a name=\"status\"></a>`status` - status code string. Corresponds to HTTP status code - for example, a JSON response of 5.0.0 is the same as a 500 error response.\n- <a name=\"response\"></a>`response` - the full text of the HTTP response error returned from the receiving server.\n- <a name=\"tls\"></a>`tls` - indicates whether TLS encryption was used in sending this message. For more information about TLS, see the [TLS Glossary page]({{root_url}}/glossary/tls/).\n- <a name=\"url\"></a>`url` - the URL where the event originates. For click events, this is the URL clicked on by the recipient.\n- <a name=\"url_offset\"></a>`url_offset` - if there is more than one of the same links in an email, this tells you which of those identical links was clicked.\n- <a name=\"attempt\"></a>`attempt` - the number of times SendGrid has attempted to deliver this message.\n- <a name=\"category\"></a>`category` - [Categories]({{root_url}}/glossary/categories/) are custom tags that you set for the purpose of organizing your emails. If you send single categories as an array, they will be returned by the webhook as an array. If you send single categories as a string, they will be returned by the webhook as a string.\n- <a name=\"type\"></a>`type` - indicates whether the bounce event was a hard bounce (type=bounce) or block (type=blocked)\n\nString categories:\n\n```json\n[\n  {\n    \"email\": \"john.doe@sendgrid.com\",\n    \"timestamp\": 1337966815,\n    \"category\": \"newuser\",\n    \"event\": \"open\"\n  },\n  {\n    \"email\": \"jane.doe@sendgrid.com\",\n    \"timestamp\": 1337966815,\n    \"category\": \"olduser\",\n    \"event\": \"open\"\n  }\n]\n```\n\nArray:\n\n```json\n[\n  {\n    \"email\": \"john.doe@sendgrid.com\",\n    \"timestamp\": 1337966815,\n    \"category\": [\"newuser\", \"transactional\"],\n    \"event\": \"open\"\n  },\n  {\n    \"email\": \"jane.doe@sendgrid.com\",\n    \"timestamp\": 1337966815,\n    \"category\": \"olduser\",\n    \"event\": \"open\"\n  }\n]\n```\n\n- <a name=\"asmgroupid\"></a>`asm_group_id` - The ID of the unsubscribe group the recipient's email address is included in. ASM IDs correspond to the ID that is returned when you create an unsubscribe group.\n- <a name=\"uniqueargs\"></a>`unique_args` or `custom_args`\n\n## Unique Arguments and Custom Arguments\n\nEvents generated by SendGrid can include [unique arguments]({{root_url}}/for-developers/sending-email/unique-arguments/) or custom arguments.\n\n<call-out>\n\nUnique arguments and custom arguments essentially have the same function. However, unique arguments are used in the SMTP API or V2 Mail Send, and custom arguments are used in the V3 Mail Send.\n\n</call-out>\n\n### Unique Arguments\n\nTo define and receive unique arguments when sending email with the [SMTP API]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/) or the [v2 Mail Send endpoint](https://www.twilio.com/docs/sendgrid/api/v2/mail), use the `unique_args` parameter in the X-SMTPAPI header. For example, if you have an application and want to receive custom parameters such as the `userid` and the email `template`, you would submit them with the X-SMTPAPI header, as described [here]({{root_url}}/for-developers/sending-email/unique-arguments/).\n\nFor example, if you include the following unique arguments in your x-smtpapi header for an email sent via the v2 Mail Send endpoint:\n\n```json\n{\n  \"unique_args\": {\n    \"userid\": \"1123\",\n    \"template\": \"welcome\"\n  }\n}\n```\n\nYou will receive the same unique argument included with the data posted to your Event Webhook:\n\n```json\n[\n  {\n    \"sg_message_id\": \"sendgrid_internal_message_id\",\n    \"email\": \"john.doe@sendgrid.com\",\n    \"timestamp\": 1337966815,\n    \"event\": \"click\",\n    \"url\": \"https://sendgrid.com\",\n    \"userid\": \"1123\",\n    \"template\": \"welcome\"\n  }\n]\n```\n\n<call-out type=\"warning\">\n\nYou can create unique arguments with the same words as reserved keys, such as \"event\" or \"email\". However, SendGrid will default to the reserved key and NOT your unique argument for events that contain a reserved key as an object. An example of this is below.\n\n</call-out>\n\n### Reserved Keys in Unique Arguments\n\n```json\n//for this example, assume we're sending to john.doe@sendgrid.com\n{\n  \"unique_args\": {\n    \"customerAccountNumber\": \"55555\",\n    \"activationAttempt\": \"1\",\n    \"New Argument 1\": \"New Value 1\",\n    \"email\": \"jane.doe@sendgrid.com\",\n    \"event\": \"SendEmail\"\n  }\n}\n```\n\n### The resulting webhook call\n\n```json\n[\n  {\n    \"event\": \"Processed\",\n    \"timestamp\": \"123456789\",\n    \"customerAccountNumber\": \"55555\",\n    \"activationAttempt\": \"1\",\n    \"New Argument 1\": \"New Value 1\",\n    \"email\": \"john.doe@sendgrid.com\"\n  }\n]\n```\n\n<call-out>\n\nYou'll notice that the unique arguments, \"event\" and \"email\", were overwritten because they are reserved keys for SendGrid's values.\n\n</call-out>\n\n### Custom Arguments\n\nAny custom arguments that you include with an email sent through [v3 Mail Send](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) gets added to your Event Webhook response.\n\nFor example, if you were to include the following custom arguments in a personalization in your payload to the v3 Mail Send endpoint:\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"example@example.com\"\n        }\n      ],\n      \"subject\": \"Hello, World!\",\n      \"custom_args\": {\n        \"userid\": \"1123\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"from_address@example.com\"\n  },\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello, World!\"\n    }\n  ]\n}\n```\n\nThe Event Webhook response:\n\n```json\n[\n  {\n    \"userid\": \"1123\"\n  }\n]\n```\n\nFor emails sent through our Marketing Campaigns feature, we add Marketing Campaigns specific parameters to the Event Webhook.\n\n- <a name=\"singlesendid\"></a>`singlesend_id`\n- <a name=\"singlesendname\"></a>`singlesend_name`\n\n### Example event from a Single Send:\n\n```json\n[\n  {\n    \"category\": [],\n    \"email\": \"email@example.com\",\n    \"event\": \"open\",\n    \"ip\": \"127.0.0.1\",\n    \"mc_stats\": \"singlesend\",\n    \"phase_id\": \"send\",\n    \"send_at\": \"1591726752372\",\n    \"sg_content_type\": \"html\",\n    \"sg_event_id\": \"sendgrid_internal_event_id\",\n    \"sg_message_id\": \"sendgrid_internal_message_id\",\n    \"sg_template_id\": \"sendgrid_template_id\",\n    \"sg_template_name\": \"sendgrid_template_name\",\n    \"singlesend_id\": \"sendgrid_singlesend_id\",\n    \"singlesend_name\": \"Example Single Send\",\n    \"template_hash\": \"sendgrid_template_hash\",\n    \"template_id\": \"sendgrid_template_id\",\n    \"template_version_id\": \"sendgrid_template_version_id\",\n    \"timestamp\": 1591726752372,\n    \"useragent\": \"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\"\n  }\n]\n```\n\n- <a name=\"marketingcampaignid\"></a>`marketing_campaign_id`\n- <a name=\"marketingcampaignname\"></a>`marketing_campaign_name`\n\n### Example event from a standard (non-A/B test) campaign send:\n\n```json\n{\n  \"category\": [],\n  \"email\": \"email@example.com\",\n  \"event\": \"processed\",\n  \"marketing_campaign_id\": 12345,\n  \"marketing_campaign_name\": \"campaign name\",\n  \"post_type\": \"event\",\n  \"sg_event_id\": \"sendgrid_internal_event_id\",\n  \"sg_message_id\": \"sendgrid_internal_message_id\",\n  \"sg_user_id\": 12345,\n  \"smtp-id\": \"\",\n  \"timestamp\": 1442349428\n}\n```\n\n### Example event from an A/B Test:\n\n`marketing_campaign_version` is displayed in the event data for emails sent as part of an A/B Test. The value for `marketing_campaign_version` are returned as `A`, `B`, `C`, etc.\n\n```json\n{\n  \"category\": [],\n  \"email\": \"tadpole_0010@stbase-018.sjc1.sendgrid.net\",\n  \"event\": \"processed\",\n  \"marketing_campaign_id\": 23314,\n  \"marketing_campaign_name\": \"unique args ab\",\n  \"marketing_campaign_version\": \"B\",\n  \"marketing_campaign_split_id\": 13471,\n  \"post_type\": \"event\",\n  \"sg_event_id\": \"qNOzbkTuTNCdxa1eXEpnXg\",\n  \"sg_message_id\": \"5lFl7Fr1Rjme_EyzNNB_5A.stfilter-015.5185.55F883172.0\",\n  \"sg_user_id\": 939115,\n  \"smtp-id\": \"<5lFl7Fr1Rjme_EyzNNB_5A@stismtpd-006.sjc1.sendgrid.net>\",\n  \"timestamp\": 1442349848\n}\n```\n\n### Example event from the winning phase of an A/B Test:\n\n```json\n{\n  \"category\": [],\n  \"email\": \"tadpole_0001@stbase-018.sjc1.sendgrid.net\",\n  \"event\": \"delivered\",\n  \"marketing_campaign_id\": 23314,\n  \"marketing_campaign_name\": \"unique args ab\",\n  \"post_type\": \"event\",\n  \"response\": \"250 Ok \",\n  \"sg_event_id\": \"X2M1IUfMRhuAhWM0CbmFqQ\",\n  \"sg_message_id\": \"fPJrJPIRTxC_obpgfTy74w.stfilter-015.5185.55F883564.0\",\n  \"sg_user_id\": 12345,\n  \"smtp-id\": \"\",\n  \"timestamp\": 1442349911\n}\n```\n\n### Legacy Marketing Email Unsubscribes\n\nFor emails sent through our Legacy Marketing Email tool, unsubscribes look like the following example:\n\n```json\n[\n  {\n    \"email\": \"nick@sendgrid.com\",\n    \"timestamp\": 1380822437,\n    \"newsletter\": {\n      \"newsletter_user_list_id\": \"10557865\",\n      \"newsletter_id\": \"1943530\",\n      \"newsletter_send_id\": \"2308608\"\n    },\n    \"category\": [\"Tests\", \"Newsletter\"],\n    \"event\": \"unsubscribe\"\n  }\n]\n```\n\n<a name=\"pool\"></a>`pool` - For emails sent with a specified IP Pool, you can view the IP Pool in the event data for a processed event.\n\n```json\n[\n  {\n    \"email\": \"john.doe@sendgrid.com\",\n    \"smtp-id\": \"<14c583da911.2c36.1c804d@ismtpd-073>\",\n    \"timestamp\": 1427409578,\n    \"pool\": {\n      \"name\": \"new_MY_test\",\n      \"id\": 210\n    },\n    \"sg_event_id\": \"RHFZB1IrTD2Y9Q7bUdZxUw\",\n    \"sg_message_id\": \"14c583da911.2c36.1c804d.filter-406.22375.55148AA99.0\",\n    \"event\": \"processed\"\n  }\n]\n```\n\n### Click\n\n<table class=\"table table-bordered table-striped\">\n   <thead>\n      <tr>\n         <th>event</th>\n         <th>email</th>\n         <th>url</th>\n         <th>category</th>\n      </tr>\n   </thead>\n   <tbody>\n      <tr>\n         <td>click</td>\n         <td>Message recipient</td>\n         <td>URL Clicked</td>\n         <td>The category you assigned</td>\n      </tr>\n   </tbody>\n</table>\n\n```json\n[\n  {\n    \"sg_event_id\": \"sendgrid_internal_event_id\",\n    \"sg_message_id\": \"sendgrid_internal_message_id\",\n    \"ip\": \"255.255.255.255\",\n    \"useragent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53\",\n    \"event\": \"click\",\n    \"email\": \"email@example.com\",\n    \"timestamp\": 1249948800,\n    \"url\": \"http://yourdomain.com/blog/news.html\",\n    \"url_offset\": {\n      \"index\": 0,\n      \"type\": \"html\"\n    },\n    \"unique_arg_key\": \"unique_arg_value\",\n    \"category\": [\"category1\", \"category2\"],\n    \"newsletter\": {\n      \"newsletter_user_list_id\": \"10557865\",\n      \"newsletter_id\": \"1943530\",\n      \"newsletter_send_id\": \"2308608\"\n    },\n    \"asm_group_id\": 1\n  }\n]\n```\n\n## Additional Resources\n\n- [Getting started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [Troubleshooting the event webhook]({{root_url}}/for-developers/tracking-events/troubleshooting/)\n- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/)\n- [Webhook web libraries]({{root_url}}/for-developers/sending-email/libraries/)\n- [Analyze, Visualize, and Store SendGrid Event Data with Keen]({{root_url}}/for-developers/tracking-events/analytics-with-keen-io/)\n- [Email Event Data with Keen]({{root_url}}/ui/analytics-and-reporting/tracking-data-with-keen-io/)\n- [Run SQL on your Sengrid webhook data](https://pipedream.com/@dylburger/run-sql-on-sendgrid-engagement-data-for-free-p_X13CGV)\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/getting-started-event-webhook-security-features.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Getting Started with the Event Webhook Security Features\ngroup: getting-started\nnavigation:\n  show: true\nseo:\n  title: Getting Started with the Event Webhook Security Features\n  description: Secure the Event Webhook using the Signed Webhook, OAuth 2.0, or both.\n  keywords: Webhook, Signed, Cryptography, OAuth, ECDSA\n---\n\nTwilio SendGrid's Event Webhook will notify a URL via HTTP POST with information about events that occur as your mail is processed. This article covers all you need to know to secure the Event Webhook, allowing you to verify that incoming requests originate from Twilio SendGrid.\n\n<call-out>\n\nFor more information about working with the Event Webhook and the data it provides, please see [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/).\n\n</call-out>\n\nTwilio SendGrid provides two methods for securing the Event Webhook: cryptographic signing and [OAuth 2.0](https://oauth.net/2/). These two security methods are independent of one another and can be used simultaneously.\n\n## The Signed Event Webhook\n\nWhen using the Signed Event Webhook, Twilio SendGrid will generate a [private and public key pair](https://www.twilio.com/blog/what-is-public-key-cryptography). The private key will be used to generate a signature that is posted to your HTTP webhook in the `\"X-Twilio-Email-Event-Webhook-Signature\"` header.\n\nYou can verify the signature with the public key provided. More information is provided in the [Verification section](#verify-the-signature) of this page.\n\n### Manage the Signed Event Webhook using the app\n\n#### Enable the Signed Event Webhook\n\nTo enable the Signed Event Webhook and generate a key pair using the [SendGrid App](https://app.sendgrid.com/):\n\n1. Navigate to [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the sidebar navigation.\n2. Under \"Event Settings,\" you should see “Signed Event Webhook Requests.” Click on the edit icon to load a sidebar modal.\n\n![The signed event webhook settings page with the signed security option highlighted]({{root_url}}/images/signed-event-webhook-landing-page.png 'The Event Webhook settings page')\n\n3. In the sidebar modal, click \"Generate Verification Key.\" This will generate a private and public key. The public key will then be displayed to you.\n\n![A sidebar modal with an option to generate a verification key and a status toggle showing if webhook signing is enabled or disabled]({{root_url}}/images/signed-event-webhook-modal.png 'Enable or disable the signed Event Webhook')\n\n4. You can now copy this key and use it for verification.\n\n![A sidebar modal with a verification key displayed for use in your code]({{root_url}}/images/signed-event-webhook-public-key.png 'A public verification key')\n\n5. To confirm that the Signed Event Webhook is enabled, you can navigate back to [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) to verify that the setting is listed as \"Enabled.\"\n\n#### Disable the Signed Event Webhook using the app\n\nTo disable the Signed Event Webhook, which will delete any existing keys:\n\n1. Navigate to [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the sidebar navigation.\n2. Under \"Event Settings,\" you should see \"Signed Event Webhook Requests.\" Click the edit icon to load a sidebar modal.\n3. When a signature exists, the side modal will show a toggle set to \"Enabled\" under the \"Signed Event Webhook Request Status\" label. Click the toggle to disable the feature and delete your existing keys.\n4. Another modal will load asking you to confirm your decision. Click \"Delete and Disable Signing\" to confirm.\n\n![A modal asking you to verify that you wish to delete your key and no longer sign the Event Webhook. You can either click to cancel or click to confirm.]({{root_url}}/images/signed-event-webhook-delete-key.png 'Confirm disabling the signed Event Webhook and deletion of current keys')\n\n### Manage the Signed Event Webhook using the API\n\nTwilio SendGrid provides two Event Webhook API endpoints that allow you to manage signatures. A brief overview of both endpoints is provided below. You can find more at our [Event Webhook API Reference](https://sendgrid.api-docs.io/v3.0/webhooks/retrieve-event-webhook-settings).\n\n#### Enable/Disable the Signed Webhook\n\nTo enable or disable the Signed Event Webhook, you can pass a `PATCH` request to `https://api.sendgrid.com/v3/user/webhooks/event/settings/signed`. This endpoint expects a JSON request body with the single required boolean field `enabled`.\n\n```javascript\n{\n  “enabled”: true\n}\n```\n\n#### Retrieve the Signed Webhook public key\n\nYou can also retrieve your public key by passing a `GET` request to `https://api.sendgrid.com/v3/user/webhooks/event/settings/signed`. This endpoint accepts no query parameters and will return the string field `public_key` containing your current public key.\n\n#### Verify the signature\n\nTwilio SendGrid generates the private and public key pair using the [Elliptic Curve Digital Signature Algorithm (ECDSA)](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm).\n\nWe recommend using a package or library suitable for your language to verify the signature. Libraries are listed below in [Sample verification libraries](#sample-verification-libraries). The general steps required to verify a signature are outlined below with [Golang](https://golang.org/) code samples.\n\n<call-out type=\"warning\">\n\nWhen verifying the signature, be aware that we deliver a payload that must be used in its raw bytes form. Transformations from raw bytes to a JSON string may remove characters that were used as part of the generated signature.\n\n</call-out>\n\n1. Get the signature from the `\"X-Twilio-Email-Event-Webhook-Signature\"` HTTP header.\n\n```go\n// Golang Example\ns := http.Request.Header.Get(\"X-Twilio-Email-Event-Webhook-Signature\")\n```\n\n2. Get the timestamp from the `\"X-Twilio-Email-Event-Webhook-Timestamp\"` HTTP header.\n\n```go\n// Golang Example\nts := http.Request.Header.Get(\"X-Twilio-Email-Event-Webhook-Timestamp\")\n```\n\n3. Base64 decode the signature. Then perform an ASN.1 unmarshal of the decoded signature into a string. This string will be in the form of `{r value},{s value}`.\n\n```go\n// Golang Example\nsignatureBytes, _ := base64.StdEncoding.DecodeString(s)\necdsaSig := struct {\nR *big.Int\nS *big.Int\n}\n\nasn1.Unmarshal(signatureBytes, &ecdsaSig)\n```\n\n4. Generate a sha256 hash of the timestamp + payload (use raw bytes).\n\n```go\n// Golang Example\ntsBytes := []byte(ts)\npayload, _ := ioutil.ReadAll(http.Request.Body)\nh := sha256.New()\nh.Write(tsBytes)\nh.Write(payload)\nhashedPayload := h.Sum(nil)\n```\n\n5. Verify the signature.\n\n```go\n// Golang Example\n// uses https://golang.org/pkg/crypto/ecdsa/ to perform the verification\necdsa.Verify(publicKey, hashedPayload, ecdsaSig.R, ecdsaSig.S)\n```\n\n6. Again, the simplest way to verify the signature is to use a package or library that will abstract away this process into a helper method or function.\n\n#### Sample verification libraries\n\nThe [Twilio SendGrid API libraries]({{root_url}}/for-developers/sending-email/libraries/) contain helpers to assist you when verifying the ECDSA signature. The links below will take you to the Event Webhook helper in each library.\n\n- [C# Event Webhook Helper](https://github.com/sendgrid/sendgrid-csharp/tree/master/src/SendGrid/Helpers/EventWebhook)\n- [Go Event Webhook Helper](https://github.com/sendgrid/sendgrid-go/tree/master/helpers/eventwebhook)\n- [Java Event Webhook Helper](https://github.com/sendgrid/sendgrid-java/tree/master/src/main/java/com/sendgrid/helpers/eventwebhook)\n- [Node.js Event Webhook Helper](https://github.com/sendgrid/sendgrid-nodejs/tree/master/packages/eventwebhook)\n- [PHP Event Webhook Helper](https://github.com/sendgrid/sendgrid-php/tree/master/lib/eventwebhook)\n- [Python Event Webhook Helper](https://github.com/sendgrid/sendgrid-python/tree/master/sendgrid/helpers/eventwebhook)\n- [Ruby Event Webhook Helper](https://github.com/sendgrid/sendgrid-ruby/tree/master/lib/sendgrid/helpers/eventwebhook)\n\n## OAuth 2.0\n\nOAuth offers an additional and separate way of providing security controls for the Event Webhook. OAuth is an open authorization protocol used to share resources with applications. Rather than sharing your username and password with an application, granting total access to your account, OAuth enables scoped access to your resources. For more on OAuth and how it works, see the [OAuth community site](https://oauth.net/2/).\n\nThe Twilio SendGrid Event Webhook uses the [Client Credentials](https://tools.ietf.org/html/rfc6749#section-1.3.4) OAuth grant type, which is an authorization workflow meant for machine-to-machine communication. This authorization method creates a token that Twilio SendGrid can pass to your app in an Authorization header, allowing you to verify that the request originated from Twilio SendGrid.\n\n### OAuth Client Credentials flow\n\nOAuth can be confusing. To help illuminate the process, we have provided a description of the setup flow here.\n\n1. You, the customer, have an app that provides an HTTP webhook. You want the Twilio SendGrid Event Webhook to make POST requests to this URL. To ensure that the requests you receive are actually from Twilio SendGrid, you implement OAuth.\n2. This means you are responsible for generating a Client ID and Client Secret. You must also provide two URLs, the HTTP POST URL for your app and a URL to an authorization server or OAuth service.\n3. When you give Twilio SendGrid all of this information, it will pass the Client ID and Client Secret to the Token URL (your authorization server/OAuth service). The authorization server will then use the Client ID and Client Secret to generate an access token. This token is sent back to Twilio SendGrid.\n4. The access token is meaningless to Twilio SendGrid. It acts only as a key to pass back to your app at the HTTP POST URL. This will be done in an Authorization header.\n5. Because this access token is shared among only your app, the authorization server, and Twilio SendGrid, you can trust requests delivered with the token are from a trusted source.\n6. You can verify the access token is legitimate by checking with the authorization server that created it.\n\n![A sequence diagram visualing showing the OAuth2 Client Credentials flow described in the list above.]({{root_url}}/images/oauth2-client-credentials-flow.png 'OAuth2.0 Client Credentials flow')\n\n### Manage OAuth 2.0 using the app\n\n#### Enable OAuth\n\nTo enable OAuth using the [SendGrid App](https://app.sendgrid.com/):\n\n1. Navigate to [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the sidebar navigation.\n\n2. Under \"Event Settings,\" you should see \"Event Webhook.\" Click the edit icon to load a sidebar modal.\n\n![The Event Webhook settings page with the Event Webhook setting highlighted]({{root_url}}/images/oauth-landing-page.png 'The Event Webhook Settings Page')\n\n3. In the sidebar modal, you should see an \"Authorization Method\" drop-down menu. Select \"OAuth 2.0\" to load the OAuth configuration fields.\n\n![A sidebar modal with all the required fields for enabling OAuth 2.0 for the Event Webhook]({{root_url}}/images/oauth-modal-fields.png 'The OAuth 2.0 configuration fields')\n\n4. Fill the OAuth configuration fields:\n\n   1. **Client ID**: Required to generate an authorization token.\n   2. **Client Secret**: Required to generate an authorization token. This secret is needed only once to create an access token. SendGrid will store this secret, allowing you to update your Client ID and Token URL without passing the secret to SendGrid again.\n   3. **Token URL**: The URL where Twilio SendGrid should deliver the Client ID and Client Secret in order to create an access token. This URL should route to your own authorization server or an OAuth service such as Auth0 or Okta.\n\n5. With the above steps completed, requests to your HTTP POST URL by Twilio SendGrid will contain the access token in an Authorization header. You can now use this token to verify the requests using your OAuth service or authorization server.\n\n<call-out>\n\nPlease note, it is your responsibility to verify the access token used in requests to your HTTP POST URL.\n\n</call-out>\n\n#### Disable OAuth\n\nTo disable OAuth using the [SendGrid App](https://app.sendgrid.com/):\n\n1. [Navigate to Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the sidebar navigation.\n2. Under \"Event Settings,\" you should see \"Event Webhook.\" Click the edit icon to load a sidebar modal.\n3. In the sidebar modal, you should see an \"Authorization Method\" drop-down menu. Select \"None\" to disable authorization on the Event Webhook.\n4. By selecting \"None,\" requests to your HTTP POST URL by Twilio SendGrid will no longer contain an access token.\n\n### Manage OAuth 2.0 using the API\n\nTwilio SendGrid allows you to manage OAuth setup using the API. A brief overview of enabling, disabling, and testing OAuth; and retrieving your OAuth credentials is provided below. You can find more at our [Event Webhook API Reference](https://sendgrid.api-docs.io/v3.0/webhooks/retrieve-event-webhook-settings).\n\n#### Enable/Disable OAuth\n\nTo enable or disable OAuth, you can pass a `PATCH` request to `https://api.sendgrid.com/v3/user/webhooks/event/settings`.\n\nThis endpoint expects a JSON request body. The three optional string fields used to manage OAuth are `oauth_client_id`, `oauth_client_secret`, and `oauth_token_url`.\n\n1. **Client ID**: Required to generate an authorization token.\n2. **Client Secret**: Required to generate an authorization token. This secret is needed only once to create an access token. SendGrid will store this secret, allowing you to update your Client ID and Token URL without passing the secret to SendGrid again.\n3. **Token URL**: The URL where Twilio SendGrid should deliver the Client ID and Client Secret in order to create an access token. This URL should route to your own authorization server or an OAuth service such as Auth0 or Okta.\n\nPassing a request with valid values assigned to these fields will enable OAuth. Passing a request with empty values in these fields will disable OAuth.\n\n```javascript\n{\n  “oauth_client_id”: “yourclientidstringvalue”,\n  “oauth_client_secret”: “yourclientsecretstringvalue”,\n  “oauth_token_url”: “https://your-authorization-service.com”\n}\n```\n\n<call-out>\n\nPlease note, there are other required fields when making requests to this API endpoint. Please see the [API reference for details](https://sendgrid.api-docs.io/v3.0/webhooks/retrieve-event-webhook-settings).\n\n</call-out>\n\n<call-out type=\"warning\">\n\nUsing the v2 Web API's `eventnotify` API call will overwrite any previously configured Event Webhook notification settings, including OAuth 2.0. If your OAuth 2.0 settings are overwitten, please configure them again using either the [Mail Settings](https://app.sendgrid.com/settings/mail_settings) page or the [SendGrid v3 API](https://sendgrid.api-docs.io/v3.0/webhooks/update-event-notification-settings)\n\n</call-out>\n\n#### Testing the Event Webhook\n\nYou can test your Webhook by passing a `POST` request to `https://api.sendgrid.com/v3/user/webhooks/event/test`. This request will send a fake event to your HTTP POST URL, which you can use to verify proper functionality. This endpoint expects a JSON request body with a required URL field. To test the OAuth setup, you must include the three optional OAuth fields.\n\n```javascript\n{\n  “url”: “https://your-http-post-url.com”,\n  “oauth_client_id”: “yourclientidstringvalue”,\n  “oauth_client_secret”: “yourclientsecretstringvalue”,\n  “oauth_token_url”: “https://your-authorization-service.com”\n}\n```\n\n#### Retrieve your OAuth credentials.\n\nTo retrieve your OAuth credentials, pass a `GET` request to `https://api.sendgrid.com/v3/user/webhooks/event/settings`. You do not need to pass any query parameters to this endpoint. Note that only the `oauth_client_id` and `oauth_token_url` will be returned. The `oauth_client_secret` will not be provided for security reasons.\n\n## Helper Libraries\n\nTwilio SendGrid currently supports two helper libraries for working with the Event Webhook’s security features: [Golang](https://github.com/sendgrid/sendgrid-go/tree/master/helpers/eventwebhook) and [Java](https://github.com/sendgrid/sendgrid-java/tree/master/src/main/java/com/sendgrid/helpers). We have also provided a [Java code example on GitHub](https://github.com/sendgrid/sendgrid-java/blob/master/examples/helpers/eventwebhook/Example.java).\n\n## Next steps\n\nNow that you know how to secure the Event Webhook, you can begin using your event data to better understand your email. To finish setting up the Webhook, see [Getting Started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) or jump right into the [Event Webhook Reference](/for-developers/tracking-events/event/).\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/getting-started-event-webhook.md",
    "content": "---\nseo:\n  title: Getting started with the Event Webhook\n  description: Use RequestBin to get started or to troubleshoot your Event Webhook.\n  keywords: webhook, RequestBin, troubleshoot, event webhook\ntitle: Getting started with the Event Webhook\ngroup: getting-started\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid's Event Webhook will notify a URL of your choice via HTTP POST with information about events that occur as SendGrid processes your email. You can use this data to remove unsubscribes, react to spam reports, [determine unengaged recipients](https://sendgrid.com/blog/infer-engagement-with-the-event-api/), identify bounced email addresses, or create advanced analytics of your email program. With Unique Arguments and Category parameters, you can insert dynamic data that will help build a clear image of your email program.\n\n<call-out type=\"warning\">\n\nCategories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nYou should set up the Event Webhook if you want to keep track of more event data that we store for you. Due to the sheer volume of email we send, we can only store so much information. Your [Email Activity Feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) can hold up to 30 days worth of events. After that time passes, the email event data is gone.\n\n## Getting started\n\n_To get started with the Event Webhook:_\n\n1. Go to the [Webhook tester](https://webhook.site/).\n1. Copy the unique URL.\n1. In a new window, open [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the [SendGrid UI](https://app.sendgrid.com).\n1. Turn on **Event Webhook**.\n1. In the **HTTP POST URL field**, paste the unique URL that you copied in step 2.\n1. Select the Event notifications you would like to test.\n1. Click the checkmark in the top corner to save these updates into your settings.\n1. Click **Test Your Integration**.\n   <br> This returns an HTTP POST containing a JSON array of your selected events in one request after a very short delay. Our servers send these POSTs to the URL you defined in the Event Notification app options.\n1. Go back to the [Webhook tester](https://webhook.site/) and reload the page.\n   <br> This loads the JSON array of your selected events that you set in the last step.\n\n<call-out type=\"warning\">\n\nThe Webhook tester site has a public URL. This is usually safe for testing purposes, just make sure that you remove the `webhook.site` URL from your Event Notifications settings after you are done testing.\n\n</call-out>\n\n<call-out>\n\nYou can also update your Event Webhook mail settings using the [PATCH /user/webhooks/event/settings](https://sendgrid.api-docs.io/v3.0/webhooks/update-event-notification-settings) API method, and you can test the webhook integration using the [POST /user/webhooks/event/test](https://sendgrid.api-docs.io/v3.0/webhooks/test-event-notification-settings) API method.\n\n</call-out>\n\n<call-out>\n\nIf you want to test your webhook locally, deploy a local version of [Webhook tester](https://github.com/fredsted/webhook.site). Other browser options are [Beeceptor](https://beeceptor.com), or [ngrok](https://ngrok.com/).\n\n</call-out>\n\n### Retry logic\n\nIf your web server does not return a 2xx response type, we will retry a POST request until we receive a 2xx response or the maximum time has expired. All events are retried at increasing intervals for up to 24 hours after the event occurs. Please note that this time limit is a rolling 24 hours, which means new failing events will receive their own 24-hour retry period.\n\n## Next steps\n\nNow that you understand what Event data looks like and the basics of the webhook, it's time to evaluate your own needs for the types of events you want to store, what kind of data storage that requires, and then switch your integration from the RequestBin test to a more permanent integration.\n\n### Data Storage\n\nEvents post every 30 seconds or when the batch size reaches 768 kilobytes - whichever occurs first. This is per server, so if you send a high volume of emails, the webhook URL may receive tens or even hundreds of posts per second. Because of this, storage should be a significant consideration of the type of integration you set up.\n\nStorage integrations are infinitely flexible, but here are some popular options:\n\n- Locally on your servers.\n- SendGrid's [open source Event Kit](https://github.com/sendgrid/eventkit-rails) stores the data on a Heroku instance.\n- SendGrid's partner Keen provides a platform to analyze, visualize, and store SendGrid Event data. For more information about getting started with Keen, see [Email Event Data with Keen]({{root_url}}/ui/analytics-and-reporting/tracking-data-with-keen-io/).\n- You could also use [Snowplow](https://github.com/snowplow/snowplow/wiki/SendGrid-webhook-setup), a web open source platform that supports SendGrid and stores the data on Amazon Redshift.\n- Several open source web libraries support SendGrid's Event Webhook. For a full list of these libraries, see the [Webhook libraries section]({{root_url}}/for-developers/sending-email/libraries/) of our API Libraries list.\n\n<call-out type=\"warning\">\n\nIf your email traffic generates a lot of events, the incoming data can quickly overload a web server if not configured correctly. You can load test your endpoints with loader.io for free.\n\n</call-out>\n\n### Integrating\n\nOnce you choose a storage option, follow steps 3 through 8 in [Getting started](#getting-started]) to update your [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the [SendGrid UI](https://app.sendgrid.com). Update the **HTTP POST URL field** to your URL, and make sure you've selected the events that you want to receive.\n\nThe Event Webhook does not follow redirects.\n\nIf you want to receive encrypted posts, your callback URL needs to support TLS 1.2.\n\n## Additional Resources\n\n- [Event Webhook reference]({{root_url}}/for-developers/tracking-events/event/)\n- [Troubleshooting the Event Webhook]({{root_url}}/for-developers/tracking-events/troubleshooting/)\n- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/)\n- [Webhook web libraries]({{root_url}}/for-developers/sending-email/libraries/)\n- [Email Event Data with Keen]({{root_url}}/ui/analytics-and-reporting/tracking-data-with-keen-io/)\n- [Analyze, Visualize, and Store SendGrid Event Data with Keen]({{root_url}}/for-developers/tracking-events/analytics-with-keen-io/)\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/go-code-example.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Go Code Example\ngroup: code-examples\nnavigation:\n  show: true\n---\n\n## \tParse Webhook\n\n<call-out>\n\nWe recommend using our official Go SDK, our client library with full documentation, when integrating with <a href=\"https://github.com/sendgrid/sendgrid-go/tree/master/helpers/inbound\">SendGrid's Inbound Parse Webhook</a>.\n\n</call-out>\n\nIn this example, we want to parse all emails at *address*@email.sendgrid.biz and post the parsed email to http://sendgrid.biz/upload\n\nGiven this scenario, the following are the parameters you would set at the [Parse API settings page](https://sendgrid.com/developer/reply):\n\n```\nHostname: email.sendgrid.biz\n```\n\n```\nURL: http://sendgrid.biz/upload\n```\n\n To test this scenario, we sent an email to example@example.com and created the following code:\n\n```go\n\npackage main\n\nimport (\n        \"fmt\"\n        \"net/http\"\n        \"io/ioutil\"\n        \"log\"\n        \"github.com/sendgrid/sendgrid-go\"\n\n)\n\nfunc Parse (w http.ResponseWriter, req *http.Request) {\n        //Get Email Values\n        to := req.FormValue(\"from\")\n        subject := req.FormValue(\"subject\")\n        body:= req.FormValue(\"text\")\n\n        //Get Uploaded File\n        file, handler, err := req.FormFile(\"attachment1\")\n        if err != nil {\n                fmt.Println(err)\n        }\n        data, err := ioutil.ReadAll(file)\n        if err != nil {\n                fmt.Println(err)\n        }\n        err = ioutil.WriteFile(handler.Filename, data, 0777)\n        if err != nil {\n                fmt.Println(err)\n        }\n}\n\nfunc main() {\n        http.HandleFunc(\"/upload\", Parse)\n        err := http.ListenAndServe(\":3000\", nil)\n        if err != nil {\n                log.Fatal(\"ListenAndServe: \", err)\n        }\n}\n\n```\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/google-amp-for-email.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: partners\ntitle: SendGrid and Google AMP for Email\nseo:\n  title: SendGrid and Google AMP for Email\n  description: Use Google AMP to speed up mobile apps and websites. AMP for email enables  interactivity in emails sent to gmail inboxes. \nnavigation:\n  show: true\n---\nGoogle AMP (Accelerated Mobile Pages) is a proprietary Google technology built to speed up mobile apps and websites. AMP for Email is an extension and adaptation of the AMP technology that enables interactivity for Gmail recipients' email messages including carousels, expanding accordions, dynamically updating content, and more. For more information on Google’s [AMP specification for email](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/?format=email), [best practices](https://developers.google.com/gmail/ampemail/testing-dynamic-email), and how to [register to use AMP](https://developers.google.com/gmail/ampemail/register) see Google’s AMP documentation. \n\n<call-out>\n\nSendGrid v3 API supports Google AMP for Email. You cannot send AMP content in SendGrid v2 API. Users can send AMP via SMTP however we strongly suggest sending it through V3. \n\n</call-out>\n\n## Sending AMP with SendGrid\n\nSendGrid v3 API supports the AMP MIME part as well as the ordering recommended by Google to ensure compatibility across different mail clients. We recommend following [Google’s documentation](https://amp.dev/documentation/guides-and-tutorials/learn/amp-email-format#the-amphtml-email-format) to send AMP messages through SendGrid.\n\n## Tracking AMP with SendGrid\nOpen and click metrics for AMP will be aggregated with html open and click metrics in the SendGrid UI, but the AMP events are uniquely identified when collected via the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/#engagement-events).\n\n## AMP Open Identifier\nOpen event tracking for AMP is identified by a JSON field called `sg_content_type`and will be `amp` instead of `html`.\n\n```\n{\n    \"email\": \"john.smith@sendgrid.com\",\n    \"event\": \"open\",\n    \"ip\": \"66.249.84.159\",\n    \"sg_event_id\": \"zgAjGPn1TGmO62eSqw9VBQ\",\n    \"sg_message_id\": \"zT-FDCibS4uwaz08cIX8_Q.filter0794p1las1-20361-5CCC528C-16.0\",\n    \"sg_content_type\": \"amp\",\n    \"timestamp\": 1556901948,\n    \"useragent\": \"Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)\"\n}\n```\n\n## AMP Click Identifier\nClick event tracking for AMP is identified by`url_offset.type` is `amp`.\n\n```\n{\n    \"email\": \"john.smith@sendgrid.com\",\n    \"event\": \"click\",\n    \"ip\": \"12.34.56.789\",\n    \"sg_event_id\": \"fmip8TM8RWqJjT44cL5z-w\",\n    \"sg_message_id\": \"zT-FDCibS4uwaz08cIX8_Q.filter0794p1las1-20361-5CCC528C-16\n    \"timestamp\": 1556901957,\n    \"url\": \"http://google.com/\",\n    \"url_offset\": {\n        \"index\": 0,\n        \"type\": \"amp\"\n    },\n    \"useragent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36\"\n}\n```\n\n<call-out>\n\nGoogle requires all images to use HTTPS, which will require you to enable [SSL tracking]({{root_url}}ui/analytics-and-reporting/click-tracking-ssl/) on your SendGrid account in order to track opens.\n\n</call-out>\n\n\n\n\n\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/nodejs-code-example.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Node.js Code Example\ngroup: code-examples\nnavigation:\n  show: true\n---\n\n## \tParse Webhook\n\nIn this example, we want to parse all emails at *address*@email.sendgrid.biz and post the parsed email to http://sendgrid.biz/parse . We will be using Node and the Express framework.\n\nGiven this scenario, the following are the parameters you would set at the [Parse API settings page](https://sendgrid.com/developer/reply):\n\n```\nHostname: email.sendgrid.biz\n```\n\n```\nURL: http://sendgrid.biz/parse\n```\n\n To test this scenario, we sent an email to example@example.com and created the following code:\n\n```javascript\n\nvar express = require('express');\nvar multer  = require('multer');\nvar app = express();\n\napp.configure(function(){\n  app.set('port', process.env.PORT || 3000);\n  app.use(multer());\n});\n\napp.post('/parse', function (req, res) {\n  var from = req.body.from;\n  var text = req.body.text;\n  var subject = req.body.subject;\n  var num_attachments = req.body.attachments;\n  for (i = 1; i <= num_attachments; i++){\n    var attachment = req.files['attachment' + i];\n    // attachment will be a File object\n  }\n});\n\nvar server = app.listen(app.get('port'), function() {\n  console.log('Listening on port %d', server.address().port);\n});\n```\n\n\n## \tEvent Webhook\n\nTo use the Event Webhook, you must first [setup Event Notification]({{root_url}}/for-developers/tracking-events/event/#setup).\n\nIn this scenario, we assume you've set the Event Notification URL to go the endpoint `/event` on your server. Given this scenario the following code will allow you to process events:\n\n```javascript\n\nvar express = require('express');\nvar app = express();\n\napp.configure(function(){\n  app.set('port', process.env.PORT || 3000);\n  app.use(express.bodyParser());\n});\n\napp.post('/event', function (req, res) {\n  var events = req.body;\n  events.forEach(function (event) {\n    // Here, you now have each event and can process them how you like\n\t  processEvent(event);\n  });\n});\n\nvar server = app.listen(app.get('port'), function() {\n  console.log('Listening on port %d', server.address().port);\n});\n```\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/php-code-example.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Event Webhook PHP Code Example\ngroup: code-examples\nnavigation:\n  show: true\n---\n\n## \tParse Webhook\n\nIn this example, we want to parse all emails at *address*@email.sendgrid.biz and post the parsed email to https://sendgrid.com/email.php.\n\nGiven this scenario, the following are the parameters you would set at the [Parse API settings page](https://sendgrid.com/developer/reply):\n\n```\nHostname: email.sendgrid.biz\n```\n\n```\nURL: https://sendgrid.com/email.php\n```\n\n To test this scenario, we sent an email to example@example.com and created the following form at https://sendgrid.com/email.php:\n\n```php\n<?php\n$to = $_POST[\"to\"];\n$from = $_POST[\"from\"];\n$body = $_POST[\"text\"];\n$subject = $_POST[\"subject\"];\n$num_attachments = $_POST[\"attachments\"];\n\nif($num_attachments){\n  for($i = 1; $i <= $num_attachments; $i++) {\n    $attachment = $_FILES['attachment' . $i];\n\t  // $attachment will have all the parameters expected in a the PHP $_FILES object\n\t  // http://www.php.net/manual/en/features.file-upload.post-method.php#example-369\n  }\n}\n?>\n```\n\n\n## \tEvent Webhook\n\nTo use the Event Webhook, you must first [setup Event Notification]({{root_url}}/for-developers/tracking-events/event/#setup).\n\nIn this scenario, we assume you've set the Event Notification URL to go the endpoint `/parse.php` on your server. Given this scenario the following code will allow you to process events:\n\n```php\n<?php\n$data = file_get_contents(\"php://input\");\n$events = json_decode($data, true);\n\nforeach ($events as $event) {\n  // Here, you now have each event and can process them how you like\n  process_event($event);\n}\n\n```\n\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/python-code-example.md",
    "content": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Python Code Example\ngroup: code-examples\nnavigation:\n  show: true\n---\n\n## \tParse Webhook\n\n<call-out>\n\nWe recommend using our official Python SDK, our client library with full documentation, when integrating with <a href=\"https://github.com/sendgrid/sendgrid-python/tree/master/sendgrid/helpers/inbound\">SendGrid's Inbound Parse Webhook</a>.\n\n</call-out>\n\nIn this example, we want to parse all emails at *address*@email.sendgrid.biz and post the parsed email to http://sendgrid.biz/parse. In this example we will be using Python the Flask framework.\n\nGiven this scenario, the following are the parameters you would set at the [Parse API settings page](https://sendgrid.com/developer/reply):\n\n```\nHostname: email.sendgrid.biz\n```\n\n```\nURL: http://sendgrid.biz/parse\n```\n\n  To test this scenario, we sent an email to example@example.com and created the following code:\n\n```python\nfrom flask import Flask, request\nimport simplejson\napp = Flask(__name__)\n\n@app.route('/parse', methods=['POST'])\ndef sendgrid_parser():\n  # Consume the entire email\n  envelope = simplejson.loads(request.form.get('envelope'))\n\n  # Get some header information\n  to_address = envelope['to'][0]\n  from_address = envelope['from']\n\n  # Now, onto the body\n  text = request.form.get('text')\n  html = request.form.get('html')\n  subject = request.form.get('subject')\n\n  # Process the attachements, if any\n  num_attachments = int(request.form.get('attachments', 0))\n  attachments = []\n  if num_attachments > 0:\n    for num in range(1, (num_attachments + 1)):\n      attachment = request.files.get(('attachment%d' % num))\n      attachments.append(attachment.read())\n      # attachment will have all the parameters expected in a Flask file upload\n\n  return \"OK\"\n\nif __name__ == '__main__':\n    app.run(debug=True)\n\n```\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/segment-sendgrid-source.md",
    "content": "---\nlayout: page\nweight: 100\ntitle: SendGrid Source\ngroup: partners\nseo:\n  description: Learn how to integrate your SendGrid account with Segment.\nnavigation:\n  show: true\n---\n\nBy using [SendGrid Source](https://segment.com/sources/sendgrid/?utm_medium=docs&utm_source=stripe&utm_campaign=sources) with your SendGrid data in your data warehouse, you’ll be able to analyze your email activity (opens, clicks, deliveries, and bounces), lists, and recipients via SQL. Additionally, you can join your SendGrid data with Segment event and other source data you’re already sending to your warehouse, so you can correlate product feature usage with email activity, or tie referral sources into your customer journey analysis.\n\nThis documentation is managed by [Segment](https://segment.com/?utm_medium=docs&utm_source=sendgrid&utm_campaign=sources). If you have any questions please contact Segment's support team at friends@segment.com.\n\n## Getting Started\n\n1. Create a Segment [account](https://segment.com/sources/sendgrid)\n2. Add SendGrid in the “Cloud Apps” Category and enter your credentials\n3. Setup a warehouse by bringing your own or having Segment setup and host\n4. Give the Source a nickname and schema name. _We recommend sticking to something that reflects the source itself, like `SendGrid` for nickname and `sendgrid` or `sendgrid_prod` for the schema name._\n5. You’ll soon see SendGrid data in your data warehouse\n\nNote that you can add multiple instances if you have multiple SendGrid accounts. That’s why we allow you to customize the source’s nickname and schema name!\n\nIn order to pull information about your contacts, we’ll make requests to SendGrid’s API with our [sync component](#sync). So the first step in setting up the integration is to retrieve your API Keys and drop them into the Segment interface. You can create an API Key by navigating to **Settings > API Keys**, clicking **General API Key**.\n\nWe recommend providing read permissions for **Email Activity** and **Marketing Activity**.\n\nFinally, copy the resulting API Key into the Segment interface, taking care to trim any errant trailing spaces from copying and pasting, and press connect.\n\nIn the next step, copy the auto-generated Webhook URL and paste it into SendGrid’s Event Notification settings pane under **Settings > Mail Settings**.\n\nOnce you enable the Event Notification, you’re good to go! Press **Next**, and then **Finish** to wrap up the setup flow.\n\n### Event URL\n\nSendGrid has a single Event URL location. By using the SendGrid source, you will be using your only Event URL location. If you remove a pre-existing URL, then that location will no longer receive events.\n\n## Components\n\n### Sync\n\nSendGrid has a sync component, which means we’ll make requests to their API on your behalf on a 3-hour interval to pull the latest data into Segment. In the initial sync, we’ll grab all the SendGrid objects (and their corresponding properties) according to the [Collections Table]() below. SendGrid objects will be written into a separate schema, corresponding to the source instance’s schema name you designated upon creation.\n\nOur sync component gets resources from SendGrid and forwards them to Segment using an upsert API, so the dimensional data in your warehouse loaded will reflect the latest state of the corresponding resource in SendGrid. For example, if `lists.recipient_count` goes from `100` to `200` between syncs, on its next flush to your warehouse, that tickets status will be `200`.\n\n### Streaming\n\nThe SendGrid source also has a streaming component which listens in real time for inbound webhooks from SendGrid’s Event Notifications and batches the events to be uploaded on your next warehouse flush. These events are only ever appended to your warehouse. At present, there is no way to retrieve email event history from SendGrid, so you will only have access to data that we’ve collected after you successfully enable this component of the source integration.\n\n## Collections\n\nCollections are the groupings of resources we pull from your source. In your warehouse, each collection gets its own table.\n\n**Object** collections are updated with each sync. These are pulled via our sync component.\n\n**Event** collections are append-only, represent a user action or activity, and may be likened to fact tables in a traditional data warehouse.\n\nFor a complete visual breakdown of the SendGrid collections and all their properties, [view the Visual Schema here](https://www.lucidchart.com/invitations/accept/c639887d-09da-4f91-a846-1409f6dd0d56).\n\n<div class=\"table-wrap\">\n\n| Collection  | Type   | Description                                                                                                                                                                                                           |\n| ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| activity    | Event  | The union of all SendGrid **event** tables. Useful for creating funnels                                                                                                                                               |\n| \\_open      | Event  | Recipient has opened the HTML message. You need to enable Open Tracking for getting this type of event.                                                                                                               |\n| click       | Event  | Recipient clicked on a link within the message. You need to enable Click Tracking for getting this type of event.                                                                                                     |\n| bounce      | Event  | Receiving server could not or would not accept message.                                                                                                                                                               |\n| delivered   | Event  | Message has been successfully delivered to the receiving server.                                                                                                                                                      |\n| processed   | Event  | Triggered when the email is processed                                                                                                                                                                                 |\n| dropped     | Event  | You may see the following drop reasons: Invalid SMTPAPI header, Spam Content (if spam checker app enabled), Unsubscribed Address, Bounced Address, Spam Reporting Address, Invalid, Recipient List over Package Quota |\n| deferred    | Event  | Recipient’s email server temporarily rejected message.                                                                                                                                                                |\n| unsubscribe | Event  | Recipient clicked on message’s subscription management link. You need to enable Subscription Tracking for getting this type of event.                                                                                 |\n| spam_report | Event  | Recipient marked message as spam.                                                                                                                                                                                     |\n| lists       | Object | [Groups of contacts](https://sendgrid.api-docs.io/v3.0/contacts).                                                                                                                                                     |\n| segments    | Object | [Slices of lists](https://sendgrid.api-docs.io/v3.0/contacts).                                                                                                                                                        |\n| recipients  | Object | All contacts who have received an email, with information about their past activities and custom activities. [More Info](https://sendgrid.api-docs.io/v3.0/contacts)                                                  |\n\n</div>\n"
  },
  {
    "path": "content/docs/for-developers/tracking-events/troubleshooting.md",
    "content": "---\nseo:\n  title: Troubleshooting the Event Webhook\n  description: Tips and tricks to troubleshoot your SendGrid Event Webhook, including common issues.\n  keywords: event webhook, troubleshooting, events, duplication, load handling, duplicate events\ntitle: Troubleshooting the Event Webhook\ngroup: reference-troubleshooting\nweight: 80\nlayout: page\nnavigation:\n  show: true\n---\n\n## \tGeneral troubleshooting\n\n*Considerations for troubleshooting your Event Webhook instance:*\n\n- Start by making sure your web server is returning a 2xx response to our servers. Any other response type will result in our server retrying a POST until we receive a 2xx response or the maximum time has expired. All events are retried at increasing intervals for up to 24 hours after the event occurs.\n- Next, make sure you are not blocking our IPs that are trying to POST to your server. Our IPs change often since we constantly add more machines.\n- http://httpresponder.com/ is a helpful tool for debugging webhooks.\n- You can use the **Test Your Integration** feature within the Event Notification Setting on the [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) page in the [SendGrid UI](https://app.sendgrid.com) to send simulated events to your callback URL. This will not work if you have basic authentication set in your endpoint URL. You can also send a POST from a shell using cURL - this will give you the full response your server is returning including the HTTP headers:\n\n```bash\ncurl -X POST -H \"Content-Type: application/json\" -d '[{\"email\":\"john.doe@sendgrid.com\",\"timestamp\":1337197600,\"smtp-id\":\"<4FB4041F.6080505@sendgrid.com>\",\"event\":\"processed\"},{\"email\":\"john.doe@sendgrid.com\",\"timestamp\":1337966815,\"category\":\"newuser\",\"event\":\"click\",\"url\":\"https://sendgrid.com\"},{\"email\":\"john.doe@sendgrid.com\",\"timestamp\":1337969592,\"smtp-id\":\"<20120525181309.C1A9B40405B3@Example-Mac.local>\",\"event\":\"processed\"}]'\n```\n\n- If you're not getting a response from your server, follow the steps in [Getting started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) to test your SendGrid instance with Webhook tester. You could also use tools like ngrok, or Runscope.\n\n## \tCommon issues\n\n ### \tDuplicate events\n\n**It is possible to see duplicate events in the data posted by the Event Webhook.**\n\nWe recommend that you use some form of deduplication when processing or storing your Event Webhook data using the `sg_event_id` as a differentiator since this ID is unique for every event where `sg_event_id` is present.\n\nThe `sg_event_id` is a string up to 100 characters that is `Base64url` encoded.\n\n## \tAdditional Resources\n\n- [Getting started with the Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/)\n- [Event webhook reference]({{root_url}}/for-developers/tracking-events/event/)\n- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/)\n- [Webhook web libraries]({{root_url}}/for-developers/sending-email/libraries/)\n- [Getting Started with Keen](https://keen.io/guides/getting-started/)\n"
  },
  {
    "path": "content/docs/glossary/7-bit-encoding.md",
    "content": "---\nseo:\n  title: ASCII Encoding\n  description: 7 bit encoding is the same as ASCII encoding, which is used for storing letters in binary.\n  keywords:\ntitle: 7 Bit Encoding\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n7 bit encoding is a reference to the ASCII character set, which is a set of 128 English alphabet characters and is used to store letters in binary. The set includes\nall the English lowercase letters, uppercase letters, and numbers from 0 to 9.\n\nThe reason for the characters to be encoded to 7-bits, is because early computers handled data in bytes, or 8 bits. The extra bit was originally reserved for error checking.\n\nIn this encoding we get 7 digit representations in 0s and 1s for each of the English letters we are trying to transmit.\n\nSendGrid requires 7 bit encoding in our [SMTPAPI categories header]({{root_url}}/for-developers/sending-email/categories/).\n\nFor more information, visit Wikipedia for the entire [history of ASCII](http://en.wikipedia.org/wiki/ASCII).\n"
  },
  {
    "path": "content/docs/glossary/a-record.md",
    "content": "---\nseo:\n  title: A Record\n  description: The A record links an IP address to a domain\n  keywords: A record, DNS, domain, IP address, Domain Name Service\ntitle: A Record\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nThe A record (address record) links your dedicated IP address to your chosen domain. It does this by mapping your domain to your IP address through records that you export from SendGrid and upload into your DNS host.\n\nIf your domain+ subdomain is `marketing.example.com`, and your dedicated IP address is `101.10.10.101`, setting up the SendGrid A record links your domain with your dedicated IP address - so anything sent over your domain associates with your dedicated IP, and anything sent over your dedicated IP associates with your domain.\n\n\n"
  },
  {
    "path": "content/docs/glossary/account-reputation-dashboard.md",
    "content": "---\nseo:\n  title: Account Reputation Dashboard\n  description: We base your email monitoring reputation on your bounces, blocks, spam, invalid email, and successfully delivered emails.\n  keywords: reputation, email sender reputation, email reputation monitoring\ntitle: Reputation Monitoring\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nOnce logged in to your account, on the left side of your [SendGrid.com](https://sendgrid.com) dashboard, you can find your **SendGrid account reputation**. It's your IP reputation score, which will be somewhere from 0% to 100%. This score will go up or down based on your [bounce]({{root_url}}/glossary/bounces/), [block]({{root_url}}/glossary/blocks/), [spam]({{root_url}}/glossary/spam-reports/) and invalid rates. In other words, this reputation is an indicator of how we view your email sending practices.\n\n![Reputation Monitoring]({{root_url}}/images/Screen_Shot_2015-05-20_at_3.32.24_PM.png \"Reputation indicator\")\n\nIt is important to monitor your global statistics on a daily basis to make sure you keep your IP reputation score high to avoid getting on [deny list]({{root_url}}/glossary/deny-list/).\n\n<call-out>\n\nPlease note that the SendGrid Reputation does not represent your inboxing percentage at mailbox providers.\n\n</call-out>\n\n**How is the SendGrid Reputation Calculated?**\n\nThe SendGrid account reputation is computed based on a calculation of:\n\n- The percentage of delivered requests out of the total amount requested (delivered / requests). This number takes into account bounces, invalid emails, and drops (repeat bounces, unsubscribes, etc.). Please review our [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) article for more detail on these terms.\n\n- Spam Reports. Each spam report is a user actively rejecting your mail and has a strong negative effect.\n\n<call-out>\n\nYou can increase the SendGrid reputation score by removing unengaged users and [dropped addresses]({{root_url}}/glossary/drops/) from your lists before sending. Also be sure you are only sending to users who have opted in to receive your email to help prevent spam reports.\n\n</call-out>\n\n**The Effect of Reputation on your Account**\n\nThe significance of your reputation depends on the plan you chose when creating your SendGrid account. For all plans, if your reputation becomes low enough, our Compliance team may mark your account as \"under review\" and contact you. \n\nIf you're using a Free or Essentials plan, we will put your account in a \"New\" IP cluster initially while we learn your sending habits. After that, you're placed in an IP cluster with other customers with the same reputation range as you. IP clusters keep the good senders together and prevents the poorer senders from harming the good ones.\n\nIf you're a Pro plan or higher, you instead send from a dedicated IP, and our internal reputation metric does not have as much weight. Alternatively, you should keep a closer eye on your _domain reputation_. Domain Reputation is an essential part of how mailbox providers decide whether or not your email lands in the spam folder or the inbox.\n\n<call-out>\n\nLearn more about [Domain Reputation, and why it's important.](https://sendgrid.com/blog/what-is-a-domain-reputation/)\n\n</call-out>\n\n**SendGrid's Reputation Policy**\n\nWe regularly monitor our customers' account reputation for abuse and undesirable sending practices. Our general guidelines for account reputation take into account the following reputation thresholds:\n\n- **Reputation above 80%:** Nice! This percentage indicates a good sending reputation, and there are no issues at this time.\n- **Reputation between 70% and 80%:** This is considered a poor reputation and you should consider taking action to identify and fix problems with your sending practices.\n- **Reputation below 70%:** Accounts with a reputation below 70% may be subject to immediate suspension or termination.\n\n\n<call-out-link linktext=\"EXPERT SERVICES\" img=\"/img/expert-insights-promo3.png\" link=\"https://sendgrid.com/solutions/expert-services/\">\n\n\n### Need a helping hand?\n\n\nGetting into the inbox just so you can have the chance to engage with your customers often isn’t as easy as pressing “send.” Get customized advice from our team of email experts on how to optimize your email strategy.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/ad-exchange.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Ad Exchange\ngroup: glossary\nseo:\n  title: Ad Exchange\n  description: Definition of an Ad Exchange\n  keywords: \nnavigation:\n  show: true\n---\n\n\n## Ad Exchange\n\nAn ad exchange is a place where advertisers and publishers can buy and sell display, video, and mobile ads through a digital marketplace.\n\n\n"
  },
  {
    "path": "content/docs/glossary/ad-impression.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Ad Impression\ngroup: glossary\nseo:\n  title: Ad Impression\n  description: Definition of an Ad Impression\n  keywords: \nnavigation:\n  show: true\n---\n\n## Ad Impression\n\nAt the moment in which an ad is displayed on a web page, it is called an impression.\n\n\n"
  },
  {
    "path": "content/docs/glossary/ad-unit.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Ad Unit\ngroup: glossary\nseo:\n  title: Ad Unit\n  description: Definition of an Ad Unit\n  keywords: \nnavigation:\n  show: true\n---\n\n## Ad Unit\n\nThe ad unit is the container that holds the advertising copy and graphics for a digital advertisement.\n\n"
  },
  {
    "path": "content/docs/glossary/affiliate-marketing.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Affiliate Marketing\ngroup: glossary\nseo:\n  title: Affiliate Marketing\n  description: Definition of Affiliate Marketing\n  keywords: \nnavigation:\n  show: true\n---\n  \n## Affiliate Marketing\n\nCompanies will offer to pay individuals or companies (i.e., affiliates) to promote their products or services in exchange for a commission. This is referred to as affiliate marketing.\n\n"
  },
  {
    "path": "content/docs/glossary/allow-list.md",
    "content": "---\nseo:\n  title: Allow list\n  description: Allow listing refers to granting IPs access to a server or system.\n  keywords: allow list, IP, access, management\ntitle: Allow list\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAllow listing (some services use the term, \"whitelisting\") refers to the process of granting a specific IP address access to a server or system. SendGrid's [IP Access Management]({{root_url}}/ui/account-and-settings/ip-access-management/) is one example of allow listing. IP Access Management is a security feature that allows you to control who can access your SendGrid account based on their IP address.\n\nYou may also hear the term _allow list_ when referring to a list of IP addresses that receive special treatment when sending mail to a specific inbox provider. Email allow lists are becoming less and less common. These days, the best way to ensure your messages land in the inbox is to send mail that you know your recipients will love.\n\nFor more information on deliverability best practices, please visit our [Deliverability Overview]({{root_url}}/ui/sending-email/deliverability/)"
  },
  {
    "path": "content/docs/glossary/automated-email.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Automated Email\nnavigation:\n  show: false\nseo:\n  title: Automated Email\n  override: true\n  description: Automated Email allows you to dynamically send relevant content to individual recipients.\n  keywords: triggered email, automated email, behavior-driven email\n---\n\nAutomated email, also known as [triggered email]({{root_url}}/glossary/triggered-email/) or behavior-driven email is sent when a specific [triggering event]({{root_url}}/glossary/triggered-actions/) occurs or a specific user takes an action that prompts the delivery of the email. While traditional marketing email involves sender-initiated promotional messages sent to a list of recipients, automated email is initiated by user behavior, allowing you to dynamically send targeted, real-time promotional content that is uniquely relevant to an individual recipient.\n\nExamples of email automation include a welcome series [drip campaign]({{root_url}}/glossary/drip-campaign/) that is initiated by a new user sign-up or a win-back campaign to re-engage a lapsed user.\n\nThe ability to send very relevant, timely emails directed to individual recipients makes automated email a uniquely powerful tool for building and nurturing customer relationships, enhancing the image of your brand, and increasing customer engagement.\n\n\n<call-out>\n\nInterested in sending automated email? SendGrid provides [Marketing Campaigns Automation (click here to see more)](https://sendgrid.com/docs/ui/sending-email/getting-started-with-automation/).  This is available for packages using an [\"Advanced\" Marketing Campaigns plan](https://sendgrid.com/pricing/).  \n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/autoresponder.md",
    "content": "---\nseo:\n  title: Autoresponder\n  description: Autoresponders generate email responses to actions and events.\n  keywords: automated email\ntitle: Autoresponder\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn autoresponder is a computer program that generates a response to an email, request, or action. Autoresponders were initially used to notify a sender of an undeliverable email, but now they are often used in email marketing. Autoresponders can give you the ability to send a customer a pre-written email when a specified event takes place, such as a customer creating an account or purchasing a product.\n\n- Autoresponders can be outsourced to an **Application Service Provider** that provides the infrastructure and support for the autoresponder.\n\n- Autoresponders can also be **installed server-side**, giving you complete control while requiring you to provide the infrastructure and technical skill to maintain the autoresponder.\n\n<call-out>\n\nYou can set up an autoresponder with SendGrid, by utilizing the [Inbound Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) and the [v3 Mail Send endpoint](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send).\n\n</call-out>\n\nMore information about autoresponders can be found [here](https://en.wikipedia.org/wiki/Autoresponder).\n"
  },
  {
    "path": "content/docs/glossary/bayesian-filter.md",
    "content": "---\nseo:\n  title: Bayesian Filter\n  description: Bayesian Filtering is a technique for detecting spam.\n  keywords: Bayesian Filter, spam\ntitle: Bayesian Filter\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIf you discover spam that was sent by a SendGrid customer, please [report it to our team](https://sendgrid.com/report-spam/). We appreciate your help in keeping our email stream clean.\n\n</call-out>\n\nThis is a statistical method for determining the probability that an email is spam by looking for the use of words or phrases commonly associated with spam email.\n\nA Bayesian filter detects spam by comparing the words or phrases within the questionable email to a set of known words or phrases associated with spam. Bayesian filtering has a very low rate of false positives and is a tried and true method for filtering spam.\n\nFor more information about Bayesian filtering, refer to this Wiki: [Naive Bayes spam filtering](https://en.wikipedia.org/wiki/Naive_Bayes_spam_filtering).\n\n## Related Articles\n\n- [Spam]({{root_url}}/glossary/spam/)\n- [Spam Filter]({{root_url}}/glossary/spam-filter/)\n- [Spam Reports]({{root_url}}/glossary/spam-reports/)\n- [Spam Trap]({{root_url}}/glossary/spam-traps/)\n"
  },
  {
    "path": "content/docs/glossary/blocks.md",
    "content": "---\nseo:\n  title: Blocks\n  description: Blocked emails happen when your IP address has been added to a deny list or has been blocked by an ISP or messaging organization.\n  keywords: blocks, undelivered email\ntitle: Blocks\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nBlocked messages appear under Email Reports under Blocks. When your IP address has been added to a deny list, or has been blocked by an ISP or messaging organization, the affected email shows up on this list. Typically it is possible to have your IP address removed from a block list, and some lists automatically do this after a period of time.\n\nBlocks are less permanent than Bounces. This is a list of refused messages that were either blocked by an ISP or deferred longer than 72 hours. In addition, SendGrid does not treat the blocks list as a suppression list - subsequent sends to emails on this list will be sent like normal.\n\n\nHaving an entry on the SendGrid block list does not automatically drop email as it does for the bounce and unsubscribe list.\n\nSee the block reason column for more detail specific to the blocked email.\n\n![Blocks]({{root_url}}/images/blocks_1.png)\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n## Additional Resources:\n\n* [Web API & Blocks](https://sendgrid.api-docs.io/v3.0/blocks-api/retrieve-all-blocks)\n"
  },
  {
    "path": "content/docs/glossary/bounces.md",
    "content": "---\nseo:\n  title: Bounces\n  description: Bounced emails are emails that are returned to the server that sent them.\n  keywords: bounced email, bounces, undelivered email, returned email, rejected email\ntitle: Bounces\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA bounce is a message that is returned to the server that sent it. Bounced emails are either a permanent failure to deliver the email or a temporary failure to deliver the email, based on conditions with the recipient mail server.\n\nHard Bounces - A hard bounce is an email message that has been returned to the sender because the recipient's address is invalid. A hard bounce might occur because the domain name doesn't exist or because the recipient is unknown. If an email is on the bounce list, we will auto drop any future requests to this email address.\n\nSoft Bounces - A soft bounce is an email message that gets as far as the recipient's mail server but is bounced back undelivered before it gets to the intended recipient. A soft bounce might occur because the recipient's inbox is full.\n\nIf you want to receive notification of bounces in your application, you can enable the Real-time Event Notification API and SendGrid will alert your application of any bounces, clicks, opens, or otherwise that happen to the emails you send. Alternatively, you can enable Bounce Forwarding within your account to receive an email each time a bounce occurs.\n\nYou can also [retrieve and edit your list of bounces](https://sendgrid.api-docs.io/v3.0/bounces-api/retrieve-all-bounces) through our Web API.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n\n ### Additional Resources:\n\n* [Bounce Forwarding]({{root_url}}/ui/sending-email/bounces/)\n* [Email Activity & Bounces]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n"
  },
  {
    "path": "content/docs/glossary/bulk-email-service.md",
    "content": "---\nseo:\n  title: Bulk Email Service\n  description: Bulk email service is a way to send an email, or multiple emails, to a large list of various recipients.\n  keywords: bulk email service\ntitle: Bulk Email Service\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA bulk email service allows you to send email communications to large lists of multiple recipients by incorporating email into your applications. You can send one email to many people, or a unique email to each person on your list with a bulk email service. Depending on the provider, you can send unique emails to each recipient by providing a template for substituting information (such as a name).\n\nCommonly, bulk email is used for newsletters or marketing email. If you have a list of customers or prospects, you can send them content relevant to their business or interest, from a single application. A bulk email service allows you to send to any list, regardless of its size. The frequency at which you send is entirely up to you, and should be based on what the recipients expect. Your engagement data, including spam reports, unsubscribes, and open and click rates, will tell you whether your message is hitting the mark.\n\nSendGrid is a bulk email service for both marketing email and transactional email (single emails triggered by actions within your application). SendGrid's [bulk transactional email pricing](https://sendgrid.com/pricing?mc=SendGrid%20Documentation) and [bulk email marketing pricing](https://sendgrid.com/pricing?mc=SendGrid%20Documentation) are based on the volume of email you send, not the size of your list. SendGrid provides valuable insights across your entire email program:\n\n* Deliverability rate to ensure your email is getting to the recipient's server\n* Open and click tracking to measure engagement\n* Webhook to notify your application of bounces, unsubscribes, and spam reports\n\nThe bulk email service can be enabled with minimal changes to your application. At the basic level, simply point your SMTP settings to our server and SendGrid will take care of the rest. You can also use our Web API or SMTP API to more deeply integrate into your system.\n\nThe marketing email service allows non-technical users to send bulk newsletters and other bulk emails using a drag-and-drop interface. List management and all aspects of the service are also available via the marketing service API, so developers can connect email to your company's workflow.\n"
  },
  {
    "path": "content/docs/glossary/bulk-mail-folder.md",
    "content": "---\nseo:\n  title: Spam Folder\n  description: Bulk Mail folder is also called “spam” or “junk” folder, the folder where questionable email is routed.\n  keywords: bulk mail folder, spam, junk\ntitle: Bulk Mail Folder\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nThe Bulk Mail Folder is also called the “spam” or “junk” folder, the folder where questionable email is routed.\n\nThere are many factors which determine whether or not a message lands in the Bulk Mail Folder. Each receiving mail server will use its own criteria to determine the quality of each message it receives.\n\nSendGrid offers many [best practices]({{root_url}}/ui/sending-email/deliverability/) to help ensure your message lands appropriately in the inbox. Keep your emails out of the Junk folder by learning more about email deliverability.\n"
  },
  {
    "path": "content/docs/glossary/campaigns.md",
    "content": "---\nseo:\n  title: Campaigns\n  description: Campaigns are used to send custom emails to targeted recipient segments.\n  keywords: campaigns\ntitle: Campaigns\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) are used to send custom email templates to targeted recipient segments. In utilizing the Marketing Campaigns UI or API, one can create a sender identity, upload contacts, set up unsubscribe groups, edit email templates, and create a campaign to send specifically tailored email to different email group segments and boost your email marketing.\n\n"
  },
  {
    "path": "content/docs/glossary/can-spam.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: CAN-SPAM\nnavigation:\n  show: false\nseo:\n  title: CAN-SPAM\n  override: true\n  description: The CAN-SPAM Act lists the guidelines, requirements, and penalties regarding the sending of commercial bulk email.\n---\n\nThe [CAN-SPAM Act of 2003](https://www.ftc.gov/tips-advice/business-center/guidance/can-spam-act-compliance-guide-business) lists the guidelines, requirements, and potential penalties for noncompliance regarding the commercial use of email and the legal rights of recipients of commercial email. CAN-SPAM provides several requirements for commercial senders including, but not limited to:\n\n- Senders may not use false or misleading headers.\n- Senders may not use deceptive subject lines.\n- Senders must give their recipients the option of opting out of commercial email.\n- Senders must honor all opt-out requests.\n\nThis is by no means a complete description of CAN-SPAM, please visit the [CAN-SPAM Act Compliance Guide](https://www.ftc.gov/tips-advice/business-center/guidance/can-spam-act-compliance-guide-business) for more information.\n\n<call-out>\n\nThe guidelines laid out in CAN-SPAM represent the “bare-minimum” regarding sending practices. Following these guidelines does not guarantee delivery to your recipients’ inboxes: CAN-SPAM leaves a considerable amount of room for improvement. Please visit [SendGrid Deliverability Tips and Tricks]({{root_url}}/ui/sending-email/deliverability/) for a more detailed discussion of how you can improve your sending practices.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nCAN-SPAM is not limited to bulk email. Any commercial email communication, including business-to-business and business-to-customer email, is covered by the CAN-SPAM Act.\n\n</call-out>\n\n"
  },
  {
    "path": "content/docs/glossary/categories.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Categories\nnavigation:\n  show: false\nseo:\n  title: Categories\n  override: true\n  description: Paying attention to your deliverability metrics can help optimize your delivery rate and reduce the risk of being seen as a spammer.\n---\n\nCategories help organize your email analytics by enabling you to tag emails you send by topics you define.\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nJust as you can view the statistics on all your activity under the '[Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview)' tab, you can go a step further and view the [statistics broken down to a particular category]({{root_url}}/ui/analytics-and-reporting/categories/).\n\nThe events that can be associated with category include:\n\n- Emails sent\n- Clicks\n- Emails opened\n- Emails bounced\n- Spam Reports\n- Unsubscribes\n\nThe actual statistics included vary depending upon the set of enabled apps. Emails sent, bounces, and spam reports will always get tracked. [Unsubscribes]({{root_url}}/ui/sending-email/subscription-tracking/), [Clicks]({{root_url}}/ui/account-and-settings/tracking/#click-tracking), and Opens require that the associated Setting is enabled. Check out [Settings](https://app.sendgrid.com/settings) to see which apps you have enabled.\n\nIn order to add the X-SMTPAPI categories header, please look at our [SMTP API Categories]({{root_url}}/for-developers/sending-email/categories/) documentation. You can also get a [full category list]({{root_url}}/for-developers/sending-email/categories#get) or get [category specific statistics](https://sendgrid.api-docs.io/v3.0/categories/retrieve-email-statistics-for-categories) from the SendGrid API.\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n### Looking for more visibility into your email performance?\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/glossary/challenge-response.md",
    "content": "---\nseo:\n  title: Challenge Response\n  description: An automated reply to a sender to filter out spammers.\n  keywords: reply, verified sender, email filter\ntitle: Challenge Response\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA challenge–response (C/R) system is a type of filter that automatically sends a reply back with a request to the sender of an incoming email. In the reply, the sender is asked to perform an action to ensure delivery of the original message. \nThe action to be performed is easy to do if you’re an individual, but requires a lot effort if performed in large numbers, in this way effectively filtering out spammers.\nA good example of this is a verification email where you need to click a link to verify your email address to be activated within a new system.\nThis is important with an email system to verify that you are opting in to a system and to make sure that you’re not a spammer.\n"
  },
  {
    "path": "content/docs/glossary/clicks.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Clicks and Unique Clicks\nnavigation:\n  show: false\nseo:\n  title: Clicks and Unique Clicks\n  override: true\n  description: Track the links your customers click from your emails with SendGrid.\n---\n\nSendGrid can replace the links in your email templates with a custom link that when clicked, will redirect your customers to the original link from your template. When the user clicks, SendGrid will record the click event. SendGrid can track 1000 link clicks per email.\n\nIn [Statistics]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/), The “Clicks” percentage is the total number of times your users have clicked on the various links within your emails, divided by the total number of Delivered messages. The “Unique clicks” percentage is the number of unique individuals that have clicked the links in your emails, divided by the total number of Delivered messages. This statistic requires that the Click Tracking feature be enabled under your Tracking Settings.\n\nUsers clicking a SendGrid Unsubscribe link will not count as a Click. However, if you use a third-party unsubscribe link, it will be tracked as a Click.\n\n<call-out>\n\nSendGrid will store tracking data for unique click events for up to 7 days.\n\n</call-out>\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/cname.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: CNAME\nseo:\n  title: CNAME\n  override: true\n  description: The CNAME record creates an alias for subdomain.yourdomain.com and points it to another domain\nnavigation:\n  show: false\n---\n\nThe CNAME record (canonical name record) creates an alias for subdomain.yourdomain.com and points to sendgrid.net. The CNAME is needed for our click and open tracking features in order for those statistics to be routed back to your SendGrid account. This is also what your messages will be signed by, so your recipients will be able see your CNAME.\n\nWhat it should look like:\n\n```\nsubdomain.yourdomain.com. |  CNAME  |  sendgrid.net.\n```\n\nIf your account has a dedicated IP and you are looking to set up [reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/) for your IP, you will need to add some records to your DNS host. In this group of records you will have 1 CNAME record.\n\nIf you are having trouble validating your CNAME record, please see our [sender authentication troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/).\n"
  },
  {
    "path": "content/docs/glossary/complaint.md",
    "content": "---\nseo:\n  title: Complaint\n  description: When an email recipient identifies an email message as spam or junk by clicking the “report spam” or “mark as junk” button within their email reader.\n  keywords: complaint, spam, junk\ntitle: Complaint\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA complaint is when an email recipient identifies an email message as spam or junk by clicking the “report spam” or “mark as junk” button within their email reader.\n\nA sender’s complaint rate is calculated by dividing the total number of emails received by the ISP by the number of complaints reported by that ISP’s customers.\n\nHigher numbers of complaints can negatively impact your [email deliverability]({{root_url}}/glossary/deliverability/).\n\nTo get more information please check out our [Email Infrastructure Guide.](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/ctr.md",
    "content": "---\nseo:\n  title: Click-Through Rate (CTR)\n  description: What is CTR?\n  keywords: CTR, click, rate, tctr, clicks, through\ntitle: Click-Through Rate (CTR)\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n## What is CTR? \t\nCTR stands for \"click-through rate\". CTR is a metric that's used to measure the success of an email campaign. Click-through rates are expressed as a percentage, which SendGrid calculates by taking the number of unique clicks divided by the number of unique opens from an email campaign multiplied by 100.\n\nFor example:\n\nLet's say that you send out a marketing campaign to 1000 recipients, and of those 1000 messages you register 300 unique opens. Then, out of those 300 unique opens, you record 100 unique clicks. This would give your campaign a click-through rate of 33.3%, since 100 clicks divided by 300 opens equals 0.333 multiplied by 100.\n\n## TCTR \t\nSendGrid has also added total click-through rate (TCTR) as a metric for marketing emails, which is expressed as the total number of clicks divided by the total number of opens. A higher TCTR means that more of your recipients have opened and clicked through your messages more than once.\n\n## Why is CTR important? \t\nClick-through rates help determine the relative success or failure of an email campaign based on the engagement of your recipients. The higher the click-through rate, the more successful an email campaign is considered to be. However, there is no standard value for what constitutes an ideal click-through rate because there are many different factors that can affect the click-through rate of an email such as the type of email being sent, the sending frequency, your company's industry, and even the time of day.\n\n## My CTR seems low, what can I do to change that? \t\nAs mentioned before, click-through rates can vary between campaigns depending on a lot of different factors; however, the three most significant aspects that affect click-through rates are message content, sending frequency, and overall consistency.\n\n ### Message Content \t\nMake sure that the content of your emails is to the point and relevant to your subject line. Keep your paragraphs short whenever possible, ideally no more than 3 to 4 concise sentences. Do not use images frivolously. You should try to convey your updates primarily through text, as too many images in an email body can make a message take longer to load and/or might make it look suspicious at a first glance (since many email clients do not load images within messages by default).\n\n ### Sending Frequency \t\nBe up front with your recipients regarding your sending rates. If you tell your users that you will send out one newsletter every week, then it's important to stick to that schedule. Better still, give your recipients options, such as the ability to choose between a weekly and a monthly newsletter.\n\n ### Consistency \t\nEnsure that all of your emails are consistent. If you decide to pick a common theme, color, or font style, then you should use it across all of your campaigns so that your recipients know what to expect from you. It's also important to keep the information within your messages relevant to your company and your industry.\n\nRemember, email marketing is not an exact science. Since there is no average value to shoot for, CTRs can vary wildly between companies and across industries, so it's best to keep an eye on your email campaigns and adjust your messages and sending practices accordingly. Find information about the [best sending practices](http://sendgrid.com/blog/best-practices/ \"Link: http://sendgrid.com/blog/best-practices/\") and more details on how to improve your [deliverability](http://sendgrid.com/blog/deliverability/ \"Link: http://sendgrid.com/blog/deliverability/\") over on our [blog](http://sendgrid.com/blog/).\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n\n"
  },
  {
    "path": "content/docs/glossary/custom-fields.md",
    "content": "---\nseo:\n  title: Custom Fields\n  description: Custom fields allow you add extra information about your contacts to your contact database.\n  keywords:\ntitle: Custom Fields\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/) allow you to add extra information about your contacts to your contact database. With custom fields, you can create custom segments from your individual contacts or from your contact database that will dynamically update your content with the values for the individual contact receiving the email. Your custom fields are completely customizable to the use cases and user information that you need.\n\nFor more information about Custom Fields, please see our [documentation]({{root_url}}/ui/managing-contacts/custom-fields/).\n"
  },
  {
    "path": "content/docs/glossary/deferrals.md",
    "content": "---\nseo:\n  title: Deferral\ntitle: Deferral\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA deferred status can occur when an ISP or mailbox provider is for some reason not ready to accept email from your IP address. Instead of blocking or bouncing the message, the provider will defer or temporarily delay receiving the message and wait for the email to be resent.\n\nThere are several reasons a provider will give this feedback. Some common reasons are that the provider does not recognize the IP from which a message originates; or it could just be that their system is operating in such a way that they cannot accept the email at that specific time. If, upon your resending, the provider determines that it is ready to trust you as a sender or their system operations are back to normal, the email will be accepted.\n\nSendGrid will retry delivery of a deferred email on behalf of our customers for 72 hours from the time of the first deferral, after which time the email address will be placed on the Block Suppression list. If you have built your own email solution, you will want to build this intelligence into your code in order to avoid having to retry deliveries manually.\n"
  },
  {
    "path": "content/docs/glossary/deliverability.md",
    "content": "---\nseo:\n  title: Deliverability\n  description: Email deliverability is a critical component for all email communication with customers. Strong deliverability is a necessity for any web application.\n  keywords: email deliverability\ntitle: Deliverability\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nDeliverability represents your sent emails being delivered to your recipient’s inbox as intended. Strong deliverability is critical for any company, as email is the primary method of communication to customers. Your delivery rate is the total number of emails successfully delivered to the ISPs divided by the total number of emails sent.\n\nThe higher your delivery rate and the more emails that make it to the inbox, the better the response will be to your messages. Whether you drive revenue from email, or have goals for new user acquisition, engagement, or customer retention, paying close attention to your email deliverability is key.\n\nGood email deliverability is influenced by a lot of factors, including having a good sending reputation, signing your mail, keeping clean lists, sending wanted content, and much more. There are some standard email deliverability best practices that you should follow to make sure that your emails reach the inbox. These include:\n\n* Building your sender reputation\n* Securing your infrastructure\n* Authenticating your mail streams\n* Monitoring your sending data\n* Sending wanted mail\n\nSendGrid helps you [achieve strong email deliverability](https://sendgrid.com/solutions) by providing these services:\n\n* Reputation monitoring\n* ISP monitoring\n* ISP Outreach\n* SPF and DKIM\n* Spam Filter Testing\n* Dedicated IP Addresses\n* Bulk Sender Notification\n* Feedback Loops\n* Real-time analytics\n* Open and click tracking\n\nSendGrid also has a world-class support team that is available 24/7 via chat, phone, and email to address any of your email deliverability needs.\n\nIf email drives your business, then paying close attention to your email deliverability rates is an undeniable key to your success. Let SendGrid help you achieve that success. To learn more about how email deliverability affects your business, download our free [Email Deliverability Guide](https://sendgrid.com/marketing/guide-2019-deliverability-guide/).\n\n\n\n<call-out-link linktext=\"EXPERT SERVICES\" img=\"/img/expert-insights-promo3.png\" link=\"https://sendgrid.com/solutions/expert-services/\">\n\n"
  },
  {
    "path": "content/docs/glossary/deliveries.md",
    "content": "---\nseo:\n  title: Delivery\n  description: A delivery is recorded when a request to send an email results in the delivery of that email to the end recipient.\n  keywords: Delivery, email delivery, statistics, email statistics\ntitle: Delivery\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA delivery is recorded when a request to send an email results in the email being accepted by the receiving server. However, this does not necessarily mean that the message reached the recipient’s inbox. Some users and some email applications may filter the email away from the inbox even though the email was delivered to (read: accepted by) the recipient email server.\n\nIf an email is indicated as delivered you can be certain that it was not deferred by the ISP.\n\nRelated to delivery is deliverability, which is the measurement of email that reaches the inbox. So while an email could be \"delivered\" (i.e. accepted by the recipient email server), 100% \"deliverability\" would only be achieved if that email was then delivered to the recipient's inbox.\n\nVisit [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) to find more information about all the statistics SendGrid provides.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/demand-side-platform.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Demand-Side Platform (DSP)\ngroup: glossary\nseo:\n  title: Demand-Side Platform (DSP)\n  description: Definition of a Demand-Side Platform (DSP)\n  keywords: \nnavigation:\n  show: true\n---\n\n## Demand-Side Platform\n\nA demand-side platform or DSP allows advertisers to bid on individual impressions level across multiple ad exchanges in real-time. It is usually more cost effective to purchase ads on a DSP than on an ad exchange.\n\n\n"
  },
  {
    "path": "content/docs/glossary/deny-list.md",
    "content": "---\nseo:\n  title: Deny list\n  description: A list of IP addresses that are known to send unsolicited or unwanted emails\n  keywords: email deny list, deny list, spam, unsolicited emails, unwanted emails\ntitle: Deny list\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA deny list (some services use the term, \"blacklist\") is a list of IP addresses that have been detected sending unsolicited and unwanted emails. Inbox service providers (like Gmail, Microsoft, Yahoo, and AOL) and enterprises use deny list to identify and filter illegitimate mail streams. Specific sending domains, in addition to sending IPs, can also be added to a deny list.\n\nAll major ISPs use some form of deny listing service to protect their customers from malicious emails, although the deliverability impact can vary depending on the service that lists the IP. If you find that your IP address is on the deny list of one the many legitimate services, then submit a delisting request.\n\nSendGrid keeps a close eye on our IP’s, and we try as quickly as possible to resolve any issues with deny lists. However, getting your IP off the deny list often requires the user sending the mail to contact the ISP.\n\n## \tDelisting Shared IP Plans\n \t\nWhen on a Free or Essentials plan, your account is using shared IP pools - you are sharing IP addresses with many other customers, and there is the potential of being adversely affected by senders in the same pool.\n\nWhen one of the shared IP pools is added to a deny list, SendGrid receives an automatic notification and handles the delisting request on behalf of our customers. Removal time varies depending on the list.\n\n<call-out>\n\nSendGrid is unable to move your account to a new IP pool. The best way to not be impacted by other senders is to get a dedicated IP on a Pro or higher plan.\n\n</call-out>\n\n## \tDelisting Dedicated IP Plans\n \t\nWe ask that our dedicated IP plan users make the initial delisting request if they discover their\nSendGrid IP on a deny list. SendGrid is happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated.\n\n<call-out>\n\nIf a sending domain (and not the IP address) is blocked, that domain’s controller is responsible for handling the delisting request.\n\n</call-out>\n\n## \tChecking Your IP Address\n\nHere are 2 aggregation websites that anyone can use to check on the status of their IP:\n- [MulitRBL](http://multirbl.valli.org/)\n- [MXToolbox](http://www.mxtoolbox.com/blacklists.aspx)\n\n## \tDelisting Request Forms\n \t\nBelow are links to the delisting forms used by the more popular external deny listing services:\n- [AOL](https://postmaster.aol.com/sa-ticket)\n- AT&T - *email abuse_rbl@abuse-att.net*\n- [Barracuda](http://www.barracudacentral.org/rbl/removal-request)\n- [CASA](http://www.anti-spam.org.cn/?Locale=en_US)\n- [Comcast](http://postmaster.comcast.net/block-removal-request.html)\n- [Google](https://support.google.com/mail/contact/msgdelivery)\n- [Invalument](http://www.invaluement.com/removal/)\n- [Manitu](http://www.dnsbl.manitu.net/index.php?language=en)\n- [McAfee](https://www.mcafee.com/enterprise/en-us/threat-center/threat-feedback.html)\n- [Mimecast](http://www.mimecast.com/senderfeedback)\n- [Office 365](https://sender.office.com/)\n- [SORBS](http://www.sorbs.net/)\n- [SpamCop](https://www.spamcop.net/bl.shtml)\n- [Spam Rats](http://www.spamrats.com/removal.php)\n- [Spamhaus](https://www.spamhaus.org/lookup/)\n- [SURBL](http://www.surbl.org/surbl-analysis)\n- [Trend Micro](https://www.ers.trendmicro.com/)\n- [URIBL](https://admin.uribl.com/)\n- [Yahoo](http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html)\n\n## \tGmail, Yahoo, Hotmail, and AOL Bulk Email Sender Guidelines\n \t\n- [Gmail Email Sender Guidelines](https://support.google.com/mail/answer/81126)\n- [Yahoo Email Sender Guidelines](https://help.yahoo.com/kb/mail-for-desktop/SLN3435.html?impressions=true)\n- [Hotmail/Outlook/Live Bulk Email Sender Guidelines](https://mail.live.com/mail/policies.aspx)\n- [AOL Bulk Email Sender Guidelines](https://postmaster.aol.com/best-practices)\n\nIf you are sending mail using these guidelines and still have problems delivering email to those email providers, you can contact the ISP support by the following URL:\n\n- [Gmail Bulk Sender Contact Form](https://support.google.com/mail/contact/bulk_send_new?visit_id=1-636427436775630765-3555263264&rd=1)\n- [Yahoo Bulk Sender Contact Form](http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html)\n- [Hotmail Deliverability Issue Submission](https://mail.live.com/mail/services.aspx)\n- [AOL Allow Listing Process](https://postmaster.aol.com/whitelist-request)\n\n<call-out type=\"warning\">\n\nIf a listing service ever asks you pay a fee for a delisting request, or if they say that they do not accept delisting requests, then you should not waste your time or money trying to get your domain/IP delisted because these services are rarely, if ever, used by ISPs.\n\n</call-out>\n\n<call-out>\n\nLooking for customized expert advice to improve your email program? Our team of email experts can help you create a plan to ensure you're optimizing your email delivery and engagement, and avoiding future issues like deny lists. Learn more on our [Expert Services](https://sendgrid.com/solutions/expert-services/) page.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/direct-response-advertising.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Direct Response Advertising\ngroup: glossary\nseo:\n  title: Direct Response Advertising \n  description: Definition of Direct Response Advertising\n  keywords: \nnavigation:\n  show: true\n---\n\n## Direct Response Advertising\n\nDirect response is a form of advertising that encourages or prompts viewers of a digital advertisement to take immediate action or engage with the ad directly. For examples, direct response ads will elicit the user to sign up for a mailing list, purchase something, or provide feedback.\n\n"
  },
  {
    "path": "content/docs/glossary/dkim.md",
    "content": "---\nseo:\n  title: DKIM\n  description: DKIM is an email authentication protocol that helps ISPs better identify legitimate email senders.\n  keywords: dkim, domainkeys identified mail, dkim signature, enable dkim\ntitle: DKIM\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nDomainKeys Identified Mail (DKIM) is a validation method designed to help Internet Service Providers detect and prevent malicious email delivery. Because email has no built-in authentication mechanisms, it’s often spoofed in an attempt to extract information from a message’s recipient.\n\nDKIM uses [public-key cryptography](https://www.twilio.com/blog/what-is-public-key-cryptography) to sign [email message headers](/glossary/header/)—optionally, the message body may also be signed. This signature allows receiving email servers to determine whether a message was sent by a domain owner and whether the message was altered in transit.\n\n## How does DKIM Work?\n\nDKIM is implemented using a [TXT](https://en.wikipedia.org/wiki/TXT_record) DNS record. The TXT record provides the public key that receiving mail servers use to verify the authenticity of a message.\n\nOne way to understand the DKIM process is to pretend you’re mixing paint. Your private key contains one mixing color like red. Your public key contains another mixing color like blue and the final mixed color, purple.\n\nLet’s say you publish a public key that contains a mixing color, blue, and the final color, purple. Your private key is the color red, but only you know this. When you send a message, it will be signed with the color red.\n\nWhen an email server receives a message from your domain, it will look up your public key and attempt to solve the puzzle. By combining the public mixing color, blue, with the message signature, red, the receiving server can be confident the message is from you because the result will be purple, the solution published in the public key.\n\nCryptography uses the same idea of formulas that are easy to calculate in one direction, like mixing paint, but really hard to reverse unless you have one of the inputs. Instead of paint, digital security methods like DKIM use large numbers and [trapdoor](https://en.wikipedia.org/wiki/Trapdoor_function) one-way functions.\n\n![Public Key Cryptography illustration]({{root_url}}/img/public_key_cryptography.png \"Public Key Cryptography\")\n\n_Alice encrypts a message with her private key, then sends the message to Bob. Bob decrypts the message with Alice's public key. Since the public key can only be used to decrypt messages signed with Alice's private key, we can trust that Alice was the author of the original message_.\n\n## DKIM and SendGrid\n\nSendGrid automatically enables DKIM for all email to improve your email deliverability, whether you’re on a shared IP or a dedicated one. This is just one more example of how SendGrid helps thousands of customers follow email best practices to ensure maximum delivery for their emails. For more information, see [DKIM Records Explained]({{root_url}}/ui/account-and-settings/dkim-records/).\n"
  },
  {
    "path": "content/docs/glossary/dmarc.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: DMARC\nnavigation:\n  show: false\nseo:\n  title: DMARC \n  override: true\n---\n\nDomain-based Message Authentication, Reporting and Conformance (DMARC) is a standard for determining the authenticity of the person or service sending email on behalf of a domain. DMARC attempts to minimize email [spoofing]({{root_url}}/glossary/spoofing/) by building on top of existing authentication standards.\n\n## Domain-based Message Authentication\n\nDMARC supplements [DomainKeys Identified Mail (DKIM)]({{root_url}}/glossary/dkim/) and [Sender Policy Framework (SPF)]({{root_url}}/glossary/spf/), neither of which provide complete spoofing prevention on their own. DKIM and SPF handle the domain-based message authentication portion of DMARC.\n\nDKIM cryptographically signs messages. SPF defines the IP addresses approved to send email on a domain. For more about DKIM and SPF, see [DKIM Records Explained](/ui/account-and-settings/dkim-records/) and [SPF Records Explained](/ui/account-and-settings/spf-records/).\n\n## Reporting and Conformance\n\nA DMARC record is implemented using a [TXT](https://en.wikipedia.org/wiki/TXT_record) DNS record. The tags in this TXT record tell receiving email servers how to handle email that fails either or both DKIM and SPF checks. The DMARC record also tells receiving servers where to send reports about the failures. The ability to provide receiving email servers with failure handling instructions and the opportunity to receive failure reports is incredibly valuable for domain owners. The information can be used to track down the people and services sending email on behalf of your domain, which is a first step in understanding your [sender reputation]({{root_url}}/glossary/reputation-monitoring/). This feedback loop is unique to the reporting and conformance mechanisms of DMARC.\n\n## DMARC in detail\n\nDMARC is a powerful tool for understanding your sender reputation. For more information about DMARC, see [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/) where we cover DMARC in detail.\n"
  },
  {
    "path": "content/docs/glossary/dns.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: DNS\nnavigation:\n  show: false\nseo:\n  title: Domain Name System (DNS)\n  override: true\n---\n\nDomain Name System (DNS) translates a domain name into an IP address to find the owner’s site.\n\nLet's say that you type the URL www.sendgrid.com into your browser. The browser contacts a DNS server to get the IP\naddress. A DNS server would start its search for an IP address by contacting one of the root DNS servers. The root servers\nknow the IP addresses for all of the DNS servers that handle the top-level domains (.COM, .NET, .ORG, etc.). Your DNS\nserver would ask the root for www.sendgrid.com, and the root would say, \"I don't know the IP address for www.sendgrid.com,\nbut here's the IP address for the .COM DNS server.”\n\nYour name server then sends a query to the .COM DNS server asking it if it knows the IP address for www.sendgrid.com. The\nDNS server for the COM domain knows the IP addresses for the name servers handling the www.sendgrid.com domain, so it returns those.\n\nYour name server then contacts the DNS server for www.sendgrid.com and asks if it knows the IP address for www.sendgrid.com.\nIt actually does, so it returns the IP address to your DNS server, which returns it to the browser, which can then contact the\nserver for www.sendgrid.com to get a Web page.\n\nFor more information:\n\n* [CNAMES]({{root_url}}/glossary/cname/)\n* The SendGrid [Email Infrastructure Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n* [DNS in Wikipedia](https://en.wikipedia.org/wiki/Domain_Name_System)\n\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/domain-authentication.md",
    "content": "---\nseo:\n  title: Domain authentication\ntitle: Domain authentication\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nDomain authentication shows email providers that SendGrid has your permission to send emails on your behalf. To give SendGrid permission, you point DNS entries from your DNS provider (like GoDaddy, Rackspace, or Cloudflare) to SendGrid. Your recipients will no longer see the “via sendgrid.net” message on your emails.\n\nEven though this is a small change from your recipients' perspective, this change has a huge positive impact on your reputation as a sender and your email deliverability. Email service providers distrust messages that don't have domain authentication set up because they can not be sure that the message comes from you. Explicitly stating that it comes from you increases your reputation with email service providers which makes it much less likely that they will filter your mail and not allow it get to your recipient's inbox, which increases your deliverability. You are also explicitly showing your recipients that this email comes from you, so they are less likely to mark your mail as spam.\n\n<call-out>\n\nIn an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS.\n\n</call-out>\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n\n\n## \tAdditional Resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n"
  },
  {
    "path": "content/docs/glossary/domain.md",
    "content": "---\nseo:\n  title: Domain\n  description: A named internet address that resolves to an IP address\n  keywords: domain, url, domain name\ntitle: Domain\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA domain is a named Internet address that resolves to the numbered Internet Protocol (IP) addresses computers use to connect. Examples: sendgrid.com, yourdomain.com, google.com. Simply put, it’s the web address your users type into their browser to learn about your company.\n\nIf you are on a Pro 100k or above plan you will have your very own dedicated IP address which we encourage you to [set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n\n## \tSMTP Domain\n \tAn example of one of the SendGrid domains is our SMTP domain: `smtp.sendgrid.com`\n\n## \tMore Information\n\nFor more information, please read our [Email Infrastructure Guide.](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/drip-campaign.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Drip Campaign\nnavigation:\n  show: false\nseo:\n  title: Drip Campaign\n  override: true\n  description: Drip Campaigns are a type of automated email marketing strategy.\n---\n\nA drip campaign is a type of automated [email marketing strategy]({{root_url}}/glossary/email-marketing/) that involves sending a recipient a series of pre-written messages according to a predetermined schedule. This schedule is often\ninitiated by certain events in the recipient’s lifecycle as a customer, such as registering for\na service or purchasing a product. Drip campaigns are used to generate or increase customer engagement over a\nperiod of time.\n\nDrip campaigns help you to send relevant and well timed emails that your customers are likely interested in\nseeing. Striving to send emails that are relevant to your recipients can help to improve your [sender\nreputation](https://sendgrid.com/blog/what-is-a-domain-reputation/), cultivate customer satisfaction, and increase customer retention.\n\n<call-out>\n\nInterested in sending automated drip campaigns? Doing so is simple with Marketing Camapigns Automation. Click [Marketing [new] in your account](https://mc.sendgrid.com/automations) to try this feature for free today.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/drops.md",
    "content": "---\nseo:\n  title: Drops\ntitle: Drops\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nIn certain cases, SendGrid will “Drop” a message to a specific email address in order to protect your sender reputation. SendGrid keeps Email Lists to track bounces, spam reports, and unsubscribes for each of our users. If a user sends a message to an email address that exists on one of these lists within their account, SendGrid will automatically drop the message (i.e., not send to the address).\n\n<call-out>\n\nSendGrid users can always delete entries from these lists if an email address is erroneously placed on one or more of them. Users can accomplish this by mousing over the entry for an address and clicking the “Delete” button.\n\n</call-out>\n\n## \tIdentifying Drops\n\nOn the [Global Statistics Dashboard]({{root_url}}/ui/analytics-and-reporting/global/), the Drops can also be identified as Repeated Bounces, Repeated Spam Reports, Repeated Unsubscribes and Invalid Emails:\n\nYou will also find drops in your [Email Activity](https://app.sendgrid.com/email_activity). Clicking on the event, will show more details about it, including the reason for which the email was dropped.\n\n<call-out>\n\nIf the email address is on the Unsubscribe list the reason will say \"Unsubscribed Address\"; if on the Spam report list, it will say \"Spam Reporting Address\" and if on the Invalid Emails list, it will say \"Invalid\".\n\n</call-out>\n\n## \tOther reasons for dropped emails:\n\n1. Email triggers SendGrid's spam filters if you have the [Spam Checker filter]({{root_url}}/ui/account-and-settings/mail/#spam-checker) enabled. You can identify these drops only through the data received through the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) or in [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/). In both cases, the reason displayed will say \"Spam Content\".\n\n2. The SMTPAPI header is built incorrectly - this will cause the emails to be dropped with the reason \"Invalid SMTPAPI header\". For more details about how to build the SMTPAPI header, please view our documentation on [SMTP API]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/).\n\n3. Duplicate message - emails are dropped with this reason only when they are sent through the Marketing Email App or through the Marketing API. If a recipient's address is showing on multiple lists and you assign those lists to one campaign, our systems automatically identify that the address is on multiple lists and drops the duplicate messages. This prevents having the same message sent to the same recipient multiple times.\n\n## \tHow to remove Drops\n\nIf you would like us to attempt to deliver messages to a specific address again, please delete that address from the suppression list. On the suppression list page, you can remove an address from the bounces list. Then you will be able to send future messages without us intervening on your behalf; you're essentially telling us that this address should be fine, but something went wrong and you'd like to try again.\n\n<call-out>\n\nSendGrid cannot re-send messages that have been dropped or appear on suppression lists, but will attempt future deliveries once the address has been removed from the list and is sent to again.\n\n</call-out>\n\n**Since SendGrid has my back, and my reputation is not affected by these Drops, why should I care about removing them?**\n\nYour lists will be cleaner and even if we do drop the messages intended to addresses that are already on one of the suppression lists, we do accept and process these requests before we drop them. Since this is the case, dropped emails will still count towards your monthly plan email limit.\n\n ### \tCleaning your lists\n\nWe recommend using the [Web API]({{root_url}}/api-reference/) to export any of the suppression lists. Once you export that data, you can use it to clean your distribution lists.\n\n"
  },
  {
    "path": "content/docs/glossary/email-api-integration.md",
    "content": "---\nseo:\n  title: Email API Integration\n  description: Email API integration allows senders to easily sync their email service provider with their platform and software tools to automate key functions\n  keywords: email api integration, email api\ntitle: Email API Integration\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nEmail API integration allows you to connect your email service provider to your own platform and your marketing, sales, or CRM tools. In doing so, you can sync data and create hybrid, customized systems that empower your workforce and leverage your technology via a single interface.\n\nThe term API stands for Application Programming Interface. It’s essentially a language and message format that allows communication between the web application and the program that provides the services for the web app. With email API integration, you can simply define the parameters passed between your Email Service Provider (ESP) using some business logic and code, and set up advanced functionality between 2 or more separate applications.\n\nThe main benefit of email API integration is automation. Depending on your ESP, you can use different types of email APIs to synchronize data or content, and automate many functions so you can spend less time administering your email programs. For example, by syncing your ESP with your web app, you can automatically remove emails with spam complaints from your entire database. Or, pull email response data from your ESP into your platform and deliver comprehensive reports to your team – all with a simple email API integration.\n\nWhen evaluating your email API integration needs, look for ESP providers with robust APIs with high performance. Try to determine your needs for the future, as you will likely want advanced customization as your grow. Do you want to sync your contacts, merge your analytics, send triggered emails in response to user actions, or cleanse your database based on a set of conditions? Once you determine what you want to do, identify the tools that need to speak to each other in order for the email API integration to work flawlessly.\n\nSendGrid provides a series of flexible web and SMTP APIs for easy email API integration for both transactional email and marketing email. We have a series of APIs, each of which provide comprehensive solutions to customize and power your platform, including:\n\n* [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) – This will notify a URL via HTTP POST of events that occur as SendGrid processes email. Most Event Webhook users automatically remove unsubscribes, determine unengaged recipients, identify bounced addresses, or react to spam reports.\n* [Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) – Parses the attachments and contents of incoming emails and POST the parsed email to a URL. This allows users to receive mail from any of the addresses on their recipient list.\n* [SMTP API]({{root_url}}/for-developers/sending-email/building-an-smtp-email/) – Allows users to specify custom-handling instructions for their email through a header inserted into the body of the message. The header can be added to any SMTP message sent to SendGrid.\n* [Web API]({{root_url}}/api-reference/) – Allows SendGrid customers to retrieve information and statistics about their account, including spam reports, bounces, and unsubscribes.\n\nAll APIs are fully documented and many provide examples for you to test even the most complex email API integration scenarios. Moreover, our systems are set up to process thousands of requests each minute ensuring that you can power your app with the greatest speed and reliability. Bring your platform to the next level by integrating with SendGrid.\n"
  },
  {
    "path": "content/docs/glossary/email-authentication.md",
    "content": "---\nseo:\n  title: Email Authentication\n  description: Technical standards to help ISPs and other receivers validate the identity of an email sender.\n  keywords: authentication, SPF, DKIM, SenderID\ntitle: Email Authentication\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nEmail authentication refers to technical standards that help ISPs and other receivers validate the identity of an email sender. There are three authentication standards in use: [SPF]({{root_url}}/glossary/spf/) developed by AOL, [Sender ID]({{root_url}}/glossary/sender-id/) developed by Microsoft and [DKIM]({{root_url}}/glossary/dkim/) developed by Yahoo!.\n"
  },
  {
    "path": "content/docs/glossary/email-harvesting.md",
    "content": "---\nseo:\n  title: Email Harvesting\n  description: Email harvesting is the process of obtaining lists, either by purchase or theft, of valid email addresses for the purpose of sending bulk email or spam\n  keywords: email harvesting, spam, email lists, malicious email practices\ntitle: Email Harvesting\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n\nEmail harvesting is the process of obtaining lists, either by purchase or theft, of valid email addresses for the purpose of sending bulk email or spam, or in malicious instances, phishing attempts.\n\nSpammers may use bots to find valid email addresses on the Internet by spidering web pages. The CAN-SPAM Act of 2003 made it illegal to harvest email addresses via these automated means, and to sell or give away lists of recipients gathered for legitimate purposes.\n\nThe email addresses of your customers are valuable, so SendGrid takes the security of your send lists very seriously.\n\nFor tips on getting your messages to the Inbox, please see our [email deliverability page]({{root_url}}/ui/sending-email/deliverability/).\n"
  },
  {
    "path": "content/docs/glossary/email-marketing.md",
    "content": "---\nseo:\n  title: Email Marketing\n  description: Email Marketing represent the email communications sent to promote a commercial product or service.\n  keywords: email marketing\ntitle: Email Marketing\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nEmail Marketing (also known as commercial or promotional email) as defined by the CAN-SPAM Act is any message in which the primary purpose “advertises or promotes a commercial product or service, including content on a website operated for a commercial purpose.” Examples of email marketing include:\n\n- Coupons\n- Newsletters\n- [Peer Initiated Invitations]({{root_url}}/glossary/peer-invitations/)\n- Product Announcements\n- Promotional Emails\n- [Reconfirmation Email Campaigns]({{root_url}}/glossary/reconfirmation/)\n- Special offers\n\nEmail marketing attempts to encourage the recipient to take an action like making a purchase, downloading content, registering for a service, attending an event, or visiting a store. Since the intent of email marketing is to promote a commercial product or service, it must adhere to certain legal requirements defined in the CAN-SPAM Act that were specifically developed to protect consumers and help senders provide the best possible email experience.\n\nFollowing email best practices in your marketing emails can yield great rewards and doesn’t have to be difficult. Great content along with quality sending and data collection practices present prime opportunities for email marketing to yield high response rates that drive your customer acquisition strategy.\n\nSendGrid can help you achieve your email marketing goals with our [Marketing Email Service](https://sendgrid.com/solutions/email-marketing). This service provides the following and much more:\n\n- [Pre-designed email templates]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/)\n- [Importing Custom HTML With Drag & Drop Markup]({{root_url}}/ui/sending-email/editor/#importing-custom-html-with-drag--drop-markup)\n- [Ability to use your own HTML]({{root_url}}/ui/sending-email/editor/)\n- [Powerful analytics]({{root_url}}/ui/analytics-and-reporting/stats-overview/)\n- [A/B testing]({{root_url}}/ui/sending-email/a-b-testing/)\n- [List Segmentation]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\n\nThis level of visibility into your email marketing performance is invaluable when it comes to determining what resonates best with your audience. Overall, the key to a successful email marketing is that it drives an action. You should strive to provide relevant content by using segmentation strategies to tailor your communications. This is best achieved by testing your design, content, and offers to determine what resonates best with your subscribers.\n"
  },
  {
    "path": "content/docs/glossary/email-service-provider.md",
    "content": "---\nseo:\n  title: Email Service Provider\n  description: An email service provider provides transactional and marketing email services.\n  keywords: Email service provider, ESP\ntitle: Email Service Provider\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn Email Service Provider (ESP) is a service organization that provides transactional and/or marketing email services.\n\nMost ESPs include features that allow customers to:\n\n- Upload and maintain subscriber lists\n- Schedule and send marketing campaigns\n- Manage transactional email\n- Improve email deliverability\n- Monitor statistics of your email campaigns\n\nESPs like SendGrid also provide expertise on increasing your [email deliverability]({{root_url}}/glossary/deliverability/), preserving your sending reputation. They may utilize features and tools to accomplish this, such as:\n\n- [Reverse DNS]({{root_url}}/glossary/reverse-dns/)\n- [Dedicated IPs](https://sendgrid.api-docs.io/v3.0/ip-addresses)\n- [IP warming]({{root_url}}/ui/sending-email/warming-up-an-ip-address/)\n\nAn ESP may provide email services via a user interface (UI), or may also be an [SMTP provider]({{root_url}}/glossary/smtp-provider/). SendGrid provides both services.\n"
  },
  {
    "path": "content/docs/glossary/event-webhook.md",
    "content": "---\nseo:\n  title: Event Webhook\n  description: Event Webhooks provides data about the email you send when the user takes an action.\n  keywords: event webhook, webhooks\ntitle: Event Webhook\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA webhook is an HTTP callback that allows a web application to POST a message to a URL when certain events take place. Often called “Reverse APIs,” Webhooks can be used to receive data in real time, pass it on to another application, or process the data faster than traditional APIs.\n\nSome of the traditional APIs that SendGrid provides include:\n\n* [SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/) – Provides custom handling instructions for email headers within messages.\n* [Web API]({{root_url}}/api-reference/) – Allows users to retrieve account information like bounces, unsubscribes, or spam reports.\n* [Marketing Email API](https://sendgrid.com/email-marketing) – Offers developers the ability to manage the lists, identities, and delivery events for marketing emails.\n* [Template Engine API](https://sendgrid.com/transactional-email) – Provides a way for marketers and developers to create, iterate, and deploy transactional email templates.\n\nWhile webhooks are traditionally more complex to set up, the speed and efficiency of webhooks have increased their popularity in the developer community. There are 3 main types of webhooks:\n\n* <strong>Push Webhooks</strong> – Enables users to receive data in real time.\n* <strong>Pipe Webhook</strong> – Not only enable the users to receive data in real time, but they also allow users to code it and take certain actions based on event triggers.\n* <strong>Plugin Webhooks</strong> - Enhance the capabilities of the platforms on both the sending and receiving level, allowing the sharing of data in a 2-way relationship.\n\n[SendGrid’s Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) combines the push, pipe, and plugin capabilities listed above. The Event Webhook notifies a URL via HTTP POST about events that take place with your email in the SendGrid platform. The Event Webhook then captures email-specific data related to unsubscribes, spam reports, bounced emails, and response data, and reports them in the manner in which you specify.\n\nWith the Event Webhook, users can create advanced email analytics, customize the delivery of your email analytics to their platform, set up triggered email campaigns synced to third-party platforms, and insert dynamic data. In all, there are 9 email events that can be captured.\n\nUsing the SendGrid Event Webhook allows users to follow the email best practices that will increase their [email deliverability]({{root_url}}/glossary/deliverability/). For instance, by immediately responding to bounces, unsubscribes, and spam reports, users can ensure that they’re always sending to a clean list. By using the open and click tracking, they can remove unresponsive users and ensure that they’re always sending to a highly engaged list.\n\nTo help users take full advantage of the Event Webhook, SendGrid has also created the EventKit. The SendGrid EventKit allows users to create a user-friendly app where they download a *PHP* script and then upload it to their server in order to take advantage of the Event Webhook. You can learn more by visiting the [EventKit blog post](https://sendgrid.com/blog/open-source-eventkit-for-event-webhook/).\n\nIn addition to the Event Webhook, SendGrid has also created the Parse Webhook to improve engagement with recipients. The [SendGrid Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) allows users to parse the contents and attachments of messages. Using Parse Webhook, SendGrid users can post blog articles or receive uploads directly from email replies. The webhook will then POST the parsed portions of the email to a URL specified by the user.\n\nSendGrid provides a full-service solution for solving your total [email delivery needs](https://sendgrid.com). We’re the world’s largest email infrastructure as a service provider working hand in hand with developers to ensure that we’re providing tools and services that solve real-world problems. \n"
  },
  {
    "path": "content/docs/glossary/expandable-banner.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Expandable Banner\ngroup: glossary\nseo:\n  title: Expandable Banner\n  description: Definition of an Expandable Banner\n  keywords: \nnavigation:\n  show: true\n---\n\n## Expandable Banner\n\nAn Expandable Banner can increase in size when the user clicks or hovers over the banner.\n\n"
  },
  {
    "path": "content/docs/glossary/expired.md",
    "content": "---\nseo:\n  title: Expired\n  description: Bounced - Expired emails are emails that are unable to be delivered within 72 hours.\n  keywords: expired, bounce, undelivered email\ntitle: Expired\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nIf an email bounces, we will retry for up to 72 hours. If the email is unable to be delivered within the last 72 hours, it will expire and be marked as Bounced - Expired.\n\nBounced emails are commonly due to SMTP 4.X.X errors or SMTP 5.X.X errors, which cause an email to be undeliverable:\n\n- An expired, inactive, or disabled recipient address\n- The recipient's mailbox has exceeded its limit\n- An incorrect recipient email address\n- Domain frequency limited\n- Connection frequency limited\n- IP frequency limited\n- Too many invalid recipients\n\n### Additional Resources\n\n- [Bounces]({{root_url}}/glossary/bounces/)\n- [Retrieve and Edit your List of Bounces](https://sendgrid.api-docs.io/v3.0/bounces-api)\n- [Email Activity & Bounces]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n"
  },
  {
    "path": "content/docs/glossary/feedback-loop.md",
    "content": "---\nseo:\n  title: Feedback Loop\n  override: true\n  description: A feedback loop is the process by which an ISP forwards emails reported as spam for immediate removal by the sender.\ntitle: Feedback Loop\nlayout: page\nweight: 0\nnavigation:\n  show: false\n---\n\nA feedback loop is the process by which an ISP forwards emails reported as spam (see [complaint]({{root_url}}/glossary/complaint/)) for immediate removal by the sender.\n\n"
  },
  {
    "path": "content/docs/glossary/flighting-in-advertising.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Flighting in Advertising\ngroup: glossary\nseo:\n  title: Flighting in Advertising\n  description: Definition of Flight or Flighting in Advertising\n  keywords: \nnavigation:\n  show: true\n---\n\n## Flighting in Advertising \n\nFlighting or flight refers to the time when an advertising campaign is running. \n\n\n"
  },
  {
    "path": "content/docs/glossary/fqdn.md",
    "content": "--\nseo:\n  title: Fully Qualified Domain Name (FQDN)\n  description: Definition of a fully qualified domain name as it relates to SendGrid.\n  keywords: fqdn, fully qualified, dns, hostname, fully qualified domain, pqdn, tld\ntitle: Fully Qualified Domain Name (FQDN)\ngroup: glossary\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nA Fully Qualified Domain Name (FQDN) is the complete domain name for a specific location in the Domain Name System (DNS) hierarchy. This is sometimes referred to as the absolute domain name.\n\nThe hierarchy can be broken down into a few parts:\n\n- Top-Level Domain (TLD), such as .edu or .com\n- Partially Qualified Domain Name (PQDN) or domain name, such as example.com\n- Fully Qualified Domain Name (FQDN) or host name, such as mail.example.com\n\nThe format of FQDN includes all hierarchical parts, usually [hostname].[domainname].[tld]. A mail server, for example with SendGrid, could be specified by an FQDN such as `mx.sendgrid.net` as this provides the complete domain for a specific mail server. When connecting to a host the specification of a FQDN allows for the DNS to resolve the hostname to its specific IP in order to verify the connection and successfully send mail.\n"
  },
  {
    "path": "content/docs/glossary/frequency-capping.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Frequency Capping\ngroup: glossary\nseo:\n  title: Frequency Capping\n  description: Definition of Frequency Capping\n  keywords: \nnavigation:\n  show: true\n---\n\n## Frequency Capping\n\nIn advertising, frequency capping refers to the maximum number of times a specific visitor to a website is shown a particular advertisement.\n"
  },
  {
    "path": "content/docs/glossary/gdpr.md",
    "content": "---\nseo:\n  title: General Data Protection Regulation (GDPR)\n  description: The General Data Protection Regulation (GDPR) of the European Union (EU) is a law that regulates the handling of personal data and outlines the rights individuals have with regard to their data.\n  keywords: Data, Privacy, Europe, Processing, Requirements\ntitle: General Data Protection Regulation (GDPR)\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n## GDPR\n\nThe General Data Protection Regulation (GDPR) of the European Union (EU) is a law that regulates the handling of personal data and outlines the rights individuals have with regard to their data. It was implemented on May 25, 2018. It applies to any [“individual, company, or organisation”](https://ec.europa.eu/info/law/law-topic/data-protection/reform/what-does-general-data-protection-regulation-gdpr-govern_en) that processes the data of a person in the EU. This applies whether the organization is based in the EU or elsewhere.\n\n## The Purpose of the GDPR\n\nThe European Union views the protection of personal data as a fundamental right of [natural persons](https://en.wikipedia.org/wiki/Natural_person). The GDPR establishes requirements of organizations that process data, defines the rights of individuals to manage their data, and outlines penalties for those who violate these rights. \n\nTo better understand the GDPR, you should know what qualifies as **personal data** and data **processing**.\n\n### Personal data\n\nThink of **personal data** as any information that can be used to identify someone or is associated directly or indirectly with a living individual. This includes a person’s name, driver’s license number, location data, IP address, biometric data, and more.\n\n### Processing\n\n**Processing** is a broad term that encompasses nearly any use of personal data, including collection, storage, organization, alteration, destruction, and transmission. For all intents and purposes, any use of personal data is considered processing.\n\n## Information for Senders\n\nOf particular importance to those who manage an email list is the requirement to obtain and document consent* from recipients on that list. This means that the individual recipient must opt into receiving emails, for example, by signing up online. You must maintain a record of the recipient having signed up. It also means that the recipient can opt out of receiving emails, and the sender must honor their request. Also, it has to be just as easy to opt out as it was to opt in.  It is important to keep an up-to-date record of that consent so that emails are not sent to recipients who have opted out of receiving them.\n\n*There are a number of different legal reasons for which your organization might be processing personal data. Some uses of data don’t require consent—for example, you don’t need the consent of a signatory to retain their name and signature on a business contract. But when it comes to maintaining an email mailing list, you should get consent from your recipients.\n\nIf you need only an email address to achieve your specific business purpose, an email address is all you should store. The GDPR requires that you process only the data necessary for a legitimate business need and nothing more. All this processing should also be done securely with [Privacy by Design and by default](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ENG&toc=OJ:L:2016:119:FULL#d1e3022-1-1).\n\n### Controllers and Processors\n\nUnder the GDPR, an organization processing personal data acts as either a **controller** or a **processor**. A controller determines the purpose for processing the data. Whether the controller processes the data itself or contracts another party to do the processing, the controller decides how the data are used. A processor processes data only on behalf of the controller. The sole objective of the processor is to process the data for the controller.\n\nFor example, if you maintain a large email marketing list and use SendGrid to deliver promotions, you’re considered the controller, and SendGrid is your processor. You set the business purpose and control the data. SendGrid processes that data on your behalf.\n\nMany businesses are both controllers and processors. You can read more in [Chapter IV](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ENG&toc=OJ:L:2016:119:FULL#d1e3022-1-1) of the full GDPR legal text. We also have a [blog post](https://sendgrid.com/blog/general-data-protection-regulation-what-senders-need-to-know/) with more detail about what you need to know as an email sender.\n\n### The Rights of Your Customers\n\nThe GDPR is meant to provide rights to natural persons. For this reason, your customers may request that their data be updated or even erased in certain circumstances. If data subjects want to move their data to another service, they are free to do so. Their data should be provided to them in a common machine-readable format that other organizations can understand.\nWhen communicating with individuals, they also have a right to receive that communication in plain and transparent language. For more about the rights of a data subject, see [Chapter III](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ENG&toc=OJ:L:2016:119:FULL#d1e2161-1-1) of the full GDPR text.\n\n## SendGrid and the GDPR\n\nSendGrid believes the GDPR is an important move in the right direction. We value our customers’ data. That’s why we’re [Privacy Shield](https://www.privacyshield.gov/welcome) certified, GDPR compliant, and we protect personal data throughout the entire processing chain. For more information, please visit our [GDPR page](https://sendgrid.com/resource/general-data-protection-regulation-2/) or browse our [FAQ](https://sendgrid.com/files/SendGrid-FAQ.pdf).\n\n## Next Steps\n\nSecure email at scale is just an API away. Deliver your first [SendGrid powered email](https://sendgrid.com/docs/for-developers/sending-email/api-getting-started/) today with our API quickstart. Is marketing on your mind? Engage your customers with [SendGrid Marketing Campaigns](https://sendgrid.com/docs/ui/sending-email/how-to-send-email-with-marketing-campaigns/).\n"
  },
  {
    "path": "content/docs/glossary/header.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Header\nnavigation:\n  show: false\nseo:\n  title: Header\n  override: true\n  description: An email header is the information that tells email recipients and servers where the email has come from and where it should go.\n---\n\nThe documentation that accompanies the body of an email message, the header contains information on the email and the route it has taken across the Internet. Email readers display the “to” (identity of the recipient) and “from” (identity of the sender) in the inbox.\n\nMore information:\n\n* [Managing headers with SMTPAPI]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)\n* [Managing headers with the Web API]({{root_url}}/for-developers/sending-email/api-getting-started/#build-your-api-call)\n* [Transactional Email Templating]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n"
  },
  {
    "path": "content/docs/glossary/imap.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: IMAP\nnavigation:\n  show: false\nseo:\n  title: IMAP - Internet Message Access Protocol\n  override: true\n  description: IMAP is a protocol many applications use to retrieve mail from your mail server\n---\n\nInternet Message Access Protocol (IMAP) is a communication protocol used by applications and servers for retrieving emails from email servers. \nEmail programs like Microsoft's Outlook and Mozilla's Thunderbird use this protocol to contact servers and download messages for local storage and viewing offline. It is widely used by most email service providers, including Gmail and Yahoo!.\n\nFor more information, read the [Wikipedia article](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol).\nFor technical information read the [RFC 3501](https://tools.ietf.org/html/rfc3501).\n"
  },
  {
    "path": "content/docs/glossary/invalid-email.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Invalid Email\nnavigation:\n  show: false\nseo:\n  title: Invalid Email\n  override: true\n  description: \n---\n\nAn [invalid email]({{root_url}}/ui/sending-email/invalid-emails/) occurs when you attempt to send email to an address that is formatted in a manner that does not meet internet email format standards. Examples include addresses without the “@” sign or addresses that include certain special characters and/or spaces. This response comes from our own server since an invalid email is impossible to even attempt to send to its [non-existent] destination.\n\n<call-out>\n\nInvalid drop events are retained for 30 days.\n\n</call-out>"
  },
  {
    "path": "content/docs/glossary/ip-address.md",
    "content": "---\nseo:\n  title: IP Address\n  description: A unique numerical address that defines an internet location.\n  keywords:\ntitle: IP Address\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn Internet Protocol (IP) Address is a unique numerical address that defines an internet location. These addresses have 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. IP addresses are included in the headers of all emails sent, they are a sort of return address for a given email message. One of the reputation indicators used by recipient mailbox providers is a sender's IP address. \n\nAt SendGrid, you can be on a shared IP address, or you can have a dedicated IP address. We recommend a dedicated IP address for people sending high volumes of email or for people who want control over the quality of mail sent on the same IP as theirs. The aggregate performance of all the senders who use the IP determines its reputation.\n\n<call-out>\n\nIf you are on a Pro 100k or above plan you can see your IP reputation and IP address on your Account Overview page.\n\n</call-out>\n\nFor more information:\n\n* [SendGrid Email Infrastructure Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n* [Setting up Reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n"
  },
  {
    "path": "content/docs/glossary/ip-warmup.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: IP Warmup\nnavigation:\n  show: false\nseo:\n  title: IP Warmup\n  override: true\n  description: Initially splitting up the email send requests from a new dedicated IP, so it doesn't get blocked.\n  keywords: IP, warm, up, warmup, ramp, ramping\n---\n\n[IP warming]({{root_url}}/ui/sending-email/warming-up-an-ip-address/) is the gradual process of establishing a reputation as a legitimate email sender in the eyes of ISPs (Internet Service Providers). When an ISP observes email suddenly coming from a new or “cold” (recently dormant) IP address, they will take notice and immediately begin evaluating the traffic coming from that IP.\n\nISP spam filters look at volume as a significant factor when determining whether or not you are sending spam. Because of this, we recommend that you begin sending a low to moderate volume ( up to 1 million emails/month), eventually working your way up to larger volumes (over 1 million emails/month). This gives the receiving email providers a chance to closely observe your sending habits and the way your customers treat the emails they receive from you.\n\n<call-out>\n\nYou can now warmup your IP using our [IP Warmup API](https://sendgrid.api-docs.io/v3.0/ip-warmup).\n\n</call-out>\n\nWhen you place your IP in warmup mode, we divide your email requests between the dedicated IP you wish to warmup and any other warm, dedicated IPs currently assigned. Each day we will increase the amount sent directly from your warming dedicated IP. You can see the suggested [IP Warmup Schedule]({{root_url}}/assets/IPWarmupSchedule.pdf).\n\n<call-out type=\"warning\">\n\nWe recommend the IP warmup tool only for users that have other warm, dedicated IPs which can accept any overflow email traffic as we gradually increase the volume sent through the warming IP.\n\nIf you do not have other dedicated IPs and are building your reputation from scratch, recommend that you follow [this]({{root_url}}/assets/IPWarmupSchedule.pdf) warmup schedule.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/link-branding.md",
    "content": "---\nseo:\n  title: Link branding\ntitle: Link branding\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nEmail link branding allows all of the click-tracked links and opens tracked images in your emails to be from your domain instead of from sendgrid.net. Spam filters and recipient servers look at the links within emails to determine whether the email looks trustworthy enough to deliver - they use the reputation of the root domain to determine whether the links can be trusted. Implementing link labeling helps in email deliverability because you are no longer relying on click tracking going through a domain that you do not control.\n\n<call-out>\n\nIn an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS.\n\n</call-out>\n\n## \tAdditional Resources\n\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/lists.md",
    "content": "---\nseo:\n  title: Lists\n  description: Lists are simply static collections of Marketing Campaigns contacts.\n  keywords:\ntitle: Lists\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nLists are static collections of Marketing Campaigns contacts. By default, the ALL CONTACTS section stores any new contacts you add. You may create new lists when adding contacts either manually, or when uploading a CSV (comma separated values) file. When you send an email campaign, you can add contact lists to the specific recipient segments you wish to target.\n\nFor more information about Lists, please see our [Building your contact lists]({{root_url}}/ui/managing-contacts/building-your-contact-list/).\n"
  },
  {
    "path": "content/docs/glossary/mail-merge.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Mail Merge\nnavigation:\n  show: false\nseo:\n  title: Mail Merge\n  override: true\n  description: Mail Merge is a process to create customize emails from a generic form or template.\n---\n\nMail Merge is a process to create customized emails, letters, and documents from a generic form or template. The original document contains static text with placeholders for substitutions for elements like names, addresses, emails, or other individualized or unique information. Typically, the data used to populate these placeholders is held in a database, spreadsheet, or CSV file. A column in a spreadsheet could contain a list of names that correspond with a list of email addresses. These would then be populated into the template, creating a customized email per email address.\n\nThis functionality can be replicated using SendGrid's [SMTP API]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/), using [Substitution Tags]({{root_url}}/for-developers/sending-email/substitution-tags/) and [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/) in [Marketing Campaigns]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/) for marketing emails and our [transactional templates application](https://sendgrid.api-docs.io/v3.0/transactional-templates) for transactional emails.\n"
  },
  {
    "path": "content/docs/glossary/mailbox-provider.md",
    "content": "---\nseo:\n  title: Mailbox Provider\n  description: An email service provider provides transactional and marketing email services.\n  keywords: Mailbox Provider, Email service provider, ESP\ntitle: Mailbox Provider\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA mailbox provider, mail service provider or Email Service Provider (ESP) is a service organization that provides transactional and/or marketing email services.\n\n## Additional Resources\n\n[Email Service Provider (ESP)]({{root_url}}/glossary/email-service-provider/).\n"
  },
  {
    "path": "content/docs/glossary/message-id.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SendGrid Message ID\nnavigation:\n  show: false\nseo:\n  title: Message ID\n  override: true\n  description: The SendGrid Message ID is a unique identifier generated and assigned by SendGrid for event identification purposes. \n---\nThe SendGrid Message ID, is a unique identifier assigned to individual email messages by the email server responsible for sending the message. SendGrid will create a Message ID for each individual message you send through our systems. This Message ID information is searchable in the SendGrid Activity Feed as well as Event Webhook POST data. The Activity Feed references the Message ID as \"Message ID\" and the Event Webhook references it with `sg_message_id`.\n\n**Please Note**: The SendGrid assigned Message ID is different than an X-Message-ID given in response headers when sending via API. While this ID is contained in the SendGrid assigned Message ID, the X-Message-ID is specific to the API request prior to messages being broken up individually in SendGrid email servers and then assigned the SendGrid Message ID. The SendGrid Message ID accounts not only for the original request but also server data and the specific identification between a unique message and recipient.\n\nExample SendGrid Message ID: **XBg2anf2TqCy6WXKQFhieQ.filter0905p1mdw1-4434-59E0C6FF-3.0**\n"
  },
  {
    "path": "content/docs/glossary/mta.md",
    "content": "---\nseo:\n  title: MTA\n  description: MTA stands for Mail Transfer Agent. It is software that transfers electronic mail messages from one computer to another using a client–server application architecture.\n  keywords: MTA, Mail Transfer Agent, Mail Relay\ntitle: MTA\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\nMail Transfer Agent or Message Transfer Agent (MTA) is software that transfers electronic mail messages from one computer to another using a client–server application architecture.\n\nAn MTA implements both the client (sending) and server (receiving) portions of the [Simple Mail Transfer Protocol]({{root_url}}/glossary/smtp/).\n\nTo get more information please check out our [Email Infrastructure Guide.](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/mx-record.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: MX Record\nnavigation:\n  show: false\nseo:\n  title: MX Record\n  override: true\n  description: An Mail Exchanger Record specified the mail server responsible for accepting email on behalf of a domain\n---\n\nA Mail Exchanger (MX) record in the DNS system specifies a mail server responsible for accepting email addresses on behalf of a domain. The MX records associated with a domain assure that the email is properly routed via [Simple Mail Transfer Protocol]({{root_url}}/glossary/smtp/) (SMTP).\n"
  },
  {
    "path": "content/docs/glossary/native-advertising.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Native Advertising\ngroup: glossary\nseo:\n  title: Native Advertising\n  description: Definition of Native Advertising\n  keywords: \nnavigation:\n  show: true\n---\n\n## Native Advertising \n\nNative advertising refers to ads that operate like paid ads but differ in appearance. The native advertising unit does not really appear like an advertisement but looks like the native content on the page. Native advertising is often found in social media feeds or appear as recommended content on a webpage.\n\n"
  },
  {
    "path": "content/docs/glossary/open-rate.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Open Rate\nnavigation:\n  show: false\nseo:\n  title: Open Rate\n  override: true\n  description: The rate in which your customers open emails you've sent to them.\n---\nThe “Opens” percentage is the total number of times your users opened your emails, divided by the total number of Delivered messages.\n\nThe “Unique opens” percentage is the number of unique individuals that have opened your emails, divided by the total number of Delivered messages.\n\n<call-out>\n\nTracking open rates requires that the Open Tracking app be enabled.\n\n</call-out>\n\n*To enable the Open Tracking app:*\n1. Navigate to **Settings** and select **Tracking**.\n1. Locate the line that says Open Tracking and select the action menu to expand the line.\n1. Toggle the switch to **On**. Open Tracking is now enabled.\n\n\nFor more information visit our [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) page.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/openrelay.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Open Relay\nnavigation:\n  show: false\nseo:\n  title: Open SMTP Relay\n  description: An SMTP server configured in such a way that it allows anyone on the Internet to send email through it.\n---\n\nAn [SMTP server]({{root_url}}/glossary/smtp-server/) configured in such a way that it allows anyone on the Internet to send email through it, not just mail destined for or originating from known users. This is not a recommended configuration because it can be exploited by spammers. Servers with open relays are routinely blocked.\n\nTo get more information please check out our [Email Infrastructure Guide.](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/opens.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Opens & Unique Opens\nnavigation:\n  show: false\nseo:\n  title: Opens & Unique Opens\n  override: true\n  description: Track how many times your emails are opened with SendGrid\n---\nSendGrid inserts a small, transparent image into all emails that will be tracked. When a customer reads an email, their client application loads the tracking image which registers the open event with SendGrid.\n\nNot all email clients load images by default. Microsoft’s Outlook, Apple’s Mail.app, Mozilla’s Thunderbird, and Google’s Gmail do not load images. As such, there may be many occasions where recipients will have received a message, opened it, and it will never be counted as opened because there is no way to track the event.\n\nIn [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) the \"opens percentage\" is the total number of times your users opened your emails, divided by the total number of Delivered messages.\n\nThe “Unique opens” percentage is the number of unique individuals that have opened your emails, divided by the total number of Delivered messages.\n\n<call-out>\n\nSendGrid will store tracking data for unique open events for up to 7 days.\n\n</call-out>\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/peer-invitations.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Peer-initiated Invitations Campaign\nnavigation:\n  show: false\nseo:\n  title: Peer-initiated Invitations Campaign\n  override: true\n  description: Peer-initiated Invitations are a Marketing Email campaign where you get customers to invite their friends and family. There are some caveats to consider about this marketing method.\n---\n\nPeer-initiated invitations are a common way of launching a new business and gain awareness. If done right they can enable your subscribers spread the word about your service and grow your user base. An aggressive invitation system can backfire, and your invitations will be filtered or blocked. SendGrid customers who implement a peer-initiated invitation system must abide by the following requirements:\n\n* Never allow your subscribers to send invitations to their entire address book. Address books can and often do contain old or stale addresses that ISPs use as [spam traps]({{root_url}}/glossary/spam-traps/). If your invitations hit spam traps then your subsequent messages will be filtered by ISPs. To prevent this, design your invitation system so that your inviter must deliberately selects each individual invitee. By limiting the number of invitations each customer sends you are encouraging selective and quality invitations. When your customers are careful to invite only those who they think will appreciate your service, you reduce the risk of invitees reporting the invitations as spam. If enough people report your invitations as spam, your invitations will begin to be blocked or filtered by spam filters and Email Service Providers, which is not what you intended.\n* Clearly display the inviter's name or email address in the invitation email, then the invitee will easily see who sent the invitation. Peer-initiated invitations are most effective when the invitee knows and trusts the inviter. A good way to think about how to build your email template is to consider, \"If I got this email from my friend, would I click it?\" or \"What would I expect my mom to do with this email if she received it and I didn't work for this brand?\"\n* The From address on your invitation email should reflect your brand, especially if your system is sending this email. Don't use the inviter's email address for the invitation's From address.\n* Clearly express the purpose of the invitation so that recipients easily understand what they are being invited to.\n* After the initial invitation, don't send more than one follow-up (reminder) email to invitees that didn't respond to the first invitation.\n\n<call-out>\n\n You increase the odds of your invitations reaching the recipient when you structure your systems and processes to send the right message, to the right person, at the right time, with the right frequency. If you don't, your messages will be marked as spam and your marketing results will suffer.\n \n</call-out>\n\nSendGrid also strongly recommends:\n\n* Ensure your invitation is relevant and valued by the recipient. You can allow your customers to add a personal text-only message to their invitation. Don't allow URLs to be added, as they may be used to exploit or infect the invitee.\n* Include a conspicuous, functioning opt-out link as it's better for the recipient to remove themselves from future mailings than to report your message as spam.\n* Beware of offering invitation incentives to your subscribers. Incentives may encourage them to invite people who aren't likely to want your service, which can lead to more spam reports.\n* Monitor your spam complaints. Some inviters will trigger spam complaints by sending invitations to people who don't want them. If your system correlates spam complaints with the troublesome inviter, you can limit their invitation quota to minimize the adverse effect on your email sending reputation.\n* Typos happen. Pre-screen the email addresses you collect before you send the invitation. Make sure that the addresses are syntactically correct and that the domain part of the address has a DNS MX record (which indicates that the domain accepts mail).\n* Do not add invitees to your contact database until the invitee opts-into being on your list.\n\n"
  },
  {
    "path": "content/docs/glossary/phishing.md",
    "content": "---\nseo:\n  title: Phishing\n  description: A technique for acquiring information such as user names, passwords, credit cards, social security numbers and other personal data by masquerading as a trusted business.\n  keywords: phish, phishing, spam\ntitle: Phishing\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nPhishing is a technique for acquiring information such as user names, passwords, credit cards, social security numbers or other personal data by masquerading as a trusted entity like a bank or credit card company. Phishing emails appear to be sent by the trusted entity, which can cause the consumer to be tricked into providing their personal information.\n\nSendGrid employs both technology and staff to prevent the sending of phishing emails. We have a solid track record of working with the global email community to detect and stop the sending of phishing and spam emails.\n\nTo get more information please check out our [Email Infrastructure Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/).\n\n## Reporting Email Abuse\n\nSendGrid works hard to keep our email stream clean. Despite our best efforts, spam does occasionally leak through our defenses. If you discover spam that was sent by a SendGrid customer, please report it to our team by sending it to abuse@sendgrid.com or opening a ticket with [SendGrid Support](https://support.sendgrid.com/hc/en-us). No matter who sent the phishing email, you can file a report with the [Federal Trade Commission](http://www.ftc.gov/complaint).\n\nIf we find that a SendGrid customer is sending spoofed or phishing emails, we will ban their account immediately\n"
  },
  {
    "path": "content/docs/glossary/preheader.md",
    "content": "---\nseo:\n  title: Preheader\n  description: A preheader is the short summary text that follows the subject line when an email is viewed in the inbox. Many mobile, desktop, and web email clients provide them to tip you off on what the email contains before you open it.\n  keywords: Preheader, Preheaders, Johnson Box\ntitle: Preheader\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA preheader is the short summary text that follows the subject line when an email is viewed in the inbox. Many mobile, desktop, and web email clients provide them to tip you off on what the email contains before you open it.\n\nAlong with the subject line, the preheader text is the first thing subscribers come into contact with when they receive your email campaign.\n\nMany businesses use preheaders in their email marketing campaigns to get more subscribers to open and read their emails – and to ensure that their campaigns are as deliverable as possible.\n\nIt’s these 2 elements that they use to decide whether or not to open your campaign, and without getting your email opened it’s impossible to get people to click-through and take your desired conversion action (like making a purchase on your website for instance). \n\n"
  },
  {
    "path": "content/docs/glossary/programmatic-media-buying.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Programmatic Media Buying\ngroup: glossary\nseo:\n  title: Programmatic Media Buying\n  description: Definition of Programmatic Media Buying\n  keywords: \nnavigation:\n  show: true\n---\n\n## Programmatic Media Buying\n\nProgrammatic media buying is an approach to buying paid media through sophisticated software that automates how you buy, place and optimize paid media. It allows you to segment your targeting by demographics or geography. You can also determine the frequency your ads are displayed and where your ads are published without manual intervention.\n\n\n"
  },
  {
    "path": "content/docs/glossary/rate-limiting.md",
    "content": "---\nseo:\n  title: Rate Limiting\n  description: Rate limiting happens when a recipient mail server doesn't allow emails to be delivered at the same rate as they were sent.\n  keywords: rate limiting, throttling\ntitle: Rate Limiting\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nThere are limitations to delivery rates imposed by recipient mail servers. Exceeding these limitations results in a practice\nreferred to as [throttling]({{root_url}}/glossary/throttling/). Throttling in terms of email means that a recipient mail server has accepted all the mail it is\nwilling to accept from your IP for a certain period of time.\n\nPlease visit our [pricing page](https://sendgrid.com/pricing?mc=SendGrid%20Documentation) to see the account specific sending limits.\n"
  },
  {
    "path": "content/docs/glossary/reconfirmation.md",
    "content": "---\nlayout: page\nweight: 0\nseo:\n  title: Reconfirmation Email Campaigns\ntitle: Reconfirmation Email Campaigns\nnavigation:\n  show: false\n---\n\n## \tHow do you know if email subscribers are active or not?\n \t\nA common problem for senders is when a recipient will opt-in to receive their emails but after a certain period of time,\nthese opted in emails do not make it to the mailbox. Worse, this leads to recently opted in addresses missing out on this\nsenders emails as well. These addresses have opted in so what is the issue?\n\nMonitoring engagement is the best tool in ensuring a good reputation as a sender. In the past few years, there has been\na large push to determine whether emails will make it to the mailbox by past engagement with that sender. Popular\nreceiving mailboxes like Gmail, Yahoo! and Hotmail use engagement tracking to decipher which emails to put in the spam folder, bounce, or allow passage to a user's mailbox. Furthermore, many mailboxes now have the option\nto prioritize emails automatically so that there are 2 different categories of email; those deemed by the mailbox as\nimportant and those that aren't. This is almost entirely determined by whether or not recipients click on their emails\nor even better, if they reply. This increases the ante for senders to send content that recipients will engage with.\n\nThankfully, SendGrid provides a window into the problem. Senders are able to make use of\nthe [Event API]({{root_url}}/for-developers/tracking-events/event/) which allows senders to know if recipients have opened and/or clicked on their emails. Lower tier plans\ncan view this information under the Email Activity tab. With these tools, a sender can ensure that they are not sending\nto 2 major pitfalls: [spam traps]({{root_url}}/glossary/spam-traps) or recipients that are likely to acknowledge the email as [spam]({{root_url}}/glossary/spam/). Sending to either of\nthese recipients, results in the receiving mailbox to believe that they are uninterested and therefore, leads to diversion of emails to the unimportant or spam folders.\n\n\nMonitoring engagement provides a sustainable solution to sending that leaves both the sender and the recipients better off.\nOnce you have been monitoring, you are primed to take some action with the subscribers who have not been active recently.\nYou can do this with a Reconfirmation Campaign.\n\n## \tWhat is a Reconfirmation Campaign?\n \t\nIn order to maximize your email [deliverability]({{root_url}}/glossary/deliverability/), it is important to keep\nyour address list current and clean. A reconfirmation email, otherwise\nknown as a re-opt in email, reminds clients you correspond with about\nyour business (which can increase your inbound marketing).This effectively\ncleans your lists with minimal impact to your deliverability, and\nprevents inadvertently spamming your clients.\n\n## \tWhy Reconfirm?\n \t\nAs you opt-in your recipients, the email addresses provided to you\ninitially may become obsolete. These addresses might become abandoned\nand eventually recycled or converted to [spam traps]({{root_url}}/glossary/spam-traps/). Or your recipients\nmight simply become disinterested in receiving your emails.\n\nThis can cause problems for your email deliverability. Old addresses\nbecome undeliverable and subsequent sending will result in bounces.\nRecipients that have become disinterested are more likely to mark\nyour mail as spam, especially if there is no easy opt-out method in the email.\n\nTo prevent these problems, we recommend using re opt-in messages.\nThese emails remind your recipients of your services they once opted\nin, and politely ask for the recipient's permission to continue sending\nemails.\n\n## \tHow do I Reconfirm?\n \t\nSend an email with two links: one link to re-opt in the recipient,\nand the other link to opt-out the recipient. If they do not\nexplicitly opt back in with this email, their address should be\nremoved from your list as this is an indication your recipient is not\nengaging in your emails. This could be a sign that you are sending to\nsomeone that does not care for your emails, or even worse, you could\nbe sending to a spam trap.\n\nIf you are set up with SendGrid's Event API, click and open events are\nan excellent way to track which of your users have been unengaged and\nmight be the best targets for your reconfirmation emails. You can even\nmake your reconfirmation emails specific to a particular segmented list\nif your address lists are set up in this fashion.\n\nThis approach is much more favorable than trying to clean a large old\naddress list all at once. Sending to a 10-year-old list (or even a\n3-month-old list) can produce a high bounce rate and cause your\nunengaged recipients to mark your emails as spam. Email service\nproviders discourage this type of sending because of these results.\nKeep in mind, the older the list, the bigger the headache it will be to clean.\n\n## \tHow Often Should We Reconfirm?\n \t\nWe recommend sending re opt-in messages to recipients who you haven't\ncorresponded with or otherwise interacted with via email in over **3\nmonths**. This may seem like a short duration, however, you might be\nsurprised with how quickly your recipients can lose interest in your\nemails. Of course there are many types of businesses and this\nrecommendation of 3 months is only a suggestion.\n\nUltimately, the more frequently you clean your address list, the less likely you will have deliverability problems related to old lists.\n"
  },
  {
    "path": "content/docs/glossary/request.md",
    "content": "---\nseo:\n  title: Request\n  description: A request is recorded every time an application attempts to send an email through SendGrid's servers.\n  keywords: request, statistics\ntitle: Request\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nWhenever your application or server attempts to send an email to one of your customers via SendGrid, we will record that as a request to your SendGrid dashboard. In other words, when you send emails through SendGrid, you are essentially requesting, \"Hey could you deliver this message for me?\".\n\nVisit [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) to find more information about all the statistics SendGrid provides.\n"
  },
  {
    "path": "content/docs/glossary/reseller-email-account.md",
    "content": "---\nseo:\n  title: Reseller Email Account\n  description: Some companies may resell SendGrid's services by having a formal Reseller Partnership with SendGrid.\n  keywords:\ntitle: Reseller Email Account\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nHaving a Reseller Email account means SendGrid has a formal reseller partnership with a company and all billing and usage is integrated into SendGrid. This usually means a platform is reselling SendGrid’s product under their own platform.\n\nSendGrid makes it easy to manage your customers via our [Reseller API](https://www.twilio.com/docs/sendgrid/api/v2/Reseller_API).\n"
  },
  {
    "path": "content/docs/glossary/reserved-fields.md",
    "content": "---\nseo:\n  title: Reserved Fields\n  description: Reserved fields are those custom fields that cannot be deleted and do not count towards your allotment of 60 custom fields. They include fields such as email, first_name, and last_name in Marketing Campaigns.\n  keywords:\ntitle: Reserved Fields\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Reserved Fields]({{root_url}}/ui/managing-contacts/custom-fields/) are those custom fields that cannot be deleted and do not count towards your allotment of 60 custom fields. They include fields such as **email**, **first_name**, and **last_name** in Marketing Campaigns.\n\n"
  },
  {
    "path": "content/docs/glossary/reverse-dns.md",
    "content": "---\nseo:\n  title: Reverse DNS\n  description: Reverse DNS is a method of resolving an IP address into a domain name.\n  keywords: DNS, reverse DNS, domain name service, domain\ntitle: Reverse DNS\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSetting up reverse DNS on IP addresses allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. When you update your DNS provider with a DNS record provided by SendGrid, and then send mail over your IP, the recipient's email service provider performs a reverse DNS lookup (rDNS) using an A Record (address record). An A Record maps your domain to your IP address. When a mailbox provider looks up your A Record, they see your SendGrid IP address. When they look at your IP address, they see the rDNS that match your A Record. This circular checking proves your SendGrid IP association with your domain and your domain association with your SendGrid IP.\n\n<call-out>\n\nIn an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS.\n\n</call-out>\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n\n\n## \tAdditional Resources\n\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n"
  },
  {
    "path": "content/docs/glossary/scheduled-emails.md",
    "content": "---\nseo:\n  title: Scheduled Emails\n  description: Scheduling emails allows the ability to have the email send process to begin at a certain time\n  keywords: scheduled emails, sending emails at a specific time\ntitle: Scheduled Emails\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nScheduling emails provides the ability to have the email sent at a certain time.\n\nFor example, if I am a retailer who has a promotion starting at 10:00am, i want the email to land as close to that time as possible. Scheduling can support this.\n\nWhether using [Marketing Campaigns](https://sendgrid.api-docs.io/v3.0/single-sends/create-single-send) or [our transactional APIs]({{root_url}}/for-developers/sending-email/scheduling-parameters/), you can define parameters on when to send a single email or batches of emails.\n\n<call-out>\n\nIf you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/segmentation.md",
    "content": "---\nseo:\n  title: Segmentation\n  description: The practice of separating different types of email traffic.\n  keywords: segmentation, email traffic, sender verification, IP pooling\ntitle: Segmentation\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSegmentation refers to the practice of separating the different types of email that you send, such as marketing email and transactional email. By segmenting your email traffic, you can both obtain more useful engagement statistics and improve your [deliverability]({{root_url}}/glossary/deliverability/).\n\nSegmentation can be achieved by either creating and sending mail through a new subuser, or by [creating a new subuser]({{root_url}}/ui/account-and-settings/subusers/#create-a-subuser) and purchasing a separate [dedicated IP address]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/) to send that subuser's mail through.\n\nSendGrid's [IP Pooling feature](https://sendgrid.api-docs.io/v3.0/ip-pools) is a powerful tool that allows you to set up separate IP pools that you can use to organize your dedicated IPs. When sending different types of email, you can specify which IP Pool to associate your message with, and the IP Pooling feature will automatically **segment** your traffic by sending it through the corresponding dedicated IP address.\n\n<call-out>\n\nFor more information about how you can segment your email traffic, please see [Segmenting Your Contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/).\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/segments.md",
    "content": "---\nseo:\n  title: Segments\n  description: Segments are dynamic collections of Marketing Campaigns contacts grouped together, or segmented, based on the criteria you define.\n  keywords:\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Segments]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/) are dynamic collections of Marketing Campaigns contacts grouped, or segmented, based on the criteria you define. Groups can include data you track about them, such as gender, location, birthday, or package type, or how they've engaged with your emails previously. You can create a segment that pulls from ALL CONTACTS or a specific existing list.\n\nSegments are dynamically updated over time as you add customers who meet the criteria of your segment, or as the traits of your contacts change. For example, a segment with the criteria \"opened an email within 30 days\" will evolve as contacts engage (or don't engage) with your email. Segmentation can be especially useful to ensure that you are targeting the best recipients for your campaign.\n\n"
  },
  {
    "path": "content/docs/glossary/sender-authentication.md",
    "content": "---\nseo:\n  title: Sender authentication\ntitle: Sender authentication\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIn an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS.\n\n</call-out>\n\nSender authentication refers to the process of showing email providers that SendGrid has your permission to send emails on your behalf. To set up sender authentication, add DNS records to your hosting service. These DNS records associate your sending domain with SendGrid — when an inbox provider processes your email, they will see your domain instead of sendgrid.net. You can also set up sender authentication for the links in your email as well as dedicated IP addresses associated with your account (available with Pro level or higher accounts).\n\n## \tAdditional Resources\n\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n\n"
  },
  {
    "path": "content/docs/glossary/sender-id.md",
    "content": "---\nseo:\n  title: Sender ID\n  description: Sender ID is an email authentication standard developed by Microsoft that compares the email sender’s “From” address to the IP address to verify that it is authorized to send email from that domain.\n  keywords: Sender ID, authentication, Sender Policy Framework, SPF\ntitle: Sender ID\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSender ID is an email authentication standard developed by Microsoft that compares the email sender’s “From” address to the IP address to verify that it is authorized to send email from that domain.\n\nTo get more information please check out our [Email Infrastructure Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/senders.md",
    "content": "---\nseo:\n  title: Senders\n  description: Senders in Marketing Campaigns provide identity information about where the emails are coming from for their recipients in campaigns in order to ensure all CAN-SPAM regulations are followed.\n  keywords:\ntitle: Senders\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Senders]({{root_url}}/ui/account-and-settings/senders/) in Marketing Campaigns is required by CAN-SPAM regulations, and provide identity information about where the emails are coming from in each email you send.\n"
  },
  {
    "path": "content/docs/glossary/sends.md",
    "content": "---\nseo:\n  title: Sends\n  description: Sends relate to your requests to deliver email to your recipients through SendGrid's API or UI, which you can schedule or retrieve aggregate data from.\n  keywords:\ntitle: Sends\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSends relate to your requests to deliver email to your recipients through SendGrid's API or UI. We process the requests to send the email from you to your contacts and may encounter events such as deferred, delivered, blocked, and bounced when we attempt to deliver your email to the corresponding email service providers and email exchange servers. Once the recipient receives the email and interacts with it, more events will be captured such as clicks, opens, unsubscribes, spam reports, etc. We keep track of email events in the [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity/) and aggregate data in [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/).\n"
  },
  {
    "path": "content/docs/glossary/single-send.md",
    "content": "---\nseo:\n  title: Single Send\n  description: A Single Send is a one-time email used to communicate a variety of nonautomated messages.\n  keywords: Email, Marketing, Campaign, Promotion\ntitle: Single Send\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA Single Send is a one-time nonautomated email message delivered to a list or segment of your audience. A Single Send may be sent immediately or scheduled for future delivery. Unlike an [automated email]({{root_url}}/glossary/automated-email/) series such as a [drip campaign]({{root_url}}/glossary/drip-campaign/), a Single Send is not part of a series of related messages that are designed to work in sequence.\n\nSingle Sends can serve many use cases, including promotional offers, engagement campaigns, newsletters, announcements, legal notices, or policy updates. This means Single Sends are appropriate for both [transactional email]({{root_url}}/glossary/transactional-email/) and [promotional messages]({{root_url}}/glossary/email-marketing/).\n"
  },
  {
    "path": "content/docs/glossary/smtp-api.md",
    "content": "---\nseo:\n  title: SMTP API\n  description: SMTP API is an API that allows you to tag your emails and provide customized email handling instructions on a per email basis.\n  keywords: smtp api\ntitle: SMTP API\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[SMTP]({{root_url}}/glossary/smtp/) stands for Simple Mail Transfer Protocol. SMTP allows software to transfer email over the internet. The term API stands for Application Programming Interface, which allows software to talk to each other. Therefore, the SMTP API allows two or more software platforms to talk to each other over the internet, based on a set of defined parameters and rules between systems.\n\nThe SendGrid SMTP API gives developers the ability to customize email handling instructions using an X-SMTPAPI header. This JSON header is placed in each email message providing specific instructions on what to do with the email message. The customized header can be added to any SMTP message sent to SendGrid for interpretation by the receiver.\n\nThere are two prime benefits to using the SMTP API. Since there are so many languages, frameworks, and mail clients, the SMTP API is the most flexible and simplest solution for delivering email. Secondly, SMTP API gives you advanced control over your email messages. You can tag or label your emails and set filters to define the type data you want to receive. You can create dynamic emails, automatically customize emails and add unique arguments using templates to make it easier to deliver your email efficiently.\n\nSendGrid makes it easy for customers to integrate their existing application with SendGrid in a few simple steps using SMTP. By changing your username, password, server host name and port connections, you can start sending email in a just a few minutes.\n\nThe power of SMTP can be extended using our SMTP API which enables advanced functionality to take email management to the next level. You can use SendGrid’s SMTP API to perform tasks such as list management, open and click tracking, authentication, analytics integration, subscription management, and more. This is just one more way that SendGrid makes email delivery simpler and faster for developers.\n\nFor more information about the SendGrid SMTP API, you can visit our [Documentation page]({{root_url}}/for-developers/sending-email/getting-started-smtp/). There, you’ll be able to learn how to use the API and implement the right headers to gain the statistics you need.\n\nIn addition to our SMTP API, we also provide customers a Web API. Unlike the SMTP API, our [Web API]({{root_url}}/api-reference/) allows customers to retrieve information about their account and the messages they send to their recipient list. The Web API allows customers to see what messages are bounced back, what are reported as spam, and how many recipients unsubscribed from their email program.\n\nFinally, SendGrid also offers custom webhooks and other tools to give customers even more insight into their email programs. Some of our most versatile tools and apps include:\n\n* [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) – This webhook allows customers to automatically receive information about the performance of their email program through JSON posts to a url of their choosing. Event Webhook provides an easy way to track the status of messages and whether they have been delivered to specific email addresses.\n* [Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) – Rather than sending email from an address that doesn’t allow responses, customers can use the Parse Webhook to receive emails and even parse out the content and attachments.\n* [Reverse DNS]({{root_url}}/glossary/reverse-dns/) – If you’re sending email through SendGrid, reverse DNS allows you to remove the “sent via SendGrid” address in your messages, giving you a better sending reputation and removing SendGrid from the entire message.\n* [Transactional templates](https://sendgrid.com/dynamic_templates) – We created transactional templates to make creating different versions of templates easier for marketers and developers. With transactional templates, marketers can create and send email without the assistance of a technical person.\n"
  },
  {
    "path": "content/docs/glossary/smtp-provider.md",
    "content": "---\nseo:\n  title: SMTP Provider\n  description: An email SMTP provider helps deliver large amounts of email from your server to the recipient’s server.\n  keywords: smtp provider, smtp email provider\ntitle: SMTP Provider\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn email SMTP provider is an email delivery vendor that uses Simple Mail Transfer Protocol ([SMTP]({{root_url}}/glossary/smtp/)) to send and receive email messages. Email messages traverse SMTP to relay your messages from your server to the recipient’s server so that it can be delivered and read by the end recipient.\n\nWhile some companies choose to set up and monitor their own SMTP server to send their email to subscribers, many are opting for a reliable SMTP provider to handle their email for them. An SMTP provider is a third party [email service provider](https://sendgrid.com) that will send (and ideally, deliver) your email on your behalf. This is particularly beneficial for senders who are sending large volumes of email to ensure proper handling, delivering, and monitoring of their marketing and transactional email streams.\n\nUsing an SMTP provider has many benefits. Usually, SMTP providers, like SendGrid, are experts in the field of email delivery and will take proactive steps to ensure that email sent through their system follows the email best practices preferred by the ISPs and gets delivered. Secondly, an SMTP provider can bypass certain limits placed on individual senders, such as rate limits per hour or even volume limits, which can impact the success of your campaign. Lastly, the proper affiliation with an SMTP provider can reduce the probability that your emails will be [labeled as SPAM](https://sendgrid.com/blog/email-sending-spam-now/). An SMTP provider can also mediate with the ISPs and alert you to ongoing changes in the email landscape.\n\nMost importantly, an SMTP provider will deliver the right tools to help prevent, diagnose, and fix email delivery failures by allowing you to monitor what is going on with your email program. Email statistics such as delivery rates, response rates, and spam complaints can help you optimize your email campaigns for maximum email delivery and response. Plus, access to [email deliverability]({{root_url}}/glossary/deliverability/) experts through an SMTP provider can help supplement your team without taxing your internal resources or maintaining your own servers.\n\nSendGrid is an SMTP provider for both [transactional email](https://sendgrid.com/transactional-email) and [marketing email](https://sendgrid.com/email-marketing). We send billions of emails per month on behalf of senders across the globe. Our service is highly scalable, trusted, and reliable, enabling thousands of customers to communicate with their users effectively, efficiently, and without fail. Avoid the negative pitfalls that can come with email delivery by using SendGrid for automated and [bulk email sends]({{root_url}}/glossary/bulk-email-service/).\n\nWhen you become a SendGrid customer, we give you access to our [SMTP servers](https://sendgrid.com/blog/what-is-an-smtp-server/) so that you can send as many emails as you want. As you scale your company, we’ll monitor your sending reputation and inform you of any ISP policy changes to make sure your email is delivered. Some of the tools we provide you to take your company to the next level include:\n\n* Custom Apps and [Webhooks]({{root_url}}/for-developers/tracking-events/event/) – No matter what you want to track, we have the ability to show you who is opening your email, where your email is most successful, and who is reporting you as spam or unsubscribing from your recipient list.\n* [Industry Leading Customer Service](https://support.sendgrid.com/hc/en-us) – Our customer service team is capable of answering all your questions and helping you solve any problems that may arise with your email program.\n* Dedicated IPs – SendGrid allows you to take charge of your own sending reputation by giving you access to your very own IP. This means you won’t be affected by the actions of other companies’ sending habits.\n"
  },
  {
    "path": "content/docs/glossary/smtp-relay.md",
    "content": "---\nseo:\n  title: SMTP Relay\n  description: An SMTP relay is used to send email between SMTP servers, when the servers are located on different domains.\n  keywords: smtp relay, smtp relay service\ntitle: SMTP Relay\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn email SMTP relay service is used every time you send an email to someone outside of your address’ domain. SMTP, or Simple Mail Transfer Protocol, does the heavy lifting of sending the message. The relay service moves the message from your email server to the email server of the recipient. It’s like the handoff of the baton in a relay race.\n\nA relay is not used when an email is sent between parties on the same domain, because there is only one server involved. However, if there are multiple domains involved between email messages, then a relay is required to deliver between each server.\n\nWhen you’re sending a large volume of email, that handoff—the SMTP relay—becomes very important. If you’re sending [marketing email](https://sendgrid.com/email-marketing) like newsletters or [transactional email](https://sendgrid.com/transactional-email) from your applications, you want to make sure that other servers trust that your server is sending good email. An email SMTP relay service is a trusted third party that adheres to sending best practices to help emails get delivered.\n\nIn an effort to reduce spam, many internet providers will limit the amount of SMTP relays it will conduct each day. This means that a business that sends large amounts of email may get their legitimate emails categorized as spam. Even a peer-to-peer email server will experience this when sending bulk email messages. An SMTP relay service provider can help prevent this deliverability problem and ensure that your emails get to the inbox.\n\nSendGrid provides SMTP relay services for both transactional email and marketing email. Because we send billions of emails per month, our service is highly scalable, trusted, and reliable. Avoid the negative pitfalls by using SendGrid for automated and bulk email sends.\n"
  },
  {
    "path": "content/docs/glossary/smtp-server.md",
    "content": "---\nseo:\n  title: SMTP Server\n  description: SMTP server (Simple Mail Transfer Protocol) is an applications used to send email and react to response codes from receiving servers.\n  keywords: smtp server\ntitle: SMTP Server\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn SMTP server is used to send email. Though server is in the name, they do not necessarily reside on an entire machine. Rather, an [SMTP server is an application](https://sendgrid.com/blog/what-is-an-smtp-server/) that runs all the time awaiting new mail to send.\n\nEmail is sent using SMTP—Simple Mail Transfer Protocol. At its most basic, an SMTP server must speak this protocol. Modern SMTP servers must also consider methods for authenticating, such as DKIM and SPF. Authenticating email is one of the best ways to signal to receiving servers that the email you are sending is legitimate.\n\nWhen sending large amounts of email, SMTP servers need to be able to react intelligently to response codes from receiving servers. Some email providers, such as Yahoo! Mail and AOL, will throttle the number of emails they allow through at a time. In that case, the servers return error codes to note temporary unavailability.\n\nThrottling can pose a significant deliverability problem for applications sending [transactional emails](https://sendgrid.com/transactional-email) (emails triggered by a user’s interaction with a web application, such as password changes or purchase receipts). In these instances, a business or app is not relaying the vital information their users expect, because their SMTP servers cannot react to the error response codes. When this happens, email deliverability rates drop, affecting customer satisfaction and retention.\n\nSendGrid wrote its own SMTP servers from scratch to efficiently send billions of emails per month. SendGrid customers all receive email authentication and SendGrid automatically reacts to throttling and other responses from receiving servers. For better deliverability, SendGrid automatically works with every email provider’s feedback loops to identify spam. SendGrid customers also have access to detailed analytics of all email sent through its SMTP servers.\n"
  },
  {
    "path": "content/docs/glossary/smtp-service.md",
    "content": "---\nseo:\n  title: SMTP Service\n  description: An SMTP service ensures delivery of your email at scale.\n  keywords: smtp service, smtp email service, smtp email delivery service\ntitle: SMTP Service\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn SMTP service makes it easy for developers to send email from their applications. Most modern programming languages have libraries to send email via SMTP, or Simple Mail Transport Protocol. An SMTP service provides an external mail server and has tremendous advantages over using an in-house server or one made available by a hosting provider.\n\nWhen developers send emails, they want to make sure the message is delivered. An SMTP service’s biggest value is deliverability. Though it’s not always possible to know whether a message has hit the inbox, following industry best practices increases deliverability. An SMTP service’s features should enable developers to follow best practices, such as removing unsubscribes, [bounced addresses](https://sendgrid.com/blog/email-bounce-management/), and spam reports. Further, it should be easy to trim a list’s unengaged recipients.\n\nThough developers themselves can make a difference in deliverability, some responsibility is also on the SMTP service. Many cloud web hosting providers have had their email servers denied, usually due to abuse or threat of abuse. An SMTP service should maintain relationships with popular ISPs to [avoid ending up on deny list]({{root_url}}/glossary/deny-list/). Working with ISPs involves setting up [structured feedback loops](https://sendgrid.com/blog/email-feedback-loops-top-4-tips-on-how-to-use-them/) to receive spam reports.\n\nAnother benefit of an SMTP service is scalability. As email programs grow, so do the cost and complexities of maintaining an in-house infrastructure. By using an SMTP service, developers can focus on developing their product instead of on email delivery maintenance.\n\nSendGrid’s SMTP service is responsible for 2% of the world’s non-spam email. It provides multiple methods to send email directly using SMTP and also via a Web API with libraries for all popular programming languages. SendGrid’s advanced statistics and analytics give developers all the data they need to follow industry best practices while maintaining visibility into how their emails are performing.\n\nLastly, SendGrid’s excellent support and compliance teams ensure a happy relationship with both ISPs and customers.\n"
  },
  {
    "path": "content/docs/glossary/smtp.md",
    "content": "---\nseo:\n  title: SMTP\n  description: SMTP is an acronym for Simple Mail Transfer Protocol. SMTP is a process and set of guidelines for sending email.\n  keywords: smtp, simple mail transfer protocol, smtp email\ntitle: SMTP\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nFor most people, sending an email is as simple as entering an email address, writing a message, and hitting “send;” a few minutes later, the same message arrives in the recipient’s inbox. What you may not know, however, is that there is an entire process a message needs to go through for this to happen.\n\nSMTP is an acronym for Simple Mail Transfer Protocol. SMTP is a process and set of guidelines that almost every email needs to go through in order to leave one outbox and arrive at another person’s inbox.\n\n## \tHow SMTP Works\n\nOnce you’ve composed and sent an email, it no longer appears as the sleek interface you see when you look at Gmail, Yahoo!, or Outlook. After hitting “send,” your email is transformed into a long string of plain text that contains information like timestamp, sender, recipient, heading, and message body. This string of code is sent to an SMTP server.\n\nAn [SMTP server]({{root_url}}/glossary/smtp-server/) is a constantly-running application that speaks SMTP. The server decodes your email, determines which server the message must be sent to for your recipient to retrieve it, and relays the message there.\n\nAfter the message has been relayed to the next server, the recipient’s email provider, like Yahoo! or Gmail, downloads the message and delivers it to the appropriate inbox.\n\n## \tWhy is SMTP Important?\n\nSMTP is important because it provides a common set of guidelines for messages to be transferred from one email host to another. Essentially, SMTP is the only way any email can be sent from one provider to another without losing any of the content or functionality.\n\nWhile sending one email is fairly simple, for larger organizations that send thousands or millions of [marketing](https://sendgrid.com/email-marketing) or [transactional email](https://sendgrid.com/transactional-email), the SMTP process can get much more complicated, requiring [SMTP relay service](https://sendgrid.com/blog/smtp-relay-service-basics/) and custom headers for multiple recipients.\n\nIf you have any SMTP questions, or if you want to know more about how SendGrid uses SMTP to send billions of email every month, contact the [SendGrid support](https://support.sendgrid.com/hc/en-us) team today.\n"
  },
  {
    "path": "content/docs/glossary/spam-filter.md",
    "content": "---\nseo:\n  title: Spam Filter\n  description: Software based email filters that look for spam and block it from going to the inbox.\n  keywords: spam, spam filter, block, email, email spam filter\ntitle: Spam Filter\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIf you discover spam that was sent by a SendGrid customer, please [report it to our team](https://sendgrid.com/report-spam/). We appreciate your help in keeping our email stream clean.\n\n</call-out>\n\nSpam Filters are software based email filters that block email on a range of attributes from words or phrases within the email to header information and other factors. The goal is to identify spam before it is delivered to the inbox.\n\nSpam filters typically will move the messages they find to the [spam folder]({{root_url}}/glossary/bulk-mail-folder/) within the user's respective email application, keeping that email out of the user's inbox entirely.\n\nTo get more information please check out our [Email Infrastructure Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/spam-reports.md",
    "content": "---\nseo:\n  title: Spam Reports\n  description: Spam Reports are triggered when a customer clicks the spam button in their email client.\n  keywords: spam report, spam reports\ntitle: Spam Reports\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIf you discover spam that was sent by a SendGrid customer, please [report it to our team](https://sendgrid.com/report-spam/). We appreciate your help in keeping our email stream clean.\n\n</call-out>\n\nSpam Reports are triggered when a customer clicks the spam button or puts your email in their [spam folder]({{root_url}}/glossary/bulk-mail-folder/) within their email client such as Yahoo, Outlook or AOL. Spam reports can only be gathered from Internet Service Providers (ISPs) that provide a Feedback loop.\n\nIt is important that spam reporter email addresses are permanently removed from your send list even if the customer has previously opted in. Continuing to send to customers that have reported your email as spam can severely affect your deliverability rating.\n\n<call-out>\n\nMake it easier for someone to find the unsubscribe button than it is to find the spam button.\n\n</call-out>\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n### Looking for more visibility into your email performance?\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/glossary/spam-traps.md",
    "content": "---\nseo:\n  title: Spam Traps\n  description: A SPF is an email authentication standard that helps ISPs better identify legitimate email senders.\n  keywords: spam trap, spam, honeypot, spamtrap\ntitle: Spam Traps\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIf you discover spam that was sent by a SendGrid customer, please [report it to our team](https://sendgrid.com/report-spam/). We appreciate your help in keeping our email stream clean.\n\n</call-out>\n\nSpam traps, also called “honeypots”, are email addresses created (or re-activated) by ISPs specifically to lure spammers. In many cases, the only way to acquire the address is through an automated email address harvesting process.\n\nSpam traps are important because so many large ISPs, spam filter providers, and Domain Name System [deny lists]({{root_url}}/glossary/deny-list/) use them. In short, sending an email to a spam trap can lead directly to being blocked by the organization that set up the trap. Remember that blocking can ruin a business’s reputation and halt further email deliverability.\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n"
  },
  {
    "path": "content/docs/glossary/spam.md",
    "content": "---\nseo:\n  title: Spam\ntitle: Spam\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n<call-out>\n\nIf you discover spam that was sent by a SendGrid customer, please [report it to our team](https://sendgrid.com/report-spam/). We appreciate your help in keeping our email stream clean.\n\n</call-out>\n\nThe most simple way to define spam in the Email world is by using these 2 words: `unwanted email`.\n\nSince it’s so easy for a message to fall in this category, as a Sender you may want to know how and why emails can get marked as spam.\n\nThese are some of the most common reasons for which an email may end up in the Spam Folder and ways to avoid this:\n\n1. **Improper authentication**: Authentication is extremely important as it helps ISPs identify you as a sender. Think of it as knocking on someone’s door. You want to inspire trust in order to get invited in their home. In the email world you can do so by making sure your email server supports these protocols ([DKIM, Domain Keys]({{root_url}}/glossary/dkim/), [SPF]({{root_url}}/glossary/spf/), and [Sender ID]({{root_url}}/glossary/sender-id/)) and that they are properly implemented. SendGrid ensures authentication by setting up DKIM and SPF records automatically for you. For Pro 100k or above packages, we offer dedicated IPs which can be [authenticated]({{root_url}}/ui/sending-email/how-to-set-up-domain-authentication/) with your sending domain and therefore strengthening the authentication.\n\n2. **High complaint rate**: If too many people are flagging your mail as spam, ISPs will take action and will first start sending your mail to the Spam Folder, then they may start throttling your messages or even block them. Keeping an eye on the complaint rate is critical if you want to reach the Inbox.\n\n3. **Lack of an Unsubscribe Link**: It is important to give customers the choice to opt out of a service. Not adding an Unsubscribe link to emails will force a subscriber to hit the Spam button in order to stop receiving emails from a Sender. Avoid this by adding an opt-out link to your emails. Some studies have shown that you can lower the complaint rates by simply placing the Unsubscribe link at the top of your emails and making it visible, easy to find.\n\n4. **High Frequency**: This is the number one reason subscribers either hit the Spam Button or Unsubscribe from an email stream. ISPs want to make sure that their users’ mailboxes don’t get crowded and in order to protect their users from email fatigue they can start junking the messages. To avoid this, the best way to go about it is to simply include a link to your [Email Preference Center](https://sendgrid.com/blog/need-email-preference-center/) in your emails. This way you let your subscribers tell you how often they want to hear from you.\n\n5. **Sending to inactive users**: People’s interests change all the time and so it happens with emails. Subscribers can lose interest and stop opening the emails. The most common tendency is to send emails to even more users. However, this will only hurt your deliverability even more because ISPs have ways of monitoring the activity of the users. They can check whether users open the emails, click on links, and delete or mark emails as spam or not spam. Basically, they monitor the users’ level of responsiveness or engagement. Based on these metrics, ISPs decide folder placement - whether the email goes to the Inbox or if it gets Junked. The only way to avoid hitting the Spam Folder is by tracking [user engagement](https://sendgrid.com/blog/email-reputation-and-email-engagement-metrics/). For all users, SendGrid offers the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) to help with that. [Here](https://sendgrid.com/blog/infer-engagement-with-the-event-api/) is our recommendation on how to use the Event Webhook in tracking your customers' responsiveness to your emails. The key part in tracking user engagement is an appropriate [sunset policy](https://sendgrid.com/blog/putting-engagement-data-use-sunset-policies/) for your business. Before removing the inactive users from your distribution lists, it is worth trying to reengage them. One great way to do that is by sending them [reconfirmation campaigns]({{root_url}}/glossary/reconfirmation/).\n\n6. **Inadequate content**: It is well known that the ISPs are protecting their users with the help of spam filters. Using the wrong words or even characters in your email can trigger the spam filters and therefore throw your email in the Spam Folder. The key thing to remember, is that a spam filter is trying to remove commercial advertisements and promotions. So generally, words that are common in such emails should be avoided or used sparingly. That said, take a look at these [100 Spam Trigger Words & Phrases to Avoid](http://blog.hubspot.com/blog/tabid/6307/bid/30684/The-Ultimate-List-of-Email-SPAM-Trigger-Words.aspx).\n\nTo find out more about what you can do to ensure your email is being received by your recipients, you may also want to check out our [Tips and Tricks to Stay Out of the Spam Folder](https://sendgrid.com/blog/tips-tricks-stay-spam-folder-qa/).\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n## Additional Resources\n\n- [Spam Filter]({{root_url}}/glossary/spam-filter/)\n- [Spam Reports]({{root_url}}/glossary/spam-reports/)\n- [Spam Trap]({{root_url}}/glossary/spam-traps/)\n- [Spam]({{root_url}}/glossary/bayesian-filter/)\n"
  },
  {
    "path": "content/docs/glossary/spf.md",
    "content": "---\nseo:\n  title: SPF\n  description: SPF is an email authentication standard that helps ISPs better identify legitimate email senders.\n  keywords: spf, sender policy framework\ntitle: SPF\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSender Policy Framework (SPF) is an open standard for authenticating email that was originally developed by AOL. SPF attempts to ensure that the IP address from which a message was sent is approved to send email by a domain’s owner.\n\nImagine you own the domain `example.com`. You also have an email server that uses the IP address `127.0.0.1`. You may use an SPF record to designate this IP address, `127.0.0.1`, as the only IP allowed to send email using an `example.com` email address. When an email server receives a message from `sender@example.com`, it can check the IP address that delivered the message. If the IP is anything other than `127.0.0.1`, the SPF check will fail, informing the receiving server that the message is from an unauthorized source.\n\n## SPF Records\n\nAn SPF record is implemented using a [TXT](https://en.wikipedia.org/wiki/TXT_record) DNS record. The TXT record has several values, the first being `v=spf1`. This first value indicates that the TXT record is a version 1 SPF record.\n\nThe remaining mechanisms in an SPF record are \"INCLUDE,\" \"A,\" \"MX,\" \"IP4 and IP6,\" and \"REDIRECT.\" These mechanisms specify either an approved IP address directly or a domain that will resolve to an IP address.\n\nSPF is one of several effective ways to check an email’s legitimacy, and this article provides only a brief overview. For more information about SPF, see [SPF Records Explained]({{root_url}}/ui/account-and-settings/spf-records/).\n"
  },
  {
    "path": "content/docs/glossary/spoofing.md",
    "content": "---\nseo:\n  title: Spoofing\n  description: Spoofing is a technique where forged email addresses are used to trick recipients into opening an email because the source has been hidden\n  keywords: spam, phishing, spoofing\ntitle: Spoofing\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nEmail spoofing is the practice of sending email with a forged From address, and it's one tactic used to deliver potentially dangerous messages. Because a spoofed email looks to be from a legitimate contact, spoofing is often used in [phishing]({{root_url}}/glossary/phishing/) emails that aim to extract personal data from recipients.\n\nUnfortunately, spoofing a From address is relatively easy because email has no built-in authentication mechanisms. To combat spoofing, several standards have been developed including, [Sender Policy Framework (SPF)]({{root_url}}/glossary/spf/), [DomainKeys Identified Mail (DKIM)]({{root_url}}/glossary/dkim/), and [Domain-based Message Authentication, Reporting and Conformance (DMARC)]({{root_url}}/glossary/dmarc/).\n\nTo understand spoofing, you should also know that an email actually has two From addresses. There is the Header From or _friendly_ from address and the Envelope From or `return-path` address.\n\n## Header From\n\nThe Header From or friendly From address is the one displayed in the **From** field of your email client. This From address is less important for directing email traffic. Think of the Header From address like the address on the letterhead of paper correspondence—the postal service **does not** use this address to route mail; it’s there as a _friendly_ bit of information for the reader.\n\nSpoofing the Header From address places false information in the **From** field of your email client, and it's called display name abuse. Display name abuse is a user interface change that isn’t handled by common methods of spoofing protection such as SPF, DKIM, and DMARC.\n\n## Envelope From\n\nThe Envelope From address informs receiving email servers where to deliver replies and where to send [bounces]({{root_url}}/glossary/bounces). Think of the Envelope From as the return address on a paper letter’s envelope—the postal service **does** use this address to route mail; it’s there to establish the sending source of the letter.\n\nFor email, you can find the Envelope From address in your email client by selecting \"Show Original,\" \"View Message Source,\" \"Show Headers,\" or a similar option depending on your email client. The Envelope From is not usually displayed to a message’s recipient by default.\n\nWhen we discuss spoofing in relation to SPF, DKIM, and DMARC, we are talking about attempts to prevent spoofing the Envelope From or `return-path` address.\n\nBecause spoofing this address can route your replies, and any sensitive information they contain, to a bad actor, a lot of effort has gone into the standards listed above to prevent email abuse. For more information about how these standards work, see the articles listed in the [Additional Resources](#additional-resources) section of this page.\n\n## Reporting Email Abuse\n\nSendGrid works hard to keep our email stream clean. Despite our best efforts, spam does occasionally leak through our defenses. If you discover spam that was sent by a SendGrid customer, please report it to our team by sending it to abuse@sendgrid.com or opening a ticket with [SendGrid Support](https://support.sendgrid.com/hc/en-us). No matter who sent the phishing email, you can file a report with the [Federal Trade Commission](http://www.ftc.gov/complaint).\n\nIf we find that a SendGrid customer is sending spoofed or phishing emails, we will ban their account immediately\n\n## Additional Resources\n\n- [DKIM Records Explained]({{root_url}}/glossary/dkim/)\n- [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/)\n- [SPF Records Explained]({{root_url}}/ui/account-and-settings/spf-records/)\n- [Email Infrastucture Guide](https://sendgrid.com/resource/the-email-infrastructure-guide-build-it-or-buy-it/)\n"
  },
  {
    "path": "content/docs/glossary/subscriber-list-management.md",
    "content": "---\nseo:\n  title: Subscriber List Management\n  description: Managing your subscriber list is key to keeping your subscribers happy.\n  keywords: subscriber list management, unsubscribes, email lists\ntitle: Subscriber List Management\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nMaintaining good list management is a key element in keeping your users happy. Sending email to someone who has unsubscribed or never signed up in the 1st place is a big no-no in the email game.\n\nMake sure to check your list statistics. You can do this in [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) by clicking on the stats button next to your recipient list name. You can also [manage your unsubscribes]({{root_url}}/ui/sending-email/index-suppressions/) by clicking the manage unsubscribes button next to your recipient list name.\n\nMake sure you are sending mail to people who actually want your mail. Otherwise, you will get lots of [spam reports]({{root_url}}/glossary/spam-reports/), [blocks]({{root_url}}/glossary/blocks/) and [bounces]({{root_url}}/glossary/bounces/).\n\nFinally, make sure you do not buy email lists or engaging in [Email Harvesting]({{root_url}}/glossary/email-harvesting/). For tips on getting your messages to the Inbox, please see our [email deliverability]({{root_url}}/ui/sending-email/deliverability/) page.\n"
  },
  {
    "path": "content/docs/glossary/suspicious-sender.md",
    "content": "---\nseo:\n  title: Suspicious Sender\n  description: A suspicious sender is a sender who sends email to recipients who have not given them express permission to do so.\ntitle: Suspicious Sender\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA suspicious sender (some services use the term \"black hat sender\") is a sender or company who sends email to recipients that didn't specifically request to receive emails from that sender. It is somebody that sends unsolicited emails to recipients that never requested them.\n\nNot all suspicious activity is intentional though. Even senders who have their recipient's permission but send an excessive amount of email or who send at an alarming frequency may be flagged by users as “spam.\" These senders will be identified by the recipient's ISP, which may throttle the sender's email, send it to spam traps, or totally block the emails.\n\nIf your emails are not getting the clicks and opens you expect, you may want to re-evaluate your sending habits. Also, please take a look at our [email deliverability tips]({{root_url}}/ui/sending-email/deliverability/) for help in being a trusted sender.\n\nFor more information:\n\n* [Email Harvesting]({{root_url}}/glossary/email-harvesting/)\n* [Trusted Sender]({{root_url}}/glossary/trusted-sender/)\n"
  },
  {
    "path": "content/docs/glossary/system-fields.md",
    "content": "---\nseo:\n  title: System Fields\n  description: System fields are available in the campaign builder that allow you to insert specific content into your campaign, such as web links, unsubscribe links, or links to your campaign's subscription preferences page. These system substitution tags are not related to your contact data and should not be confused with reserved or custom fields.\n  keywords:\ntitle: System Fields\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[System Fields]({{root_url}}/ui/sending-email/editor/#using-subustitution-tags), also known as Subsitution Tags are available in the campaign builder that allows you to insert specific content into your campaign, such as web links, unsubscribe links or links to your campaign's subscription preferences page. These system substitution tags are not related to your contact data and should not be confused with reserved or [custom fields]({{root_url}}/glossary/custom-fields/)custom fields.\n"
  },
  {
    "path": "content/docs/glossary/teammates.md",
    "content": "---\nseo:\n  title: Teammates\n  description: Manage multiple users on one SendGrid account.\n  keywords: teammates, permissions, access, user access, multiple users\ntitle: Teammates\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n[Teammates]({{root_url}}/ui/account-and-settings/teammates/) is an account administration and security tool designed to help manage multiple users on a single SendGrid account. Teammates is built for groups of shared users, where each user has a different role and thus requires access to different SendGrid features.\n\nA marketer, developer, and accountant would each have their own teammate account under one SendGrid parent account. The parent SendGrid account will always have administrator level teammate permissions, and may grant any or all of these permissions to other teammates.\n\nAs an example of role specific permissions, the marketer would be given the following levels of access:\n\n- [Alerts]({{root_url}}/ui/account-and-settings/alerts/) - Full Access\n- [Category Management]({{root_url}}/ui/analytics-and-reporting/categories/) - Read Access\n- [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) - Read Access\n- [Mail Send: Scheduled Sends](https://sendgrid.api-docs.io/v3.0/mail-send) - Read Access\n- [Mail Settings: Spam Checker]({{root_url}}/ui/account-and-settings/mail/#spam-checker) - Full Access\n- [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) - Full Access\n- [Stats]({{root_url}}/ui/analytics-and-reporting/stats-overview/) - Read Access\n- [Suppressions]({{root_url}}/ui/sending-email/index-suppressions/) - Full Access\n- [Template Engine]({{root_url}}/ui/sending-email/create-and-edit-legacy-transactional-templates/) - Full Access\n- [Tracking]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) - Full Access\n"
  },
  {
    "path": "content/docs/glossary/throttling.md",
    "content": "---\nseo:\n  title: Throttling\n  description: Learn more about deferrals and throttling\n  keywords: deferred, deferral, throttling, bounce, block\ntitle: Throttling\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nSo, you tried to send a bunch of emails, and when you checked your [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) or your [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) page, you see a number of messages are marked as \"Deferred\" instead of \"Delivered\". Or maybe you're noticing a lot of addresses in your [Blocks](https://app.sendgrid.com/suppressions/blocks), but not many in your Bounces. What? Why aren't your recipients currently in awe at the glory of your amazing message?\n\nSendGrid continues to attempt to send messages for up to 72 hours or until successful delivery. Normally, it takes between a few minutes and a few hours for a deferred messages successful delivery - it depends on the receiving mail server.\n\nThrottling is when a receiving server refuses a message, but with a specific explanation that tells our server that it's only a temporary refusal. The error is usually something like \"user is receiving mail at too great a rate right now, please try again later\", or \"user's mailbox is over quota.\" These errors are most often 400 errors - indicating a temporary failure. They are not often 500 errors - indicating a permanent failure.\n\n## \tWhat causes a deferral?\n\n-   The receiving server doesn't recognize your IP, and may think you're sending spam. This is why [warming up your IP]({{root_url}}/ui/sending-email/warming-up-an-ip-address/) is so important. IP Warmup allows recipient mail servers to become familiar with your sending habits, and later anticipate your messages.\n\n-   The receiving server doesn't have any open ports to receive email.\n\n-   The recipient's mailbox is full.\n\n-   Some recipients have marked your mail as spam, but not enough for the server to block you. Instead, they will refuse to receive more until they can learn more about how their users interact with your messages.\n\nIf a message is continuously deferred for 72 hours, it may mean that there is another issue such as the account being inactive, a full mailbox, or some other legitimate problem with the recipient. When we are unable to deliver a message after this time period, we convert these deferrals to \"Blocks\". Blocks are stored for reference and do not behave like a suppression list when sending to addresses that are on the list.\n"
  },
  {
    "path": "content/docs/glossary/timezone.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Timezones\nnavigation:\n  show: false\nseo:\n  title: Timezones\n  override: true\n  description: Local time, based on your current geographic location on the earth. \n---\n\nTimezones can be a tricky thing to wrangle, because depending on where you normally work and what your current local time is, \nyou may come across times that don't always work with what you're expecting.\n\nWhen you create your SendGrid account, you will set the timezone for your account in your profile. This timezone will be \nused for times displayed in the SendGrid UI and for scheduling Marketing Campaigns.\n\nWhen you use the API or look at event listings, you may notice something that you receive numbers. These numbers are a [Unix \nTimestamp](http://en.wikipedia.org/wiki/Unix_time), which basically means the number of seconds since \"00:00:00 Coordinated Universal \nTime (UTC), Thursday, 1 January 1970\".\n\nIf for some reason you are running into timezone issues with scheduling Marketing Emails, please remember that you have the option to\nspecify a timezone when you schedule the email to go out. If you don't specify the timezone, it will default to current Pacific Time \n(UTC-7 or UTC-8, depending on daylight savings time). When viewing the campaigns, you may notice that the times say something like\n \"Sent on 8:35 AM UTC -0700\". This means that the campaign was sent at 8:35am in the \"UTC -0700” timezone (aka MST or PDT) not at 8:35am minus 7 hours.\n"
  },
  {
    "path": "content/docs/glossary/tls.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Transport Layer Security\nnavigation:\n  show: false\nseo:\n  title: Transport Layer Security\n  override: true\n  description: Protect transmission of email information with TLS and SendGrid\n---\n\nTransport Layer Security (TLS) is an encryption protocol that’s used to encrypt information in transit over the Internet. TLS uses certificates to encrypt sessions to maintain confidentiality of information. SendGrid uses TLS to encrypt sessions with its application via HTTPS and API.\n\nSendGrid also utilizes “opportunistic TLS” for sending email via [SMTP]({{root_url}}/glossary/smtp/) or our [Web API](https://sendgrid.api-docs.io/v3.0/mail-send). Opportunistic TLS means that we will encrypt your email sending from your end point all the way to the recipient, providing that the recipient’s mail server is configured to support TLS.\n\nUsing TLS is increasingly important to protect your privacy and the privacy of your recipients, and to prevent online surveillance.\n\nFor more background on opportunistic TLS, read our blog post on the [Future of Email Security](https://sendgrid.com/blog/sendgrid-and-the-future-of-email-security/).\n\nFor information on configuring your system to utilize TLS, see our information on setting up your server for sending email.\n"
  },
  {
    "path": "content/docs/glossary/transactional-email-templates.md",
    "content": "---\nseo:\n  title: Transactional Email Templates\n  description: Transactional email templates are pre-coded email layouts that anyone can use to easily create and send transactional emails.\n  keywords: transactional email templates, email template, template engine\ntitle: Transactional Email Templates\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nTransactional email templates are pre-coded email layouts that marketers, designers, and developers can use to quickly and easily create transactional email campaigns. SendGrid’s transactional email templates allow non-technical and technical people alike to make real-time changes to the email their recipients receive.\n\nIn the past, creating an email required marketers to work with designers and developers to develop the final message received by recipients. The SendGrid transactional template editor relieves a lot of this work by providing marketers and designers with various email layouts they can use within The SendGrid UI. This frees up developers to focus on more important projects, while the marketers can easily create and send their emails.\n\nSendGrid's [transactional templates](https://sendgrid.com/templates) give each user the ability to create their own templates for each of the transactional emails they need to send. Different email templates can be created, saved, and edited for purchase receipt emails, account notification emails, or password reset emails.\n\n## \tUsing Transactional Templates\n\nTransactional templates allow users to modify their content via WYSIWG or HTML. They also allow users to preview how transactional email templates will look on both [mobile and desktop platforms](https://sendgrid.com/blog/5-tips-designing-email-for-mobile/). The email experts have also created a few [responsive email templates](https://sendgrid.com/blog/responsive-templates-make-sure-everyone-can-read-email/) so that you can make sure your messages look great on any device.\n\nThe transactional templates design section allows marketers to easily design a template, without the need for complex coding. Developers can then manage multiple templates created with a RESTful API and integrate them into applications.\n\nTo learn more about the SendGrid transactional email templates, you can visit the [technical documentation]({{root_url}}/ui/sending-email/create-and-edit-legacy-transactional-templates/), or the [API Reference](https://sendgrid.api-docs.io/v3.0/transactional-templates)\nBy using SendGrid's transactional template application, marketers can maintain control of their email design while enjoying the strong [email deliverability]({{root_url}}/glossary/deliverability/) that SendGrid provides. They can create a vast array of different email templates, all with the confidence of knowing their emails will reach the inbox.\n\n[Contact the SendGrid support team](https://sendgrid.zendesk.com/hc/en-us) if you have any questions about implementing and using transactional templates or visit our blog to learn more about [marketing and transactional email best practices](https://sendgrid.com/blog/marketing-and-transactional-email-best-practices-checklist-2/).\n"
  },
  {
    "path": "content/docs/glossary/transactional-email.md",
    "content": "---\nseo:\n  title: Transactional Email\n  description: Transactional Emails represent the emails which are triggered by a user interacting with a web application.\n  keywords: transactional email, transactional emails, transactional email service\ntitle: Transactional Email\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nTransactional email is relationship content that “facilitates an already agreed-upon transaction or updates a customer about an ongoing transaction.” It includes any email triggered by a user’s interaction with a web application, such as:\n\n* Account Signups\n* Password changes\n* Purchase Receipts\n* Check-ins\n* Notifications\n* Friend/follower requests\n\nThese emails typically contain information a user wants or needs and consequently have the highest open rates across all categories of email.\n\nBecause transactional email is so desired, you want to make sure that it consistently reaches your customers’ inboxes. In order to ensure strong email deliverability, rely on a trusted cloud-email service like SendGrid.\n\nSendGrid’s [transactional email platform](https://sendgrid.com/transactional-email) provides:\n\n* Robust email deliverability features: including authentication, reputation monitoring, dedicated IP addresses, and more\n* Easy Integration: through flexible web and SMTP APIs plus a simple SMTP relay set-up\n* Real-time analytics and reporting: including open, click, bounce, unsubscribe tracking, and more\n* Live Customer Support: 24/7 email, phone, and chat support\n\nTransactional email is an incredibly effective communication tool that can help drive revenue, reduce support costs, and build customer loyalty. As the most desired and expected form of email communication, transactional email can help grow your business and should be an integral component of any customer communication program.\n\nTo make sure you're sending the most effective Transactional email, make sure you are building a good email with a good visual, concise content, and appropriate headers.\n\nHere are a few good \"tools\" you can use to get the most out of your Transactional email sending:\n\nA good visual email means the email shows up in a clear and appealing manner to the consumer. Concise content means the email is formatted clearly and there is a good ratio of text, hyperlinks, and pictures. To check your code for these Transactional emails, check out the API library in your preferred programming language from our [API Reference Index]({{root_url}}/api-reference/). The [SMTPAPI header]({{root_url}}/Utilities/smtpapi_validator.html) will validate the header you've used for SMTP API and the [SendGrid List Management Tools]({{root_url}}/ui/managing-contacts/managing-contact-list/#managing-your-list) will help you update your email list to get the best deliverability.\n\n"
  },
  {
    "path": "content/docs/glossary/triggered-actions.md",
    "content": "---\nseo:\n  title: Triggered Actions\n  description: Triggered Actions are initiated by a triggering event.\n  keywords: automated email, triggered actions, triggering events, Threads\ntitle: Triggered Actions\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nTriggered actions are automatically initiated when a specific [triggering event]({{root_url}}/glossary/triggered-actions/) that you are tracking takes place. These actions must be defined in advance, and they must be associated with a predetermined user and event.\n\nSendGrid has partnered with [Klaviyo](https://sendgrid.com/partners/klaviyo/) to help you drive sales by using data to send triggered email, segment your lists, run better Facebook ads, and more. An example of a triggered action might be an email message (or series of messages) welcoming a new user to your website or application.\n\n<call-out>\n\nTo learn more about the different actions that Klaviyo can provide visit their [website](https://www.klaviyo.com/).\n\n</call-out>\n"
  },
  {
    "path": "content/docs/glossary/triggered-email.md",
    "content": "---\nseo:\n  title: Triggered Email\n  description: Triggered emails are another name for automated emails that are triggered by specific events or actions.\n  keywords: automated email, triggered email, Threads, triggering event, event\ntitle: Triggered Email\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\n\n\nTriggered email is another term for email automation, or [automated email]({{root_url}}/glossary/automated-email/).\n\n<call-out>\n  \nInterested in sending automated email? SendGrid Automation is a new offering that's currently in beta among select users. [Visit SendGrid.com](https://sendgrid.com/solutions/marketing-automation/?utm_source=docs) to learn more and be added to the waitlist.\n\n</call-out>\n\n\n"
  },
  {
    "path": "content/docs/glossary/trusted-sender.md",
    "content": "---\nseo:\n  title: Trusted Sender\n  description: A trusted sender is a sender who only sends email to those recipients who have given them express permission to do so.\ntitle: Trusted Sender\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nA trusted sender (some services use the term, \"white hat sender\") is a sender or company who only sends email to those recipients who have given express permission to receive email from the sender. Put simply, trusted senders always strive to “send the right message, to the right person, at the right time, with the right frequency.”\n\nSendGrid has a plethora of resources to help you be a trusted sender, and to get your email to the inbox and not the spam folder. Check out our [email deliverability]({{root_url}}/glossary/deliverability/) tips to help.\n\n## Additional Resources\n\n* [Bulk Email Folder]({{root_url}}/glossary/bulk-mail-folder/)\n* [Email Deliverability]({{root_url}}/glossary/deliverability/)\n* [Sender Authentication]({{root_url}}/glossary/sender-authentication/)\n* [Suspicious Sender]({{root_url}}/glossary/suspicious-sender/)\n"
  },
  {
    "path": "content/docs/glossary/two-factor-authentication.md",
    "content": "---\nseo:\n  title: Two Factor Authentication\n  description: Multi-factor Authentication requires the user to have some information that only they could have to log into an account.\n  keywords: 2FA, Two Factor Authentication, Multi-factor Authentication, two step verification\ntitle: Two Factor Authentication\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nTwo-Factor Authentication (also known as Multi-factor authentication, 2FA, two step verification, or TFA) is an extra layer of security enforced during authentication that requires not only a password and username but also something that only that user has on them, that is a piece of information only they should know or have immediately at hand such as a physical token, a phone application, or a device.\n\n<call-out type=\"warning\">\n\nSendGrid no longer accepts Basic authentication for API calls when two-factor authentication is enabled for a user. You can now only use two-factor authentication if you are authenticating with an API key. For more information, see [Authentication]({{root_url}}//for-developers/sending-email/authentication/).\n\n</call-out>\n\nWith SendGrid, you can turn this security feature on in your [Account Settings]({{root_url}}/ui/account-and-settings/two-factor-authentication/).\n\n## Additional Resources\n\n- [Two-Factor Authentication FAQ]({{root_url}}/ui/account-and-settings/two-factor-authentication/)\n"
  },
  {
    "path": "content/docs/glossary/undelivered-email.md",
    "content": "---\nseo:\n  title: Undelivered Email\n  description: Email can be undelivered for various reasons, including an issue with email address or content.\ntitle: Undelivered Email\nweight: 100\nlayout: page\nnavigation:\n  show: false\n---\n\nUndelivered email can be the result of several things but most commonly there is an issue with the email address or content.\nOnce an email send has been attempted but failed, a couple things can happen to your email:\n\n* Bounced emails are ones that were rejected by the recipient's server\n* Invalid emails were sent to email addresses that do not exist\n* Emails can be marked as [spam]({{root_url}}/glossary/spam/) by the recipient for various reasons\n* An email is [Dropped]({{root_url}}/glossary/drops/) when the recipient is on a [suppression list]({{root_url}}/ui/sending-email/index-suppressions/)\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/glossary/unknown-user.md",
    "content": "---\nseo:\n  title: Unknown User\n  description: Bounced - Unknown User is an error indicating the email address does not exist.\n  keywords: unknown, user, bounce, undelivered, email\ntitle: Unknown User\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nIf an email address (user) does not exist at the organization or domain, it will receive Unknown User response (a hard bounce error).\n\nAn Unknown User response is typically due to SMTP 5.5.0 errors which cause an email to be undeliverable to an inactive, incorrect, or disabled recipient address.\n\n ### \tAdditional Resources\n* [Delivery Metrics]({{root_url}}/ui/analytics-and-reporting/stats-overview/)\n* [Bounces]({{root_url}}/glossary/bounces/)\n* [Subscriber List Management]({{root_url}}/glossary/subscriber-list-management/)\n"
  },
  {
    "path": "content/docs/glossary/utm-parameters.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: UTM Parameters\ngroup: glossary\nseo:\n  title: UTM Parameters\n  description: Defintion of UTM Parameters\n  keywords: \nnavigation:\n  show: false\n---\n\n## UTM Parameters\n\nUTM parameters are tags that you add to a URL to gain better visibility into your web analytics. When a user interacts with your link, data is sent to Google Analytics so that you can track and monitor your traffic. For example, a UTM parameter can help determine which social media campaign brought the most web traffic or which call to action in an ad generated more purchases.\n"
  },
  {
    "path": "content/docs/glossary/web-api.md",
    "content": "---\nseo:\n  title: Web API\n  description: Web API allows web servers and web browsers to easily interface with each other to enable account and data collection for services such as email.\n  keywords: web api, web api integration\ntitle: Web API\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nAn API is an application programming interface (API) that serves as an interface between a web server and a web browser. A web API allows for the sharing of data and functionality between web apps. For example, [SendGrid’s Web API]({{root_url}}/api-reference/) enables users to retrieve data about their email program like spam reports or blocked email addresses.\n\nUsing a web API is extremely efficient because it eliminates the need for code-sharing – a process that can be complex and messy while making some developers uncomfortable. Web APIs allow you to easily share a certain set of features and data with a large group of people while maintaining privacy and to create consistency in the delivery of that data and functionality while saving valuable development time and money. Channel the notoriously private Google and you’ll quickly understand why using web APIs has become the preferred method in the development community.\n\nConsumers are looking for super easy ways to sync the plethora of services they employ in their everyday lives, whether it be for personal or business use. Using a Facebook or Google+ ID to log in to a third-party app is a super simple example of how a web API can create efficiency for both user and developer. However, apps that power their services using third party web APIs are limited to the features made available from the originating application and/or its longevity in the marketplace. What is available today may not be available tomorrow so having a contingency plan should be a developer’s priority.\n\nSendGrid’s web API is specific to email delivery using our platform. Integration using our web API allows you to collect account and email data including response rates, spam reports, and statistics. This option serves an alternative to our [SMTP configuration]({{root_url}}/for-developers/sending-email/getting-started-smtp/) in that it supports situations when HTTP is your only option, or in situations where you do not control your application environment. Additionally, if there is high latency between our 2 apps or if you’ve built a library to send email, our web API makes integration with SendGrid super easy.\n\nSendGrid’s web API allows our customers to pull information about their email program without having to actually log on to SendGrid.com. Customers can pull lists, statistics, and even email reports. In addition to this, Customers can send email via the web API without using [traditional SMTP]({{root_url}}/glossary/smtp/).\n\nWe also provide an [SMTP API]({{root_url}}/glossary/smtp-api/) that functions a bit differently than our web API. Our SMTP API allows customers to use message templates, provide custom delivery and handling options, and include advanced tracking and analytics.\n\n[SendGrid is a mail server]({{root_url}}/glossary/smtp-server/) built for developers by developers. We provide the most comprehensive solutions for simplified email delivery. With over 150,000 companies using SendGrid, we have become the largest email infrastructure as a service provider in the world.\n"
  },
  {
    "path": "content/docs/glossary/whitelabel.md",
    "content": "---\nseo:\n  title: Whitelabel\ntitle: Whitelabel\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nIn an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. **A whitelabel is now generally called sender authentication.** A domain whitelabel is now called [domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). A link whitelabel is now called [link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/). An IP Whitelabel is now called [reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/).\n\nSender authentication refers to the process of showing ISPs that SendGrid has your permission to send emails on your behalf. To set up a sender authentication, add DNS records to your hosting service. These DNS records associate your sending domain with SendGrid— when an inbox provider processes your email, they will see your domain instead of sendgrid.net. You can also add authentications for the links in your email as well as dedicated IP addresses associated with your account (available with Pro level or higher accounts).\n\n## \tAdditional Resources\n\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n"
  },
  {
    "path": "content/docs/glossary/x-message-id.md",
    "content": "---\nseo:\n  title: X-Message-ID\n  description: The X-Message-ID is a header returned when making a mail send.\n  keywords: X-Message-ID, Track\ntitle: X-Message-ID\nweight: 0\nlayout: page\nnavigation:\n  show: false\n---\n\nThe following image depicts a response after the mail is sent:\n\n![]({{root_url}}/images/example_response.png \"Example Response\")\n\nThe X-Message-ID is a header returned when making a mail send which can be used to track events that the Event Webhook posts.\n\nWhen using the Event Webhook, it's a best practice to store your X-Message-ID. X-Message-ID data helps with deduplications in your webhook data. It can be used to find all corresponding Message-IDs.\n\nSendGrid recommends that users store this data to correlate to their Event Webhook data, and this data is very useful for Support troubleshooting.\n\nRelated Articles\n- [Message-ID]({{root_url}}/glossary/message-id)\n"
  },
  {
    "path": "content/docs/release-notes/2017-07-07.md",
    "content": "---\ntitle: \"release notes 2017-07-07\"\ndate: 2017-07-07\nreleaseType:\n  - ui\n---\n\n###\tResponsive image enhancements\n\nImages are now responsive to the container they’re held within, as opposed to being a percent of their original size."
  },
  {
    "path": "content/docs/release-notes/2017-08-01.md",
    "content": "---\ntitle: \"release notes 2017-08-01\"\ndate: 2017-08-01\nreleaseType:\n  - ui\n---\n\n###\tNew editing experience\n\nThe editing experience has been updated to offer <a href=\"https://sendgrid.com/blog/taking-the-pain-out-of-email-design-and-editing/\">a better user experience</a> when creating email campaigns or templates. Whether using marketing or transactional templates, you can choose between a marketer-friendly code editor and a flexible design editor that still offers HTML options."
  },
  {
    "path": "content/docs/release-notes/2017-09-05.md",
    "content": "---\ntitle: \"release notes 2017-09-05\"\ndate: 2017-09-05\nreleaseType:\n  - partners\n---\n\n###\tAmazon Marketplace\n\nSendGrid is now available on the <a href=\"https://aws.amazon.com/marketplace/pp/B074CQY6KB\">AWS Marketplace</a>! AWS customers are now able to integrate SendGrids email infrastructure and email marketing tools with their other AWS tools. For more information, see the <a href=\"https://aws.amazon.com/blogs/apn/inside-sendgrids-expanded-relationship-with-aws/\">blog</a> and the [documentation](/for-developers/partners/amazon-marketplace/)."
  },
  {
    "path": "content/docs/release-notes/2017-09-14.md",
    "content": "---\ntitle: \"release notes 2017-09-14\"\ndate: 2017-09-14\nreleaseType:\n  - ui\n---\n\n###\tSave your favorite colors\n\nYou now can save swatches of commonly used colors when designing email templates or campaigns."
  },
  {
    "path": "content/docs/release-notes/2017-10-02.md",
    "content": "---\ntitle: \"release notes 2017-10-02\"\ndate: 2017-10-02\nreleaseType:\n  - api\n  - ui\n---\n\n###\tSubstitution tag update\n\nSubstitution tags are no longer case sensitive in the email content. Previously, the substitution tag in your email content had to exactly match the substitution tag. For example, if you have the substitution tag <code>[%panda%]</code>, and your email content says <code>\"hello [%PANda%], buy my bamboo\"</code>, the substitution tag for <code>[%panda%]</code> is now applied."
  },
  {
    "path": "content/docs/release-notes/2017-10-11.md",
    "content": "---\ntitle: \"release notes  2017-10-11\"\ndate: 2017-10-11\nreleaseType:\n  - api\n---\n\n###\tCustom field update\n\nThe limit of custom fields you can create has been increased to 120. This limit can be applied to any type of data contained in a contacts list including numbers, text, or dates."
  },
  {
    "path": "content/docs/release-notes/2017-11-01.md",
    "content": "---\ntitle: \"release notes 2017-11-01\"\ndate: 2017-11-01\nreleaseType:\n  - ui\n---\n\n###\tMarketing Campaigns Contacts\n\nThe Contacts page in Marketing Campaigns has been updated to improve the user experience! The UI has been simplified to make adding contacts more streamlined and easy-to-use. For more information, see [adding contacts](/ui/managing-contacts/create-and-manage-contacts/).\n"
  },
  {
    "path": "content/docs/release-notes/2017-12-20.md",
    "content": "---\ntitle: \"release notes 2017-12-20\"\ndate: 2017-12-20\nreleaseType:\n  - ui\n---\n\n###\tMailbox Provider Statistics\n\nThe mailbox provider statistics page has been updated to show more intuitive delivery percentages by each mailbox provider -for example clicks of delivered (by day by provider), instead of clicks of all clicks (by day by all providers).\n "
  },
  {
    "path": "content/docs/release-notes/2018-01-04.md",
    "content": "---\ntitle: \"release notes 2018-01-04\"\ndate: 2018-01-04\nreleaseType:\n  - ui\n  - api\n---\n\n###\tTable & Column Rendering in Outlook\n\nWe've resolved a bug affecting the way that tables/columns were rendering in some versions of Outlook.\n"
  },
  {
    "path": "content/docs/release-notes/2018-02-13.md",
    "content": "---\ntitle: \"release notes 2018-02-13\"\ndate: 2018-02-13\nreleaseType:\n  - ui\n---\n\n####\tTransactional Templates Search & Filtering\n\nWe've updated the Transactional Templates index page, allowing for dynamic search and filtering functionality by name, template ID, and template version ID. In addition to this improvement, we've updated what is seen when no templates are present –– more clearly conveying the need for a template version and offering a button to create one."
  },
  {
    "path": "content/docs/release-notes/2018-02-16.md",
    "content": "---\ntitle: \"release notes 2018-04-13\"\ndate: 2018-04-13\nreleaseType:\n  - ui\n---\n\n###\tCSV Upload Notification Email Address\n\nWe've made it easier for you to receive CSV upload notifications by adding an additional link to the CSV processing step. This link allows you to add an email address to your notifications directly from the contacts page and save it for future use."
  },
  {
    "path": "content/docs/release-notes/2018-02-27.md",
    "content": "---\ntitle: \"release notes 2018-10-01\"\ndate: 2018-02-27\nreleaseType:\n  - ui\n---\n\n###\tDates & Times Displayed on Campaigns Index\n\nThe Campaigns index page in Marketing Campaigns has been updated so that dates and times for important campaign events (like last edited or sent) are shown natively, below the name of each campaign."
  },
  {
    "path": "content/docs/release-notes/2018-03-01.md",
    "content": "---\ntitle: \"2018-03-01\"\ndate: 2018-03-01\nreleaseType:\n  - ui\n  - api\n---\n\n###\tEmail Activity Feed - Beta\n\nAs of 01 March 2018, we are beginning to roll out early beta access to our new Email Activity feature. This release includes enhancements to email activity feed details, filtering, search options, and CSV export capability to ease the process of troubleshooting email delivery issues."
  },
  {
    "path": "content/docs/release-notes/2018-03-06.md",
    "content": "---\ntitle: \"release notes 2018-03-06\"\ndate: 2018-03-06\nreleaseType:\n  - ui\n---\n\n###\tCode Editor Color Scheme\n\nThe color scheme (theme) of the code editor within Marketing Campaigns has been updated to be more visually clean and consistent. The new look helps code appear less cluttered, while aligning more closely with the SendGrid brand."
  },
  {
    "path": "content/docs/release-notes/2018-03-08.md",
    "content": "---\ntitle: \"release notes 2018-03-08\"\ndate: 2018-03-08\nreleaseType:\n  - api\n  - ui\n---\n\n###\tUnsubscribe Tag Support for Transactional Templates\n\nThe Unsubscribe module now uses asm tags in order to work with both Marketing Campaigns and Transactional email. To add unsubscribe links to your template, use the `<%asm_group_unsubscribe_raw_url%>`,  `<%asm_global_unsubscribe_raw_url%>`, or `<%asm_preferences_raw_url%>` tags."
  },
  {
    "path": "content/docs/release-notes/2018-03-14.md",
    "content": "---\ntitle: \"release notes 2018-03-14\"\ndate: 2018-03-14\nreleaseType:\n  - ui\n---\n\n###\tFixed a segmentation date issue\n\nThere was a bug in the UI that affected the way that dates displayed for events when creating a segment. Specifically, the UI would show \"01/01/70\" as dates for events, when there was no data present. This has been resolved and now aligns with the rest of the UI, displaying \"-\" when applicable."
  },
  {
    "path": "content/docs/release-notes/2018-03-16.md",
    "content": "---\ntitle: \"release notes 2018-10-01\"\ndate: 2018-03-16\nreleaseType:\n  - ui\n---\n\n###\tNew Design Templates for Marketing Campaigns\n\nWe've added two new templates to the SendGrid Marketing template library! These templates, named \"Modern\" and \"Coffee\", offer fully-responsive and clean designs, giving you the framework you need to build beautifully engaging marketing campaigns. The new templates can be accessed by clicking **Templates** in the navigation, and selecting the **Marketing** option."
  },
  {
    "path": "content/docs/release-notes/2018-03-29.md",
    "content": "---\ntitle: \"release notes 2018-03-29\"\ndate: 2018-03-29\nreleaseType:\n  - ui\n  - api\n---\n\n###\tEmail Activity Feed\n\nThe Email Activity Feed has been updated to include enhancements to email activity feed details, filtering, search options, and CSV export capability to ease the process of troubleshooting email delivery issues. In addition to the new enhancements, customers have the option to purchase 30 days of additional email activity history which includes API endpoint access.\n"
  },
  {
    "path": "content/docs/release-notes/2018-04-09.md",
    "content": "---\ntitle: \"release notes 2018-04-09\"\ndate: 2018-04-09\nreleaseType:\n  - ui\n  - api\n---\n\n###\tTruncating fields that go over max field character limits\n\nThis change applies to contacts added by uploading a CSV in the UI or when using the <code>POST /contactdb/lists/{list_id}/recipients/{recipient_id}</code> Add a Single Recipient to a List method. When adding or updating the <code>first_name</code> and <code>last_name</code> fields, SendGrid automatically truncates any field that exceeds the maximum character limit to ensure that the field is valid. Non-unicode characters are still not valid."
  },
  {
    "path": "content/docs/release-notes/2018-04-10.md",
    "content": "---\ntitle: \"release notes 2018-04-10\"\ndate: 2018-04-10\nreleaseType:\n  - ui\n---\n\n###\tUpdated Alert Behavior\n\nIn order to provide a better user experience, we've updated the green alert banners you see at the top of the app. Green banners that notify users of successful actions now automatically dismiss after a few seconds, no longer stacking up within the field of view."
  },
  {
    "path": "content/docs/release-notes/2018-04-11.md",
    "content": "---\ntitle: \"release notes 2018-04-11\"\ndate: 2018-04-11\nreleaseType:\n  - partners\n---\n\n###\tMagento M1 and M2 Extension Update\n\nWe have upgraded our Magento Extension for M1 and M2 Marketplaces to V1.0.3. SendGrid’s extension in M1 and M2 is compatible with Magento Community 2.0, 2.1, 2.2.\n"
  },
  {
    "path": "content/docs/release-notes/2018-04-17.md",
    "content": "---\ntitle: \"release notes 2018-04-17\"\ndate: 2018-04-17\nreleaseType:\n  - ui\n---\n###\tWhitelabel is becoming Sender Authentication! \n\nTo clarify authentication at SendGrid, we are updating the names of Whitelabel! A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS.\n\n### Improved Sender Authentication Process\n\nSendGrid’s whitelabel has become sender authentication, which simplifies the process for senders to demonstrate domain ownership through multiple authentication methods to recipient mailbox providers in order to improve their email delivery. This launch includes improvements to the set up flow and a more accurate name for the functionality. All pending and verified whitelabels can be found under sender authentication.\n\nFor more information on the new process for sender authentication: \n- Access [Sender Authentication](https://app.sendgrid.com/settings/sender_auth)\n- Read the [blog post](https://sendgrid.com/blog/new-sender-authentication/) about Sender Authentication.\n- Check out our how to docs on [How to set up domain authentication]({{root_url}}/ui/sending-email/how-to-set-up-domain-authentication/) and [How to set up link branding]({{root_url}}/ui/sending-email/how-to-set-up-link-branding/)\n"
  },
  {
    "path": "content/docs/release-notes/2018-05-01.md",
    "content": "---\ntitle: \"release notes 2018-05-01\"\ndate: 2018-05-01\nreleaseType:\n  - price\n---\n\n###\tSales tax for customers in certain US jurisdictions\n\nWe’re beginning to charge sales tax for use of certain SendGrid products by non-tax exempt customers based in WA, NY, TX, Denver, Boulder or Chicago. This change is required to comply with applicable tax laws. For more information about our new sales tax and how to delcare your organization tax exempt, see [Sales Taxes and Tax-Exempt Status](/ui/account-and-settings/taxes-and-tax-exempt/)."
  },
  {
    "path": "content/docs/release-notes/2018-05-15.md",
    "content": "---\ntitle: \"release notes 2018-05-15\"\ndate: 2018-05-15\nreleaseType:\n  - ui\n---\n\n###\tSend To and Export All Contacts\n\nWe've updated Marketing Campaigns to allow you to send to and export all contacts within your database. Your 'All Contacts' database now operates like other lists that you create. To send to all contacts, select \"All Contacts\" from the recipients dropdown when editing a campaign. To export all contacts, select \"Export\" from the action menu on the <a href=\"https://sendgrid.com/marketing_campaigns/ui/contacts\" target=\"_blank\">Contacts page</a> or by clicking the \"Export CSV\" button, now located in the top-right when viewing <a href=\"https://sendgrid.com/marketing_campaigns/ui/all_contacts\" target=\"_blank\">All Contacts</a>."
  },
  {
    "path": "content/docs/release-notes/2018-06-06.md",
    "content": "---\ntitle: \"release notes 2018-06-06\"\ndate: 2018-06-06\nreleaseType:\n  - api\n---\n\n###\tTLS security\n\nSendGrid now uses Transport Layer Security (TLS) protocol v1.1 to send encrypted mail. If you have the Enforce TLS feature activated on one of your SendGrid accounts, messages sent to inbox providers that can only accept TLS v1.0 trigger a “TLS required but not supported” drop event. Based on our testing, most inbox providers support TLS versions v1.1 and above.\n"
  },
  {
    "path": "content/docs/release-notes/2018-07-23.md",
    "content": "---\ntitle: \"release notes 2018-10-01\"\ndate: 2018-07-23\nreleaseType:\n  - ui\n  - api\n---\n\n###\tDynamic content for transactional templates\n\nWe’ve added native support for a subset of Handlebars syntax in transactional templates sent using V3 of our Mail Send API. This new functionality allows you to iterate over lists, take advantage of conditionals, and use JSON test data to verify substitutions in the UI. For more information, check out our [Getting started with Handlebars documentation](/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/), and our in-depth look at the [Handlebars functionality](/ui/sending-email/using-handlebars/) that we support.\n\n###\tKnown issue in the V2 API `to` parameter\n\nIf you use the API <code>to</code> parameter to specify a single recipient, that recipient is visible in the <code>For</code> field of the received header - so if you specify a single address, it should be an address that you are comfortable with your customer seeing. For example, use a generic email address in the <code>to</code> field that your customer is already going to see, like your from address. To completely omit the email showing up in the <code>from</code> header:\n\n- specify multiple addresses in the `to` field as an array, for example, `to[]=a@mail.com&to[]=b@mail.com`\n- Use the V3 mail send endpoint"
  },
  {
    "path": "content/docs/release-notes/2018-08-08.md",
    "content": "---\ntitle: \"release notes 2018-08-08\"\ndate: 2018-08-08\nreleaseType:\n  - ui\n---\n\n###\tUnsubscribe Group Workflow\n\nWe’ve made managing your Unsubscribe Groups more intuitive and beautiful than ever. Create and edit Unsubscribe Groups with confidence, knowing exactly what your recipients will see, thanks to a side-by-side preview of both your Unsubscribe Preferences and confirmation pages. To learn more, take a look at our [documentation]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/).\n"
  },
  {
    "path": "content/docs/release-notes/2018-08-22.md",
    "content": "---\ntitle: \"release notes 2018-08-22\"\ndate: 2018-08-22\nreleaseType:\n  - ui\n  - api\n---\n\n###\tSendGrid Documentation is now the SendGrid Knowledge Center\n\nThe SendGrid Knowledge Center empowers you to get the most from your account with concise how-to resources and reference information on the SendGrid user interface, Marketing Campaigns, APIs, and webhooks. The Knowledge Center replaces Documentation with a new look, easy-to-navigate layout, and streamlined access to technical information with the “For Developers” section.\n"
  },
  {
    "path": "content/docs/release-notes/2018-09-26.md",
    "content": "---\ntitle: \"release notes 2018-09-26\"\ndate: 2018-09-26\nreleaseType:\n  - ui\n---\n\n###\tIntroducing SendGrid Academy\n\nWe’re excited to introduce the SendGrid Academy––a free online learning community, enabling you to take email education into your own hands. Whether you’re a seasoned email expert or preparing to send your very first campaign, SendGrid Academy will allow you to choose your own path through streamlined, guided courses that can be completed in 10-15 minutes."
  },
  {
    "path": "content/docs/release-notes/2018-10-15.md",
    "content": "---\ntitle: \"release notes 2018-10-15\"\ndate: 2018-10-15\nreleaseType:\n  - ui\n---\n\n###\tEmail Insights Reports\n\nWith SendGrid Email Insights Reports, a deliverability consultant will take an in-depth look at the performance and health of your email program every other week. Then they’ll put together a report containing actionable and customized recommendations on how you can improve your results and drive more business from email. Please <a href=\"https://go.sendgrid.com/Email-Insights-Reports.html\">contact our team</a> to learn more.\n\n###\tEmail Protection Plan\n\nSendGrid’s new Email Protection Plan gives you peace of mind that if something goes wrong with your email program you’ll have quick access to experts to diagnose the issue and create a customized repair plan to get you back up and running. For a monthly subscription, you’ll receive coverage for up to 4 email deliverability issues per year plus monthly reporting for ongoing monitoring. Please <a href=\"https://go.sendgrid.com/Insights-Reports-Protection-Plan.html\">contact our team</a> to learn more.\n"
  },
  {
    "path": "content/docs/release-notes/2018-11-05.md",
    "content": "---\ntitle: \"release notes 2018-11-05\"\ndate: 2018-11-05\nreleaseType:\n  - ui\n---\n\n## Reverse DNS Improvements - Beta\n\nYou can now access the open beta for the improved Reverse DNS process within sender authentication. This beta simplifies the process for senders to set up Reverse DNS - which demonstrates domain and IP address ownership to recipient mailbox providers to improve their email delivery. \n\nFind all pending and verified Reverse DNS records under Reverse DNS within Sender Authentication, and you can switch back from the beta experience at any time. To learn more about this beta, check out our [how-to docs](https://sendgrid.com/docs/ui/account-and-settings/reverse-dns/) or opt-in in the [SendGrid UI](https://app.sendgrid.com/settings/sender_auth/reverse_dns/beta)."
  },
  {
    "path": "content/docs/release-notes/2018-11-09.md",
    "content": "---\ntitle: \"release notes 2018-11-09\"\ndate: 2018-11-09\nreleaseType:\n  - ui\n---\n\n## Change to Allowed “From” Domains - API\n\nIn order to continue to protect your reputation, we no longer process messages with a \"from\" domain that includes sendgrid.net. Customers should update the “from” address for all of your emails to include a domain you own and control. As a trusted sender, SendGrid promotes and supports ownership of all reputation factors for email sending. One major factor to senders’ reputations is the domains used, and it’s imperative that all senders optimize their own sending to control this reputation factor.\n"
  },
  {
    "path": "content/docs/release-notes/2018-11-14.md",
    "content": "---\ntitle: \"release notes 2018-11-14\"\ndate: 2018-11-14\nreleaseType:\n  - ui\n---\n\n## Invalid Events Retained for 30 Days\n\nIn order to optimize the efficiency of our infrastructure, we will cap our retention of all invalid drop events to the last 30 days. [An invalid event](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#different-types-of-suppressions) occurs when you attempt to send email to an address that is formatted in a manner that does not meet internet email format standards or the email does not exist at the recipient's mail server. It is best practice remove invalid email addresses from your database after receiving the [webhook event](https://sendgrid.com/docs/for-developers/tracking-events/getting-started-event-webhook/) for invalid, pulling from the [invalid API](https://sendgrid.api-docs.io/v3.0/invalid-emails-api/retrieve-all-invalid-emails), or downloading a list of invalids from the [SendGrid UI](https://sendgrid.com/docs/ui/sending-email/invalid-emails/) every week, and removing them from your mailing lists.\n"
  },
  {
    "path": "content/docs/release-notes/2018-12-01.md",
    "content": "---\ntitle: \"release notes 2018-12-01\"\ndate: 2018-12-01\nreleaseType:\n  - ui\n---\n\n## Essentials and Bronze Price Change\n\nEffective December 1st, 2018 our Essentials and Bronze plan prices have changed. Essentials 40K/Bronze is $14.95 and Essentials 100K is $29.95. This price increase will ensure we continue to provide customers a best-in-class experience as well as support ongoing innovation. \n\nPlease note, this pricing is already in effect for new customers, but existing essentials customers’ January bill will reflect these changes. The features included in the [Essentials](https://sendgrid.com/pricing/) plan and prices of add-ons are not changing. You can review past invoices and update your [Plan and Billing Details](https://app.sendgrid.com/settings/billing) in the SendGrid application. If you have any questions please reach out to our knowledgeable [support team](https://support.sendgrid.com/hc/en-us). \n"
  },
  {
    "path": "content/docs/release-notes/2018-12-17.md",
    "content": "---\ntitle: \"release notes 2018-12-17\"\ndate: 2018-12-17\nreleaseType:\n  - ui\n---\n\n## Plan & Billing Details Page Improvements\n\nYour [Plan & Billing Details page](https://app.sendgrid.com/account/billing) has been updated to add clarity and ease the ability to view and change SendGrid plans and billing details. These improvements simplify self-service plan changes, add-on purchase selection, payment acceptance, and understanding of Marketing Campaigns contact storage charges. As a part of the Account Details for your SendGrid account, the Plan and Billing Details page is only accessible in [Account Details](https://app.sendgrid.com/settings/account) under Settings starting January 7th, 2019. Check out our documentation for more information on the new [Plan & Billing Details page](https://app.sendgrid.com/account/billing).\n"
  },
  {
    "path": "content/docs/release-notes/2019-01-17.md",
    "content": "---\ntitle: \"release notes 2019-01-17\"\ndate: 2019-01-17\nreleaseType:\n  - ui\n---\n\n## Reverse DNS Improvements\n\nThe improved Reverse DNS process within sender authentication simplifies the process for senders to setup Reverse DNS to demonstrate domain and IP ownership to recipient mailbox providers in order to improve their email delivery. \n\nAll pending and verified Reverse DNS records can  still be found under Reverse DNS within Sender Authentication. To learn more check out our how to docs or try it out in the SendGrid UI.\n"
  },
  {
    "path": "content/docs/release-notes/2019-02-25.md",
    "content": "---\ntitle: \"release notes 2019-02-25\"\ndate: 2019-02-25\nreleaseType:\n  - api\n---\n\n### Event Webhook Unique ID Specification Change\n\nWe have updated the length and format specification of the `sg_event_id`, part of the JSON object included with each webhook post. Now, the `sg_event_id` will be limited to 100 characters, will be URL safe, and no longer has a specified format. You can use the `sg_event_id` to deduplicate events received by the webhook."
  },
  {
    "path": "content/docs/release-notes/2019-04-01.md",
    "content": "---\ntitle: \"release notes 2019-04-01\"\ndate: 2019-04-01\nreleaseType:\n  - api\n  - ui\n---\n\n### Change to Allowed “From” Domains - SMTP\n\nIn order to continue to protect your reputation, we no longer process messages with a \"from\" domain that includes sendgrid.net. Customers should update the “from” address for all of your emails to include a domain you own and control. As a trusted sender, SendGrid promotes and supports ownership of all reputation factors for email sending. One major factor to senders’ reputations is the domains used, and it’s imperative that all senders optimize their own sending to control this reputation factor.\n"
  },
  {
    "path": "content/docs/release-notes/2019-04-02.md",
    "content": "---\ntitle: \"release notes 2019-04-02\"\ndate: 2019-04-02\nreleaseType:\n  - expert-services\n---\n### Expert Services Available Via the SendGrid UI for Purchase\nExpert Services allows senders to partner with our internal email experts to receive guidance on smoothly implementing SendGrid for their business, repairing deliverability issues, and optimizing their sending strategy. Now some of our Expert Services packages are available for you to purchase directly through your [Billing page](https://app.sendgrid.com/account/billing). Learn more about our Expert Services offerings [here](https://sendgrid.com/solutions/expert-services/).\n\n### Email Bootcamp Now Available\nBecome a power user of the SendGrid platform with SendGrid's new Email Bootcamp. In a guided 2-hour educational webinar, our experts will walk you and other email senders like you through how to set up and use SendGrid's products so that you can start sending efficiently and effectively. If you have an existing SendGrid account, you can [buy this service now](https://app.sendgrid.com/account/billing/expert_services/implementation) through our UI.\n\n### Expert Insights Advanced Deliverability Report Improvements\nExpert Insights is an advanced monthly report on your email health and performance. We’ve added more data that’s critical for understanding your sender reputation including spam traps, deny lists, IP health, and more. We’ve also introduced a new robust resource exclusive for Expert Insights customers with expert step-by-step instructions to repair issues and improve results. If you are a Pro customer with an existing SendGrid account, you can [buy this service now](https://app.sendgrid.com/account/billing/expert_services/implementation) through our UI; otherwise, please [contact our team](https://sendgrid.com/expert-services-questions/) to purchase Expert Insights. View a sample report [here](https://sendgrid.com/solutions/expert-insights/).\n\n### Expert Analysis Now Available\nWith Expert Analysis, you’ll understand the health of your email program and what actions you need to take to improve. After an email expert compiles an advanced report on your email deliverability and performance, you’ll receive a consultation in which we’ll review your results, provide an action plan for your areas of improvement, and answer your questions. Please [contact our team](https://sendgrid.com/expert-services-questions/) to learn more about this service.\n"
  },
  {
    "path": "content/docs/release-notes/2019-04-03.md",
    "content": "---\ntitle: \"release notes 2019-04-03\"\ndate: 2019-04-03\nreleaseType:\n  - api\n  - ui\n---\n## Transactional Template Plain Content\n\nWe’ve added an optional `generate_plain_content` field on Create (POST) and Update (PATCH) calls for Template versions. Setting this field to `true` will automatically generate plain text content, based on the HTML content. If false, any plain text content passed to SendGrid on the request will remain unchanged. \n"
  },
  {
    "path": "content/docs/release-notes/2019-04-17.md",
    "content": "---\ntitle: \"release notes 2019-04-17\"\ndate: 2019-04-17\nreleaseType:\n  - ui\n  - api\n---\n\n### Basic Authentication with Two-Factor Authentication\n\nPreviously, customers with two-factor authentication enabled could utilize basic authentication over the SendGrid v2 API, v3 API (excluding v3 mail send), or SMTP. We have identified this as a misalignment between customers’ expectations of security with 2FA and the [authentication options]({{root_url}}/for-developers/sending-email/authentication/) permitted on their SendGrid accounts. In an abundance of caution, we have begun rejecting API calls using basic authentication if the user or subuser has two-factor authentication enabled. We recommend [implementing API keys]({{root_url}}/ui/account-and-settings/api-keys/) for your SendGrid API calls. If API key authentication is not possible,  [disable two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/#disabling-two-factor-authentication/) from accounts which continue to use basic authentication and enable [IP access management]({{root_url}}/ui/account-and-settings/ip-access-management/) to improve security.\n"
  },
  {
    "path": "content/docs/release-notes/2019-04-22.md",
    "content": "---\ntitle: \"release notes 2019-04-22\"\ndate: 2019-04-22\nreleaseType:\n  - ui\n  - api\n---\n\n### Support for Google AMP for Email\n\nSendGrid’s v3 mail/send API now supports ordering MIME parts as [recommended by Google for sending AMP](https://amp.dev/documentation/guides-and-tutorials/learn/amp-email-format#the-amphtml-email-format) content in Email messages for maximum compatibility with recipients’ mail clients. Senders using SendGrid’s v3 mail/send API can now include the text/x-amp-html content type alongside text/plain and text/html ordered as “text / amp / html” to accommodate rendering across recipient email clients. We do not process the AMP part of the content for click and open tracking at this time. SendGrid’s v2 Mail API does not support definition of the custom MIME x-amp-html part required for AMP content, therefore we recommend customers [migrate to the v3 API ]({{root_url}}/for-developers/sending-email/migrating-from-v2-to-v3-mail-send) to send AMP. For more information on Google AMP for Email see Google’s [documentation](https://amp.dev/documentation/guides-and-tutorials/learn/amp-email-format#the-amphtml-email-format). For information on how to use AMP content with SendGrid, please see our [Knowledge Center]({{root_url}}/for-developers/tracking-events/google-amp-for-email/).\n"
  },
  {
    "path": "content/docs/release-notes/2019-05-09.md",
    "content": "---\ntitle: \"release notes 2019-05-09\"\ndate: 2019-05-09\nreleaseType:\n  - ui\n  - api\n---\n\n### Tracking for Google AMP for Email\n\nSendGrid’s v3 mail/send API now supports click and open tracking for AMP content. Please note that [Google requires](https://amp.dev/documentation/guides-and-tutorials/learn/amp-email-format#the-amphtml-email-format) all images to use HTTPS, which will require customers who wish to track opens to do additional setup with their [SSL certificates]({{root_url}}/ui/analytics-and-reporting/click-tracking-ssl/) to ensure that their recipients opens are tracked. We recommend sending AMP over SendGrid’s v3 API, v2 mail/send does not support the custom MIME parts required for AMP, and you are responsible for the structure of the email when sending via SMTP. For more information on Google AMP for Email see Google’s [documentation](https://amp.dev/documentation/guides-and-tutorials/learn/amp-email-format#the-amphtml-email-format). For information on how to use tracking for AMP content with SendGrid, please see our [Knowledge Center]({{root_url}}/for-developers/tracking-events/google-amp-for-email/).\n"
  },
  {
    "path": "content/docs/release-notes/2019-06-04.md",
    "content": "---\ntitle: \"release notes 2019-06-04\"\ndate: 2019-06-04\nreleaseType:\n  - api\n---\n\n### Removal of Legacy Email Activity API - Free Plans\n\nIn order to continue to optimize the efficiency of our infrastructure we are removing access to the undocumented legacy email activity API for Free plans. We recommend using the [event webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) to absorb your email event data or visit the [enhanced email activity feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) in the UI to pinpoint specific email messages with its sequential event data. If you are interested in the ability to search and download a CSV with 30 days of email event activity programmatically, you could consider upgrading to an essentials account and purchasing additional history with access to the [new email activity API](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages). \n"
  },
  {
    "path": "content/docs/release-notes/2019-07-02.md",
    "content": "---\ntitle: \"release notes 2019-07-02\"\ndate: 2019-07-02\nreleaseType:\n  - ui\n  - api\n---\n\n### New Marketing Campaigns - Early Access\n\nA brand new version of Marketing Campaigns is now in Early Access, with the addition of [Automation](https://sendgrid.com/solutions/marketing-automation/), [Email Testing](https://sendgrid.com/solutions/email-marketing-testing/?ts=1559925149), and [Signup Forms](https://sendgrid.com/solutions/signup-forms/). These new features are incremental to the existing functionality for [one-to-many campaign sending]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/#creating-a-single-send), [contact management]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#manage-contacts), [real-time analytics]({{root_url}}/ui/analytics-and-reporting/stats-overview/), and more.\n"
  },
  {
    "path": "content/docs/release-notes/2019-07-10.md",
    "content": "---\ntitle: \"release notes 2019-07-10\"\ndate: 2019-07-10\nreleaseType:\n  - ui\n  - api\n---\n\n### New Marketing Campaigns\n\nA brand new version of Marketing Campaigns, with the addition of [Automation]({{root_url}}/ui/sending-email/getting-started-with-automation/), [Email Testing]({{root_url}}/ui/sending-email/email-testing/), and [Signup Forms]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#create-a-signup-form) is now generally available. These new features are incremental to the existing functionality for [one-to-many campaign sending]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/#creating-a-single-send), [contact management]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#manage-contacts), real-time analytics, and more.\n"
  },
  {
    "path": "content/docs/release-notes/2019-07-16.md",
    "content": "---\ntitle: \"release notes 2019-07-16\"\ndate: 2019-07-16\nreleaseType:\n  - api\n---\n\n### Removal of Legacy Email Activity API - Essential Plans\n\nIn order to continue to optimize the efficiency of our infrastructure, we are removing access to the undocumented legacy email activity API for Essential plans. We recommend using the [event webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) to absorb your email event data or visit the [enhanced email activity feed]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) in the UI to pinpoint specific email messages with its sequential event data. If you are interested in the ability to search and download a CSV with 30 days of email event activity programmatically, you should consider purchasing additional history with access to the [new email activity API](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages). "
  },
  {
    "path": "content/docs/release-notes/2019-07-31.md",
    "content": "---\ntitle: \"release notes 2019-07-31\"\ndate: 2019-07-31\nreleaseType:\n  - ui\n---\n\n### Create and send a Single Send to a custom field based segment\n\nThe new version of Marketing Campaigns now supports sending a Single Send to a segment based on contact custom field data for more personalized sending.\n"
  },
  {
    "path": "content/docs/release-notes/2019-08-06.md",
    "content": "---\ntitle: \"release notes 2019-08-06\"\ndate: 2019-08-06\nreleaseType:\n  - api\n---\n\n### Email Validation API in Open Beta\n\nOur real-time [Email Validation API](https://sendgrid-email-validation.api-docs.io/v3/getting-started/authentication) helps protect your sending reputation by validating email addresses before you send to them. Use detailed results from our machine learning-powered, mailbox provider-friendly API to alert subscribers of possible typos while they’re still in the signup form and protect your sending reputation by decreasing the risk of your email bouncing. Currently available for free while in Beta to Pro and Premier Email API plans. Learn more about [this announcement](https://sendgrid.com/blog/sendgrid-email-validation-api/), [how to use it](https://sendgrid.com/docs/ui/managing-contacts/email-address-validation/), and the [future pricing](http://sendgrid.com/solutions/email-validation-api/).\n"
  },
  {
    "path": "content/docs/release-notes/2019-08-26.md",
    "content": "---\ntitle: \"release notes 2019-08-26\"\ndate: 2019-08-26\nreleaseType:\n  - api\n---\n\n### Valid Characters for Event Webhook Authentication \n\nWe have updated the characters that can be included in the credentials for webhook authentication. Starting today, characters will be limited to those that are included on [this list]({{root_url}}/for-developers/tracking-events/event/#authentication). Please ensure your webhook credentials (username + password) adhere to this updated list to continue uninterrupted access to our webhook.\n"
  },
  {
    "path": "content/docs/release-notes/2019-08-27.md",
    "content": "---\ntitle: \"release notes 2019-08-27\"\ndate: 2019-08-27\nreleaseType:\n  - ui\n  - api\n---\n\n### Scale SLA increases\n\nThe new version of Marketing Campaigns now supports contact storage for up to 10M contacts per user, with additional scale possible on a per-user request.\n\n### Default syntax for substitution tags\n\nThe new version of Marketing Campaigns uses a new syntax for the default or fallback value of a substitution tag used in a Marketing Campaigns email subject line or body content. The default syntax is `{{ insert first_name \"default=Customer\" }}`.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-04.md",
    "content": "---\ntitle: \"release notes 2019-09-04\"\ndate: 2019-09-04\nreleaseType:\n  - ui\n  - ui\n---\n\n### Duplicate existing email designs (templates) in Marketing Campaigns\n\nThe new version of Marketing Campaigns now supports the ability to duplicate and revamp an existing email design. From the design library, select “Duplicate” from the action menu.\n\n### A/B Testing for Single Sends\n\nThe new version of Marketing Campaigns now supports A/B testing for Single Sends, allowing up to 6 variations of either subject line or content. The winner is chosen automatically based on either open rate or click rate performance (depending on the user’s selection).\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-05.md",
    "content": "---\ntitle: \"release notes 2019-09-05\"\ndate: 2019-09-05\nreleaseType:\n  - ui\n---\n\n### View a sample of contacts on a segment\n\nThe new version of Marketing Campaigns now provides a sample of 50 contacts within the UI for any given segment. To view all contacts included in a segment at any given time, users can use the export option.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-10.md",
    "content": "---\ntitle: \"release notes 2019-09-10\"\ndate: 2019-09-10\nreleaseType:\n  - ui\n  - api\n---\n\n### Create and send a Single Send to an engagement-based segment\n\nThe new version of Marketing Campaigns now supports sending a Single Send to a segment based on engagement data for more personalized sending. This includes whether they have or haven’t opened or clicked within a given timeframe as well as how they’ve engaged with a particular Single Send.\n\n### Segmentation API with engagement functionality\n\nThe new version of Marketing Campaigns now offers a Segmentation API to create and send to a segment that is based on engagement (opens/clicks) with any Single Send or a specific Single Send.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-19.md",
    "content": "---\ntitle: 'release notes 2019-09-19'\ndate: 2019-09-19\nreleaseType:\n  - api\n  - ui\n---\n\n### Domain Authentication Impact from Apple iOS 13\n\nApple iOS 13 includes “Sign in with Apple” Oauth feature which provides an optional private relay email for users and sender authentication requirements for Apple app developers. In order to send email to Apple Oauth private relay email addresses (@privaterelay.appleid.com), you will need to update your Domain Authentication settings within your SendGrid account. Failure to properly complete and register your SendGrid Domain Authentication with Apple will result in email sent to “privaterelay.appleid.com” returning a bounce event with the reason “550 5.1.1 bad mailbox name.” Visit the [Configuring Sign in with Apple documentation]({{root_url}}/ui/account-and-settings/configuring-sign-in-with-apple/) for step-by-step instructions.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-23.md",
    "content": "---\ntitle: \"release notes 2019-09-23\"\ndate: 2019-09-23\nreleaseType:\n  - ui\n---\n\n### Send Test for Single Sends and Marketing Templates\n\nThe new version of Marketing Campaigns now supports sending a test email to as many as ten email addresses. A test email can be sent for a Single Send, an email within an Automation, or an email design, and allows users to preview email content prior to sending or request review from partners outside of the UI.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-25.md",
    "content": "---\ntitle: \"release notes 2019-09-25\"\ndate: 2019-09-25\nreleaseType:\n  - ui\n---\n\n### IP Pool Selection\n\nThe new version of Marketing Campaigns now supports IP Pool Selection for [users who have created IP Pools]({{root_url}}/ui/account-and-settings/ip-pools). This allows senders to choose which IP Pool to send a Single Send or Automation from, providing improved control over reputation and deliverability.\n"
  },
  {
    "path": "content/docs/release-notes/2019-09-27.md",
    "content": "---\ntitle: \"release notes 2019-09-27\"\ndate: 2019-09-27\nreleaseType:\n  - ui\n---\n\n### Templates becomes Design Library\n\nThe new version of Marketing Campaigns now features a Design Library, a new, top-level navigation item in the navigation on the left that houses all Email Designs for use within Marketing Campaigns. “Templates” remains as an option under the Marketing [New] navigation, and, if clicked, it will bring customers to the Design Library.\n"
  },
  {
    "path": "content/docs/release-notes/2019-10-01.md",
    "content": "---\ntitle: \"release notes 2019-10-01\"\ndate: 2019-10-01\nreleaseType:\n  - api\n---\n\n### Email Validation API Generally Available\n\nOur real-time [Email Validation](https://app.sendgrid.com/email_validation) API helps protect your sending reputation by validating email addresses before you send to them. Use detailed results from our machine learning-powered, mailbox provider-friendly API to alert website visitors of possible typos while they’re still in the signup form and protect your sending reputation by decreasing the risk of your email bouncing. Available to Pro and Premier Email API plans. Learn more about [this announcement](https://sendgrid.com/blog/email-validation-now-available), [how to use it](https://sendgrid.com/docs/ui/managing-contacts/email-address-validation/), and the [the pricing](http://sendgrid.com/solutions/email-validation-api/).\n"
  },
  {
    "path": "content/docs/release-notes/2019-10-09.md",
    "content": "---\ntitle: \"release notes 2019-10-09\"\ndate: 2019-10-09\nreleaseType:\n  - ui\n---\n\n### View a sample of contacts on a list\n\nThe new version of Marketing Campaigns now provides a sample of 50 contacts within the UI for any given list. To view all contacts included in a list, users can use the export option.\n"
  },
  {
    "path": "content/docs/release-notes/2019-10-10.md",
    "content": "---\ntitle: \"release notes 2019-10-10\"\ndate: 2019-10-10\nreleaseType:\n  - api\n---\n\n\n### Imposing Rate Limits on some SendGrid V2 API Endpoints\n\n Twilio SendGrid now has a default rate limit of 600 requests/minute/user on some of the V2 API endpoints, excluding the mail/send endpoint. If you exceed that rate limit you will receive a 429 error response with a “too many requests” message. We recommend updating your processes to ensure you do not exceed our default rate limit of 600 requests/min/user. We also recommend building in the consumption of the rate limit headers we send back, which gives specific information about how many requests you have remaining and when the rate limit amount will reset. For more information, see the [Knowledge Center]({{root_url}}/for-developers/sending-email/using-the-v2-api/#rate-limits).\n"
  },
  {
    "path": "content/docs/release-notes/2019-10-23.md",
    "content": "---\ntitle: 'release notes 2019-10-23'\ndate: 2019-10-23\nreleaseType:\n  - ui\n---\n\n### Domain Authentication for Sign in with Apple\n\nAs part of Apple's [Sign in with Apple](https://developer.apple.com/sign-in-with-apple/) feature, users may signup for your app or website with a [private email relay](https://developer.apple.com/documentation/signinwithapplejs/communicating_using_the_private_email_relay_service) address generated by Apple. In order to deliver to these private relay addresses, you must verify your sending domain with Apple when implementing Sign in with Apple as an authentication provider.\n\nThe SendGrid [domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) page now provides a settings option that will provide a properly configured address for use with your Apple Developer account. For more information please visit SendGrid's [Configuring Sign in with Apple page]({{root_url}}/ui/account-and-settings/configuring-sign-in-with-apple/).\n"
  },
  {
    "path": "content/docs/release-notes/2019-19-12.md",
    "content": "---\ntitle: \"release notes 2019-12-19\"\ndate: 2019-12-19\nreleaseType:\n  - ui\n  - api\n---\n\n### Email Content Testing for Dynamic Templates\n\nTest your email content against spam filters, validate hyperlinks, and preview HTML rendering across browsers and devices with Email Testing for Dynamic Templates. Monthly testing credits included for Trial, Pro and Premier plans, with additional credits available for purchase. See our Email Testing [documentation]({{root_url}}/ui/sending-email/email-testing/) for more details.\n\nWe've made some improvements to Transactional Templates. We've renamed them to Dynamic Templates since they can be used to build the content for any type of email message sent over our Email API. They can be found in the app’s sidebar navigation under both the new “Email API” navigation item or the “Templates” navigation item. We've also eased ongoing template management by adding thumbnail images and allowing duplication of entire templates as well as the individual versions within a template.\n\nFor more, see our [blog post about working with Dynamic Templates](https://sendgrid.com/blog/how-to-use-sendgrids-dynamic-templates-for-your-transactional-emails/).\n\n### Designs API\n\nWe’ve added a brand new Designs API, allowing you to easily create, edit, download, or delete Email Designs without relying on the SendGrid app UI. You can use the Designs you’ve created across all of your Twilio SendGrid Email—from Automations, to Single Sends, and Dynamic Templates. For more about working with the API, see our [API Reference](https://sendgrid.com/docs/api-reference/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-01-01.md",
    "content": "---\ntitle: 'release notes 2020-01-01'\ndate: 2020-01-01\nreleaseType:\n  - price\n---\n\n### Pro Plan Price and Feature Updates\n\nThe Twilio SendGrid Pro, Silver, Gold, Platinum and Legacy Premier 2.5M plans have changed. These changes include a new price and new features. To see updated pricing visit our [pricing page](https://sendgrid.com/pricing/).\n\nSome plans also have new names. Silver, Gold, and Platinum plans are now Pro 100K, Pro 300K, and Pro 700K respectively.\n\nWe’ve also extended [Email Activity](https://sendgrid.com/docs/ui/analytics-and-reporting/email-activity-feed/) history from 3 to 7 days included with all Pro plans, and launched [Email Testing for Dynamic Templates](https://sendgrid.com/blog/test-for-success-email-testing-for-your-programmatic-sending/). We are committed to continued investment in our infrastructure and innovation to provide the best-in-class features you need to build exceptional experiences with email. You can review past invoices and update your [Plan and Billing Details](https://app.sendgrid.com/settings/billing) in the SendGrid application. If you have any questions please reach out to our knowledgeable [support](https://support.sendgrid.com/hc/en-us) team.\n"
  },
  {
    "path": "content/docs/release-notes/2020-01-13.md",
    "content": "---\ntitle: \"release notes 2020-01-13\"\ndate: 2020-01-13\nreleaseType:\n  - ui\n  - api\n---\n\n### Retirement of Select Mail Settings\n\nAs we continuously modernize our email delivery infrastructure, we have retired select, sparsely used, and outdated features in order to improve efficiency. The features we have retired include Plain Text to HTML, Gravatar, Spam Checker, Drop Feature, and the Sendwithus integration. For more details on these features and our recommended actions please see our [documentation]({{root_url}}/ui/account-and-settings/retired-mail-settings/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-01-29.md",
    "content": "---\ntitle: \"release notes 2020-01-29\"\ndate: 2020-01-19\nreleaseType:\n  - ui\n---\n\n### Dynamic Templates UI within \"Email API\" Navigation\n\nDynamic Templates, formerly Transactional Templates, are used to design, build, test, store, and manage email content sent over the SendGrid Email API. Dynamic Templates can now be found under the Email API section within the SendGrid application navigation. The Templates navigation item has been removed. There are no changes to Dynamic Template functionality.\n\nFor more information about setting up Dynamic Templates, visit [How to send an email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/) in the docs.\n"
  },
  {
    "path": "content/docs/release-notes/2020-02-10.md",
    "content": "---\ntitle: \"release notes 2020-02-10\"\ndate: 2020-02-10\nreleaseType:\n  - ui\n---\n### Segment-triggered Automations\n\nAutomation (available within the Advanced Marketing Campaigns plan) now supports a new entry criteria option to trigger an automation when a contact joins a segment. This also expands the functionality of the exit criteria, automatically removing contacts when they no longer match the entry criteria (i.e., they’re no longer in the segment). For more information, see the documentation in the [Knowledge Center]({{root_url}}/ui/sending-email/getting-started-with-automation/)\n"
  },
  {
    "path": "content/docs/release-notes/2020-03-19.md",
    "content": "---\ntitle: \"release notes 2020-03-19\"\ndate: 2020-03-19\nreleaseType:\n  - api\n---\n### Removal of originating IP from received email header\n\nAs we strive to be the most trusted communication platform, we have removed the originating IP from the received email header to further protect our customers' privacy and security. This change should have no negative impact on deliverability, and no customer action is needed for sending email as a result of this change.\n"
  },
  {
    "path": "content/docs/release-notes/2020-04-07.md",
    "content": "---\ntitle: \"release notes 2020-04-07\"\ndate: 2020-04-07\nreleaseType:\n  - ui\n---\n\n### Shortcut to create a segmented list\n\nIn Marketing Campaigns, you can now segment contacts from a particular list directly from the Contacts page. This reduces the steps to create list-specific segments.\n"
  },
  {
    "path": "content/docs/release-notes/2020-04-13.md",
    "content": "---\ntitle: \"release notes 2020-04-13\"\ndate: 2020-04-13\nreleaseType:\n  - ui\n---\n\n### Faster load time for stats\n\nLoad times for Marketing Campaigns statistics are now faster after backend work to improve performance.\n"
  },
  {
    "path": "content/docs/release-notes/2020-04-21.md",
    "content": "---\ntitle: \"release notes 2020-04-21\"\ndate: 2020-04-21\nreleaseType:\n  - ui\n---\n\n### Clearer test sends\n\nMarketing Campaigns supports sending a test email to up to 10 email addresses at a time. Now, when users send a test email, Marketing Campaigns automatically adds “Test -” to the beginning of the subject line. This ensures test recipients know the email is a test and was not yet actually sent to the targeted list or segment.\n"
  },
  {
    "path": "content/docs/release-notes/2020-04-30.md",
    "content": "---\ntitle: \"release notes 2020-04-30\"\ndate: 2020-04-30\nreleaseType:\n  - ui\n---\n\n### Search and filter Single Sends\n\nSingle Sends in Marketing Campaigns are now easier to find using new search and filter functionality. Users can search for a Single Send by name, or can filter to view all Single Sends by a particular status (draft, scheduled, or triggered) as well as by category.\n"
  },
  {
    "path": "content/docs/release-notes/2020-05-06.md",
    "content": "---\ntitle: \"release notes 2020-05-06\"\ndate: 2020-05-06\nreleaseType:\n  - api \n---\n\n### Single Sends API update\n\nThe Marketing Campaigns Single Sends API has been updated to simplify the steps to create, schedule, and send Single Sends via the API. Users no longer need to create a template first. To create and save a new Single Send, all that is required is a name. For complete details, please see our [overview page]({{root_url}}/for-developers/sending-email/single-sends-2020-update/) and the [API reference documentation](https://sendgrid.api-docs.io/v3.0/single-sends/create-single-send).\n"
  },
  {
    "path": "content/docs/release-notes/2020-05-18.md",
    "content": "---\ntitle: \"release notes 2020-05-18\"\ndate: 2020-05-18\nreleaseType:\n  - api\n  - ui\n---\n\n### Signed Event Webhook Requests and OAuth for Event Webhook in Public Beta\n\nTwilio SendGrid now provides two security features that allow you to verify that email event data is being posted by Twilio SendGrid: a Signed Event Webhook and OAuth 2.0. These security features are independent of one another and can be used together.\n\nTwilio SendGrid’s Signed Event Webhook uses the Elliptic Curve Digital Signature Algorithm to sign requests. The signature allows customers to verify that event data is being posted by Twilio SendGrid.\n\nOAuth 2.0 for the Twilio SendGrid Event Webhook allows customers to verify that Twilio SendGrid is properly authorized by them to post to their URLs using the Client Credentials grant type.\n\nTo learn more about these new features in Beta, visit [our documentation]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook-security-features/).\n\n### New image editing options\n\nThe email editors within Marketing Campaigns now support more options for formatting your images. You can crop, flip and rotate your images, add filters, or make adjustments like contrast or opacity all from within your email editing workflow. These editing options are also available within the Design Library under Your Images. [Learn more]({{root_url}}/ui/sending-email/image-editor/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-07-13.md",
    "content": "---\ntitle: 'release notes 2020-07-13'\ndate: 2020-07-13\nreleaseType:\n  - api\n---\n\n### Signed Event Webhook Requests and OAuth for Event Webhook Generally Available\n\nTwilio SendGrid now provides two security features that allow you to verify that email event data is being posted by Twilio SendGrid: a Signed Event Webhook and OAuth 2.0. These security features are independent of one another and can be used together.\n\nTwilio SendGrid’s Signed Event Webhook uses the Elliptic Curve Digital Signature Algorithm to sign requests. The signature allows customers to verify that event data is being posted by Twilio SendGrid.\n\nOAuth 2.0 for the Twilio SendGrid Event Webhook allows customers to verify that Twilio SendGrid is properly authorized by them to post to their URLs using the Client Credentials grant type.\n\nTo learn more about these new features, visit [our documentation]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook-security-features/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-07-21.md",
    "content": "---\ntitle: 'release notes 2020-07-21'\ndate: 2020-07-21\nreleaseType:\n  - ui\n---\n\n### Track clicks across all links within an email with Click Tracking\n\nSee which links are getting the most clicks within your emails, and learn which link locations perform best. Learn more more about [click tracking]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats/#click-tracking) .\n"
  },
  {
    "path": "content/docs/release-notes/2020-08-13.md",
    "content": "---\ntitle: 'release notes 2020-08-13'\ndate: 2020-08-13\nreleaseType:\n  - ui\n  - api\n---\n\n### Export stats from Single Sends and Automations to CSV\n\nDownload a CSV of your stats to view offline or share with teammates. [Learn about each available statistic]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats-overview/) in our documentation.\n\n### Retirement of Sections and BCC mail settings\n\nAs we continuously modernize our email delivery infrastructure, we have retired select, sparsely used, and outdated features in order to improve efficiency. The features we have retired include the Sections and BCC mail settings. For more details on these features and our recommended actions please see our [documentation]({{root_url}}/ui/account-and-settings/retired-mail-settings/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-08-17.md",
    "content": "---\ntitle: 'release notes 2020-08-17'\ndate: 2020-08-17\nreleaseType:\n  - ui\n---\n\n### Create segments based on “Date Added” and “Last Updated” of a Contact\n\nYou can now create new segments based on two additional date criteria: when a contact was added to Marketing Campaigns and the last time a contact was updated. The criteria are listed as \"Date Added\" and \"Last Updated\" in Marketing Campaigns. For more information about segments, see [Segmenting your Contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-08-19.md",
    "content": "---\ntitle: 'release notes 2020-08-19'\ndate: 2020-08-19\nreleaseType:\n  - ui\n---\n\n### Duplicate a segment\n\nYou can now create new segments by copying an existing segment and making minor modifications. The ability to duplicate a segment means you no longer have to start from scratch when creating new segments. For more information about creating segments, see [Segmenting your Contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-09-03.md",
    "content": "---\ntitle: 'release notes 2020-09-03'\ndate: 2020-09-03\nreleaseType:\n  - ui\n---\n\n### Segmentation based on Automation Events\n\nTwilio SendGrid now offers the ability to segment contacts based on their engagement with your automated emails. For more information, visit our [Segmentation documentation]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/#automations-fields).\n"
  },
  {
    "path": "content/docs/release-notes/2020-09-16.md",
    "content": "---\ntitle: 'release notes 2020-09-16'\ndate: 2020-09-16\nreleaseType:\n  - api\n---\n\n### Specify multiple From addresses in personalizations\n\nTwilio SendGrid now allows you to define multiple From addresses in personalizations objects. This allows you to override the default sender in each personalization as long as the default sending domain and personalizations sending domains match. For more information, visit our [Personalizations documentation]({{root_url}}/for-developers/sending-email/personalizations/#sending-multiple-emails-from-multiple-senders-to-multiple-recipients).\n"
  },
  {
    "path": "content/docs/release-notes/2020-09-17.md",
    "content": "---\ntitle: 'release notes 2020-09-17'\ndate: 2020-09-17\nreleaseType:\n  - ui\n  - api\n---\n\n## Account Setup Requirements\n\nIn order to enhance security for all of our users, we have added a few required steps before new users are able to upgrade to a paid Twilio SendGrid plan. These steps are required to verify your identity, secure access to your account, while also authenticating your reputation ownership; setting you up for future email delivery success.\n\nFor more information on these requirements, visit [Verifying Your Account]({{root_url}}/ui/account-and-settings/verifying-your-account/) in the docs.\n"
  },
  {
    "path": "content/docs/release-notes/2020-09-29.md",
    "content": "---\ntitle: 'release notes 2020-09-29'\ndate: 2020-09-29\nreleaseType:\n  - ui\n---\n\n## Test data available in the Design and Code Editors\n\nBoth the Marketing Campaigns Design Editor and Code Editor now support test data. Test data allows you to render Substitution Tags using sample values directly in each Editor's preview window. By providing test data, you no longer need to send a test email to ensure that your dynamic data will be displayed properly.\n\nTo get started with your own designs, see [Working with Marketing Campaigns Email Designs]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/). For more information on using test data in Marketing Campaigns, see our [Design and Code Editor documentation]({{root_url}}/ui/sending-email/editor/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-11-11.md",
    "content": "---\ntitle: 'release notes 2020-11-11'\ndate: 2020-11-11\nreleaseType:\n  - ui\n---\n\n### Segment Refresh Cadence Improvements\n\nPreviously, segment samples did not refresh after initial segment creation (or after editing the conditions of a segment). With this release, segment samples are now refreshed hourly as long as Marketing Campaigns detects any changes as contacts enter or exit the segment. If no changes are detected, the next refresh will occur at 2 hours, and then 4, with a maximum delay to segment sample refresh of 24 hours.\n\nFor a real-time view of all contacts within your segment at any time, you can always export a CSV. This is not dependent on the sample refresh cadence.\n\nFor more information about the segment refresh cadence, see our [segmentation documentation](https://sendgrid.com/docs/ui/managing-contacts/segmenting-your-contacts/#segment-refresh-cadence).\n\n### Preview Segment Sample Contacts\n\nFrom the Contacts page, you can now see when the next scheduled segment will occur by hovering over the segment contact count. This same information can also be found on the segment detail page beneath the total contact count for that segment.\n\nFor a real-time view of all contacts within your segment at any time, you can always export a CSV. This is not dependent on the segment refresh cadence.\n\nThe sample refresh cadence has also been made available to [Marketing Campaigns API](https://sendgrid.api-docs.io/v3.0/segmenting-contacts/create-segment) users via the `next_sample_update` field.\n"
  },
  {
    "path": "content/docs/release-notes/2020-11-18.md",
    "content": "---\ntitle: 'release notes 2020-11-18'\ndate: 2020-11-18\nreleaseType:\n  - api\n---\n\n## API Key and 2FA Requirements Enforced for Free Users\n\nIn order to enhance security for all of our users, Twilio SendGrid now requires customers on free plans to use API Key authentication on all API requests and SMTP configurations. Customers must also enable Two-Factor Authentication (2FA) for all users, subusers and teammates. Visit our docs for more information on [Upgrading to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/) and [Enabling Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-01.md",
    "content": "---\ntitle: 'release notes 2020-12-01'\ndate: 2020-12-01\nreleaseType:\n  - ui\n---\n\n## New column layouts available for the Marketing Campaigns Design Editor\n\nThe Marketing Campaigns Design Editor now supports four new column layouts. In addition to evenly proportioned columns, you can now create layouts with ratios of 1:2, 2:1, 1:3, and 3:1. As with prior layouts, each column contains multiple drop zones where you can add non-column modules such as buttons, text, and images.\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-03.md",
    "content": "---\ntitle: 'release notes 2020-12-03'\ndate: 2020-12-03\nreleaseType:\n  - ui\n---\n\n## New column layouts available for the Marketing Campaigns Design Editor\n\nThe Marketing Campaigns Design Editor now supports four new column layouts. In addition to evenly proportioned columns, you can now create layouts with ratios of 1:2, 2:1, 1:3, and 3:1. As with prior layouts, each column contains multiple drop zones where you can add non-column modules such as buttons, text, and images.\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-09.md",
    "content": "---\ntitle: 'release notes 2020-12-09'\ndate: 2020-12-09\nreleaseType:\n  - api\n---\n\n## API Key and 2FA Requirements Enforced for Paid Users\n\nIn order to enhance security for all of our users, Twilio SendGrid now requires customers on paid plans to use API Key authentication on all API requests and SMTP configurations. Customers must also enable Two-Factor Authentication (2FA) for all users, subusers, and teammates. Visit our documentation for more information on [Upgrading to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/) and [Enabling Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-10.md",
    "content": "---\ntitle: 'release notes 2020-12-10'\ndate: 2020-12-10\nreleaseType:\n  - ui\n---\n\n## Signup Form Field Enhancement\n\nYou can now add any [reserved field]({{root_url}}/ui/managing-contacts/custom-fields/#reserved-fields) or [custom fields]({{root_url}}/ui/managing-contacts/custom-fields/) to a signup form. This means marketers can capture more of the data that they rely on when contacts sign up via a signup form. The collected data will then flow directly into Contacts within Marketing Campaigns.\n\n## Bulk Delete Automations\n\nYou can now bulk delete Automations using the multi-select tool from the Automation homepage.\n\nTo select one or more Automations to delete, click the checkbox to the left of the Automation. Next, open the **Selected** dropdown and then click **Delete**.\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-16.md",
    "content": "---\ntitle: 'release notes 2020-12-16'\ndate: 2020-12-16\nreleaseType:\n  - ui\n---\n\n## New Options Available for Rendering Previews\n\nYou can now perform inbox rendering tests across new devices and inbox providers. Inbox rendering tests help you ensure that your emails are displaying as intended across your customers’ preferred device types and inbox providers.\n"
  },
  {
    "path": "content/docs/release-notes/2020-12-17.md",
    "content": "---\ntitle: 'release notes 2020-12-17'\ndate: 2020-12-17\nreleaseType:\n  - ui\n  - api\n---\n\n## Signup Form Error Handling Enhancements\n\nSignup forms will now display more elegant and helpful error messages when a user attempts to submit an invalid email address, leaves a required field blank, or fails to complete a CAPTCHA. Clear indications of where the error occurred in the form and legibility enhancements help users more quickly identify and fix form errors.\n\n## Import Contacts via Compressed CSV Files\n\nYou can now import up to 1 million contacts or 5GB of data, whichever is less, using compressed CSV files via the [Contacts API](https://sendgrid.api-docs.io/v3.0/contacts/import-contacts). The import endpoint also supports gzipped CSV files.\n"
  },
  {
    "path": "content/docs/release-notes/2021-01-07.md",
    "content": "---\ntitle: 'release notes 2021-01-07'\ndate: 2021-01-07\nreleaseType:\n  - ui\n---\n\n## Delete Variations of an A/B Test\n\nYou can now delete specific variations of an A/B test for a Single Send. If there is only one variation remaining after a second is deleted, the A/B test will turn off and the remaining variation will become the default.\n"
  },
  {
    "path": "content/docs/release-notes/2021-01-12.md",
    "content": "---\ntitle: 'release notes 2021-01-12'\ndate: 2021-01-12\nreleaseType:\n  - ui\n---\n\n## Manually Select the Winner of an A/B Test\n\nYou can now manually select the winner of an A/B test for a Single Send. The ability to manually select a test winner allows you to make more nuanced decisions about how to best engage your audience and prioritize the metrics that are most important to you, such as unsubscribes, spam reports, or conversions. To learn more about A/B testing, see [A/B Testing Your Single Send]({{root_url}}/ui/sending-email/a-b-testing/).\n"
  },
  {
    "path": "content/docs/release-notes/2021-01-13.md",
    "content": "---\ntitle: \"release notes 2021-01-13\"\ndate: 2021-01-13\nreleaseType:\n  - api\n---\n## API Key and 2FA Requirements Enforced for remaining Free Users\n\nIn order to enhance security for all of our users, Twilio SendGrid now requires customers on free plans to use API Key authentication on all API requests and SMTP configurations. Customers impacted by this breaking change will experience authentication errors when making API calls or SMTP requests using basic authentication with their username and password. Customers must also enable Two-Factor Authentication (2FA) for all users. Visit our docs for more information on [Upgrading to API Keys ]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/)and [Enabling Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/). If you did not receive notifications about this change please [update your account email address]({{root_url}}/ui/account-and-settings/account/)."
  },
  {
    "path": "content/docs/release-notes/2021-01-19.md",
    "content": "---\ntitle: 'release notes 2021-01-19'\ndate: 2021-01-19\nreleaseType:\n  - ui\n---\n\n## Duplicate A/B Test Variations\n\nYou can now clone variations of an A/B test for a Single Send. You can have a maximum of 6 variations per test.\n"
  },
  {
    "path": "content/docs/release-notes/2021-02-17.md",
    "content": "---\ntitle: \"release notes 2021-02-17\"\ndate: 2021-02-17\nreleaseType:\n  - api\n---\n## API Key and 2FA Requirements Enforced for Essentials Customers\n\nIn order to enhance security for all of our users, Twilio SendGrid now requires customers on all Essentials plans to use API Key authentication on all API requests and SMTP configurations. Customers must also enable Two-Factor Authentication (2FA) for all users, including teammates. Visit our docs for more information on [Upgrading to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/) and [Enabling Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/). If you did not receive notifications about this change please [update your account email address]({{root_url}}/ui/account-and-settings/account/)."
  },
  {
    "path": "content/docs/release-notes/2021-03-15.md",
    "content": "---\ntitle: \"release notes 2021-03-15\"\ndate: 2021-03-15\nreleaseType:\n  - ui\n---\n## View Stats for Emails in a Marketing Campaigns Automation\n\nYou can now see detailed performance data on individual emails within an Automation. Stats include information on emails triggered, emails delivered, clicks, opens, unsubscribes, bounces, and spam over time. Click Tracking data and Email Details are also available.\n\nTo see performance data on emails in an Automation, navigate to the [Automations section of Marketing Campaigns](https://mc.sendgrid.com/automations), click into the detail view for an Automation, and select **View Stats** from the action menu to the right of an individual email in the Automation.\n"
  },
  {
    "path": "content/docs/release-notes/2021-03-24.md",
    "content": "---\ntitle: \"release notes 2021-03-24\"\ndate: 2021-03-24\nreleaseType:\n  - api\n  - ui\n---\n## API Key and 2FA Requirements Enforced for Paid Users\n\nIn order to enhance security for all of our users, Twilio SendGrid now requires customers on all paid plans to use API Key authentication on all API requests and SMTP configurations. Customers must also enable Two-Factor Authentication (2FA) for all users, including teammates. Visit our docs for more information on [Upgrading to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/) and [Enabling Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/). If you did not receive notifications about this change please [update your account email address]({{root_url}}/ui/account-and-settings/account/).\n"
  },
  {
    "path": "content/docs/release-notes/2021-03-30.md",
    "content": "---\ntitle: 'release notes 2021-03-30'\ndate: 2021-03-30\nreleaseType:\n  - api\n---\n\n## New Get Contacts by Email API Endpoint\n\nThe new Get Contacts by Email endpoint allows you to retrieve one or more contacts by their email or alternate email addresses. This endpoint should be used when you know the email(s) you are searching for. If you need access to a larger set of contacts, please continue to use the export contacts functionality.\n"
  },
  {
    "path": "content/docs/release-notes/2021-04-13.md",
    "content": "---\ntitle: 'release notes 2021-04-13'\ndate: 2021-04-13\nreleaseType:\n  - ui\n---\n\n## Support for \"View in Browser\" Links\n\nYou can now include a “view in browser” link in your Marketing Campaigns emails using the Weblink Substitution Tag.\n\nThe \"view in browser\" link points to an online version of your email, which will display your HTML as designed, protecting against potential email client rendering issues. This ensures recipients have a fallback to view your email, and provides them an option to share the email with friends using the link in addition to forwarding the email.\n"
  },
  {
    "path": "content/docs/release-notes/2021-05-19.md",
    "content": "---\ntitle: 'release notes 2021-05-19'\ndate: 2021-05-19\nreleaseType:\n  - ui\n  - api\n---\n\n## SAML 2.0 Single Sign-On (SSO)\n\nYou can now integrate Twilio SendGrid with identity and access management platforms that support SAML 2.0 such as Okta, Duo, and Microsoft Azure. Twilio SendGrid SSO integration allows you to securely and centrally manage account permissions, including password requirements, multi-factor authentication, and employee offboarding. Twilio SendGrid SSO provides access to those who need it by mapping new Twilio SendGrid [Teammates]({{root_url}}/ui/account-and-settings/teammates/) to users in your SSO Identity Provider (IdP). Please note that each SSO user can access only one account or subuser during the Public Beta.\n\nVisit our [documentation]({{root_url}}/ui/account-and-settings/sso/) for more information on how to access and manage SSO permissions.\n"
  },
  {
    "path": "content/docs/release-notes/2021-05-25.md",
    "content": "---\ntitle: 'release notes 2021-05-25'\ndate: 2021-05-25\nreleaseType:\n  - ui\n---\n\n## Support for undo and redo functionality in the Design and Code Editors\n\nYou can now undo or redo recent changes made in the Design and Code Editors. To undo an action, use the undo arrow in the top navigation above the editor, or use the `Ctrl` or `Cmd` + `Z` keyboard shortcut. To redo an action, use the redo arrow in the top navigation above the editor, or use the `Ctrl` or `Cmd` + `Shift` + `Z` keyboard shortcut. You cannot undo/redo changes once you have left the browser session.\n"
  },
  {
    "path": "content/docs/release-notes/2021-06-02.md",
    "content": "---\ntitle: 'release notes 2021-06-02'\ndate: 2021-06-02\nreleaseType:\n  - ui\n---\n\n## Exclude Recipients from Single Sends\n\nYou can now exclude contacts from a Single Send based on list or segment membership. Any contacts on an exclusion list or segment who are also on any of your ‘Send To’ lists or segments will not receive the Single Send. You can exclude up to 5 segments and 50 lists.\n\nThe ability to exclude contacts from a send can help with many marketing use cases. For example, a marketer might manage sending frequency by excluding contacts who were sent another marketing email within the past 3 days. Or, they might re-send a promotion to a set list of contacts, excluding those who were sent the first Single Send email.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/accessing-email-account-associated-with-sendgrid.md",
    "content": "---\nseo:\n  title: Accessing email account associated with SendGrid\n  description: Accessing email account associated with SendGrid\n  keywords: address, password, reset, maintenance, primary, forgot, lost, left\ntitle: Accessing email account associated with SendGrid\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 204982878\nnavigation:\n  show: true\n---\n\nThe email address associated with your SendGrid account is required to receive notifications, billing alerts, and passwords reset emails. In the event that you lose access to this email address, you have several recovery options.\n\n1. (Recommended) Have your email administrator re-create the email address associated with the SendGrid account in question, and then request a [password reset]({{root_url}}/ui/account-and-settings/resetting-your-username-and-password/) email. [SendGrid support](https://support.sendgrid.com/hc/en-us) can help if you don't know the email associated with your account.\n2. If you are unable to recreate or obtain access to a lost email address, you can [create a new SendGrid account](https://sendgrid.com/transactional-email/pricing). In order to ensure data privacy and security, SendGrid will not be able to transfer data from an old account to a new account. We understand that this is inconvenient. If at all possible, re-creating the email address associated with your SendGrid account is preferred for this reason.\n3. If neither of the above options fit your account recovery situation, please [contact our support team](https://support.sendgrid.com/hc/en-us) for assistance.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/account-compromised.md",
    "content": "---\nseo:\n  title: Compromised Account Recovery\n  description: Compromised Account Recovery\n  keywords: spam, password, security, hack, script, hacked, run, rogue, compromise, stolen, fraud\ntitle: Compromised Account Recovery\nweight: 0\ngroup: security\nlayout: page\nzendesk_id: 200182818\nnavigation:\n  show: true\n---\nIf you believe your account has been compromised, please log in to your account and **_change your account username and password immediately_** under the [SendGrid Account Settings](https://app.sendgrid.com/settings/account) page. You will also need to update the username and password in your sending application or code in order to get mail flowing again.\n\nAfter changing your account username and password, please [contact support](https://support.sendgrid.com). We can help you investigate, and get our Compliance team involved if necessary.\n\nWe'll try and help you isolate any issues or vulnerabilities with your SendGrid integration. We can also temporarily deactivate your account as well as delete any messages that are currently in a pending state within our system. In some cases your account may have already been preemptively Suspended to prevent damage to your reputation. In these cases please check your email for a notification from our Compliance department and respond directly to it to get the ball rolling.\n\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/account-under-review.md",
    "content": "---\nseo:\n  title: Account Under Review\n  description: If your account is suspended or is otherwise under review, learn how to bring your account into good standing.\n  keywords: suspend, suspended, account, deactivated, banned, ban, deactivate, warn, warning, access, compromise, reactivate, stopped, stop, reactivated, turn, frozen, under, review, deactivated, compliance\ntitle: Account Under Review\nweight: 0\ngroup: account-management\nlayout: page\n\nnavigation:\n  show: true\n---\nTo preserve your reputation as a sender, SendGrid reviews accounts with apparent abnormal activity. Have you received a warning, suspension, deactivation, or ban notice from SendGrid? Please respond to any questions asked in the email notice. The fastest way to get your account reactivated is to respond directly to the ticket sent to your email address. In most cases, SendGrid Support cannot reactivate a warned, suspended, deactivated or banned account, so contacting them directly may delay reactivation.\n\n## \tStages of review\n\nOnce your account is under review, SendGrid sends a notification to the address associated with your account indicating that it is in one of the following states:\n\n ### \tWarned\n\nThe account maintains full sending functionality during a warning period. However, if we do not receive a response, your account may be suspended to prevent further risk to your sending reputation. Accounts with a warned status can still upgrade their usage plan, or create new subusers until the review has concluded to our satisfaction.\n\n ### \tSuspended\n\nSendGrid accepts and queues mail while the account is under review. The account holds mail until issues are resolved or up to 72 hours from the time of send. Any message queued for over 72 hours from sending expires and is not delivered. Delivered mail sent before the suspension is still functional, including open and click tracking, as well as link redirects.\n\n<call-out>\n\nAn account in a suspended state continues to incur auto-renewal billing for your monthly subscription and any Marketing Campaigns contact storage.\n\n</call-out>\n\n ### \tDeactivated\n\nA deactivated SendGrid account cannot accept mail. Upon deactivation, SendGrid deletes any undelivered mail queued on the system. Click and Open tracking links are disabled in the deactivated account. Deactivated subusers are not accessible via the ‘log in as’ method available to parent accounts. However, deactivated subusers can still log in directly.\n\n<call-out>\n\nAn account in a deactivated state continues to incur auto-renewal billing for your monthly subscription and any contacts storage.\n\n</call-out>\n\n ### \tBanned\n\nBanned accounts cannot access our system either through SendGrid.com or the API. Our system does not accept email requests from banned accounts. Dedicated IPs assigned to the account are removed. Related subusers are unable to send email or access their account.\n\n<call-out>\n\nAn account in a banned state will stop any auto-renewal billing,though you will still be charged for any overages or Marketing Campaigns contact storage during the current month.\n\n</call-out>\n\n ### \tReactivation\n\nOnce you resolve all potential issues to our satisfaction, SendGrid will reactivate your service. Once activated, any queued messages will begin to process for delivery.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/account.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: account-management\ntitle: Account Details\nseo:\n  title: Account Details\n  description: Manage your SendGrid account settings\n  keywords: account settings, profile settings, account details\nnavigation:\n  show: true\n---\n\nYour profile provides SendGrid with the information we need to contact you with alerts and notifications as well as send and track your emails.\n\n_To edit your account information:_\n\n1. Click the edit icon next to the section you wish to change.\n1. Once you have made your changes, click **Save**. This will only save the settings for that section. If you decide to abandon your changes, click **Cancel**.\n\n## Your Account\n\n**First Name** - This is the first name of the representative from your company who should receive contacts from SendGrid.\n\n**Last Name** - This is the last name of the representative from your company who should receive contacts from SendGrid.\n\n**Email address** - This is the address where you will be contacted by SendGrid for any account-level alerts and notifications such as billing notifications. This must be a valid and active email address that you routinely check. \n\n<call-out>\n\nOnce you've changed your contact email, you will need to confirm the new email address. You will be prompted to send a confirmation email to your inbox. Click **Send Confirmation Email** to finalize the change. **Make sure you click the link in the confirmation email to receive account updates at your new address**. \n\n</call-out>\n\n**Username** - Your SendGrid Username is used to access our API and our SMTP Relay. Changing this will immediately cause all of your calls to SendGrid to stop working.\n\n**Password** -  The password criterion that your SendGrid password must include: 16 to 128 characters, at least one number, and one letter.\n\n\n## Your Company\n\n**Company** - The name of your company.\n\n**Address 1** - The first line of your address.\n\n**Address 2** - The second line of your address, if your business has one.\n\n**City** - The city in which your company operates.\n\n**State** - The state or province in which your company operates.\n\n**Country** - The country in which your company operates.\n\n**Zip** - The zip code in which your company operates.\n\n<call-out>\n\nIf you find that your scheduled sends or statistics seem like they are not quite correct, please double check your timezone.\n\n</call-out>\n\n**Timezone** - The [timezone]({{root_url}}/glossary/timezone/) in which your company operates. This setting will be used by other SendGrid functionality such as [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/) and scheduling sends in [Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/). Please make sure that your timezone is set to the same as your business.\n\n**Website** - Your company’s website\n\n**Phone** - Your company’s phone number, where SendGrid can reach the representative that should be contacted.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/alerts.md",
    "content": "---\nseo:\n  title: Alert Settings\n  description: Manage your SendGrid alerts\n  keywords: sendgrid alerts, account alerts, deliverability alerts\ntitle: Alerts\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nYou can set up alerts to be sent to a specific email address on a recurring basis, whether for informational purposes or when specific account actions occur.\n\nFor most alerts, you can choose to have the alert sent to you as needed, hourly, daily, weekly, or monthly. The information contained in your alert will be for the last period of the alert. For example, if you choose weekly for the statistics alert, you will receive the statistics for the last week.\n\nYou can also change which email address these alerts are sent to.\n\n## \tAdd alert\n \t\nTo add a new alert, click the large “+” or the “Add Alert” button. When the window appears, select the type of alert you would like to receive. Some alerts have options for being sent when a certain threshold is met or when a time period is met.\n\n## \tAlerts\n \t\n ### \tUsage limit\n \t\n<call-out>\n\nAny accounts or subusers without an email limit alert on May 5th, 2015 or that were created after May 5th, 2015 will find this alert set up with a threshold of 90% on their account automatically.\n\n</call-out>\n\nYou will receive an alert when you have used 90% of your current package’s number of emails. Subusers with recurring or nonrecurring email limits will have this alert set up automatically. Subusers who have unlimited emails will not have this alert set up automatically.\n\n ### \tstatistics notifications\n \t\nAn email containing your statistics sent at the frequency you define. For example:\n\nWeekly statistics will be sent once week and show the trailing week.\nDaily statistics will be sent every day, but with trailing 7 day statistics included.\n\nFor more in depth statistics, we suggest using the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/api-keys.md",
    "content": "---\nseo:\n  title: Manage SendGrid API Keys\n  description: Manage your SendGrid API Keys\n  keywords: sendgrid API keys, email API Keys, mail API Keys, email credentials, send credentials\ntitle: API Keys\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nYour application, mail client, or website can all use API (Application Programming Interface) keys to authenticate access to SendGrid services. They are the preferred alternative to using a username and password because you can revoke an API key at any time without having to change your username and password. We suggest that you use API keys for connecting to all of SendGrid’s services.\n\n## Types of API keys\n\n_There are 3 different types of API keys:_\n\n1. **Full Access** allows the API key to access GET, PATCH, PUT, DELETE and POST endpoints for all parts of your account, excluding billing and Email Address Validation.\n\n1. **Restricted Access** customizes levels of access for all parts of your account, excluding billing and Email Address Validation.\n\n1. **Billing Access** allows the API key to access billing endpoints for the account.\n\n### API key permissions\n\nDuring the API key creation process, you will be given the option of selecting scopes, or specific permissions, that you would like to assign to your new API key. These permissions restrict which areas of your account your API key will be able to access.\nWhen assigning permissions to your API key, you will be given the option to select one of the following levels of access:\n\n- **No Access** prevents the API key from accessing any endpoint within the selected permission.\n\n- **Read Access** allows the API key to access GET endpoints within the selected permission.\n\n- **Full Access** allows the API key to access GET, PATCH, PUT, DELETE, and POST endpoints within the selected permission.\n\nWe require that you create a separate API key for making billing-related API calls. This segmentation adds an extra level of security by giving you more control over who has access to the various areas of your account.\n\n## Managing API keys\n\nWhen viewing the API keys page, you will see a list of your current API keys along with the following information:\n\n**Name** - The name you defined for your API key.\n\n**API Key ID** - The way you would reference your API key for management through the API (e.g. editing or deleting a key).\n\n**Action** - Actions you can perform on your API keys, such as editing or deleting the key.\n\n### Creating an API key\n\n1. Navigate to **Settings** on the left navigation bar, and then select **API Keys**.\n1. Click **Create API Key**.\n1. Give your API key a name.\n1. Select **Full Access**, **Restricted Access**, or **Billing Access**.\n1. If you're selecting **Restricted Access**, or **Billing Access**, select the specific permissions to give each category. For more information, see [API key permissions](#api-key-permissions).\n1. Click **Create & View**.\n1. Copy your API key somewhere safe. For security reasons, do not put it directly in your code, or commit it somewhere public like GitHub.\n\n<call-out type=\"warning\">\n\nYou will only be shown your API key one time. Please store it somewhere safe as we will not be able to retrieve or restore it.\n\n</call-out>\n\n<call-out>\n\nThere is a limit of 100 API Keys per account.\n\n</call-out>\n\n### Storing an API key in an environment variable\n\nTwilio SendGrid recommends storing your API key in an environment variable or a config file that is not stored in version control.\n\nWhen setting a variable in your program, that variable is readable by any person or system that can access the text file where it’s set. However, a variable that's confined to the environment where the code is executed, stored outside the program itself, is called an environment variable. Only people and programs with access to the environment can read the value assigned to an environment variable. This makes environment variables a more secure choice for storing credentials such as API keys.\n\nOnce you assign your API key to an environment variable, you can then tell your program to look for and use that variable. Another benefit of this approach is the ability to set API keys with different permissions in different environments such as development, staging, and production without changing the code you deploy to those environments.\n\nThe examples below show how to store your key in a variable named `SENDGRID_API_KEY`. You can find additional examples in the [Twilio Documentation](https://www.twilio.com/docs/usage/secure-credentials).\n\nTo store your SendGrid API key, open your terminal or command prompt and add the following:\n\n<code-group langs=\"Unix, Windows\">\n\n```unix\nexport SENDGRID_API_KEY=the_key_you_copied_from_SendGrid\n```\n\n```windows\nsetx SENDGRID_API_KEY the_key_you_copied_from_SendGrid\n```\n\n</code-group>\n\nTo then access the variable, you can use the convention provided by your coding language.\n\n<code-group langs=\"C#, Go, Java, Node.js, PHP, Python, Ruby\">\n\n```c#\nvar apiKey = Environment.GetEnvironmentVariable(\"SENDGRID_API_KEY\");\n```\n\n```go\napiKey := os.Getenv(\"SENDGRID_API_KEY\")\n```\n\n```java\napiKey = System.getenv(\"SENDGRID_API_KEY\");\n```\n\n```node.js\nconst apiKey = process.env.SENDGRID_API_KEY;\n```\n\n```php\n$apiKey = getenv('SENDGRID_API_KEY');\n```\n\n```python\napi_key = os.environ.get('SENDGRID_API_KEY')\n```\n\n```ruby\napi_key = ENV['SENDGRID_API_KEY']\n```\n\n</code-group>\n\n\n## Editing an API key\n\nClick the action menu in the same row as the key you would like to edit. From here you can delete a key, making it completely inactive, or you can edit your key’s name and permissions.\n\n## Deleting an API key\n\n<call-out type=\"warning\">\n\nOnce you delete a key, it can no longer be used to access SendGrid’s services.\n\n</call-out>\n\nClick the action menu in the same row as the key you want to delete. Select **Delete**. This will delete the key permanently, making it inactive. SendGrid will reject any subsequent API calls using this deleted API key.\n\n## Replacing an old API key with a new one\n\n1. Locate the API key you would like to replace in your list of keys and select the action menu drop down at the right on the same row, then select **Delete API key**.\n1. Next, [create an API key](#creating-an-api-key).\n1. Replace the old API key with the new one in your code.\n\n<call-out>\n\nYou may not give an API key greater permissions than you currently have.\n\n</call-out>\n\n## Testing an API key\n\nYou can test your newly created API key using cURL:\n\n```curl\ncurl -i --request POST \\\n--url https://api.sendgrid.com/v3/mail/send \\\n--header 'Authorization: Bearer YOUR_API_KEY_HERE' \\\n--header 'Content-Type: application/json' \\\n--data '{\"personalizations\": [{\"to\": [{\"email\": \"recipient@example.com\"}]}],\"from\": {\"email\": \"sendeexampexample@example.com\"},\"subject\": \"Hello, World!\",\"content\": [{\"type\": \"text/plain\", \"value\": \"Howdy!\"}]}'\n```\n\nLook for a **202 Accepted** in the HTTP response headers.\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n### Do you want expert help to get your email program started on the right foot?\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/billing.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: billing\ntitle: Billing\nseo:\n  title: Billing\n  description: Manage your SendGrid billing settings\n  keywords: billing, contacts, email credits, refund, plans, cancel, upgrade, downgrade\nnavigation:\n  show: true\n---\n\nYou can update your billing details on the Billing tab of the [Account Details page](https://app.sendgrid.com/account/billing) in the UI. You can update your plan details on the Products tab of the [Account Details page](https://app.sendgrid.com/account/products).\n\nFor more information about understanding your bill, see [Reading your invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/).\n\nWhen you create or upgrade to a paid account, you add a credit card for automatic payments. This will allow Twilio SendGrid to make the recurring plan charges for your account without having to notify you each month of the bill. Twilio SendGrid relies on a PCI-DSS compliant 3rd party billing provider to store, process, and manage payment card processing.\n\n## Payment methods\n\nTwilio SendGrid accepts credit or check cards. We charge accounts on a monthly basis; we do not offer prepayment, quarterly billing, or annual billing at this time. We do not accept PayPal, wire transfer, checks, prepaid cards, or any card requiring a PIN.\n\nYou can update your card information, retry a failed payment, and export past invoices for your business on the Billing tab of your [Account Details](https://app.sendgrid.com/account/billing) page. It is also possible to change your package type and cancel your account from this page.\n\n### Subusers\n\nSubusers under a free Marketing Campaigns plan will be able to upload only 2,000 contacts. Subusers under an Advanced Marketing Campaigns plan will be able to continue uploading contacts, and the parent account will pay for any overages the subuser may cause by exceeding the overall limit on the paid plan.\n\n<call-out type=\"warning\">\n\nIf you are still on the **legacy Marketing Campaigns plan**, each subuser may store up to 2,000 contacts for free before we charge the same rate of $10.00 per 10,000 contacts each month. Any additional charges due for storing contacts on a subuser account will appear in the parent account's monthly invoice.\n\n</call-out>\n\n<call-out>\n\nWe bill the parent account for each unique contact, regardless of how many lists or segments that contact appears on. However, if there are one or more subusers under a parent account, we bill the parent account for all unique contacts stored on each account, even for the same contacts stored on multiple subuser accounts.\n\n</call-out>\n\n## Account Warning States\n\nIf your account payments aren’t up-to-date, you may see one of the following warning states displayed in your account.\n\n### Billing warned\n\n> “You have unpaid invoices. Please update your payment details or retry your payment.”\n\nThis warns you that your service may be interrupted unless you settle any outstanding balance on your account. This warning may occur if the card on file for your account gets declined when we attempt to process your payment on the first of the month.\n\nTo update your account, please update your credit card on file by logging into the Twilio SendGrid app and going to the Billing tab on your [Account Details page](https://app.sendgrid.com/account/billing). Update your card information and then click **Save**. Once you update the card on file, the payment processes automatically, and your account is unfrozen.\n\n### Billing Frozen\n\nIf you find your account is suddenly unable to send mail within the first week of the month, your account could be in a billing frozen state. This frozen state occurs when we attempt to process your payment on the first day of the month, but the card on file for your account gets declined.\n\nTo reactivate your account, please update your credit card on file by logging into the Twilio SendGrid UI and going to the **Billing** tab on your [Account Details page](https://app.sendgrid.com/account/billing). Update your card information and then click **Save**. Once you update the card on file, the payment processes automatically, and your account is unfrozen.\n\n## Marketing Campaigns Plans\n\nEach [Marketing Campaigns](https://sendgrid.com/pricing/) package will cover both contact storage and email sends that you use via Single Sends or Automation within Marketing Campaigns. Emails you send via the [Email API](#email-api-plans) will not be deducted from your Marketing Campaigns plan.\n\n### Free Plan\n\n#### Features include:\n\n- Automation\n- Single Sends for one-time campaigns\n- Ticket Support\n- 3 Email Testing Credits per month\n- 1 Signup Form\n\n#### Limits:\n\n- 6,000 emails/month - Emails sent via Single Sends or Automation count toward your allotment. Any Single Sends you attempt to send that exceed your 6,000 email limit will send partially up to that limit.\n\n<call-out>\n\nFor example, if you have 400 emails remaining and attempt to send a Single Send to an audience of 1,000, 600 of the emails will be dropped. Similarly, Automations will cease sending once you’ve hit 6,000 email sends via Marketing Campaigns in a month. If a contact meets the entry criteria of an Automation after you’ve reached your send limit, they will not receive any emails, and they will not be “caught up” once you upgrade your plan or a new month allotment increases.\n\n</call-out>\n\n- 2,000 contacts - Contacts, whether you attempt to upload them via CSV, or they are added via Signup Forms or the Contacts API, will be dropped if you exceed 2,000 total contacts.\n\n_What to do if you’ve reached your limit:_\n\nYou will be alerted when you have reached your limit each month. To keep your Automations and Signup Forms active, upgrade to the Basic or Advanced plan. Once you upgrade, your account will never be blocked due to limits, you’ll simply pay overages for any usage that exceeds your Basic or Advanced tier allotment.\n\n<call-out type=\"warning\">\n\nIf you’re on the Free package and hit your contact allotment limit, any active Signup Forms will no longer add new contacts to your account. You will **not** be be able to recover these signups. When you upgrade, signups from Signup Forms will resume adding to your contacts.\n\n</call-out>\n\n### Basic Plan\n\n#### Features include:\n\n* Single Sends for one-time campaigns\n* Ticket and chat\n* 10 Email Testing Credits per month with the option to purchase more\n* 5 Signup Forms\n* 1 Teammate\n* Access to Expert Services\n\n#### Limits:\n\n- 5,000 – 300,000 emails/month depending on the plan you purchase. Emails sent via Single Sends count towards your allotment.\n- Up to 100,000 contacts\n\n### Advanced Plan\n\n#### Features include:\n\n- Automation\n- Single Sends for one-time campaigns\n- Ticket, chat, and phone support\n- 60 Email Testing Credits per month with the option to purchase more\n- 15 Signup Forms\n- 1,000 Teammates\n- Access to Expert Services\n- Subuser Management\n- Dedicated IP Included\n\n#### Limits:\n\n- 50,000 – 1 million+ emails/month depending on the plan you purchase. Emails sent via Single Sends or Automation count towards your allotment.\n- 200,000+ contacts\n\nIf you exceed your plan allotment of contacts or overages you will be charged a [small amount]({{root_url}}/ui/account-and-settings/billing/#limits-and-overage-rates) per email sent and per contact stored above the limits of your current Marketing package. Any overage charges will appear on the invoice of the month _after_ any over-limit sending and contact storage occurs.\n\n### Understanding Contact Counts in Marketing Campaigns\n\n#### Free Plan\n\nYou can add and store up to 2,000 contacts to your account each month. The number you can add depends on whether you already have contacts stored in your account. For example, if you have 500 contacts in your account, and you haven’t added any yet this month, you can add up to 1,500 more contacts.\n\nIf you _update or add new data about existing contacts_ in your Marketing Campaigns account, it will not count against the number of contacts you can add.\n\nIf you _delete a contact and re-add them_, that is counted as a new add.\n\n#### Basic & Advanced Plans\n\nYour plan tier comes with an allotment of contacts that you can add to and store in your account each month. For example, if you’re on the Advanced 100K plan, you can add up to 100,000 contacts.\n\nThe number you can add each month depends on whether you already have contacts stored in your account. For example, if you currently have 5,000 contacts in your account, and you haven’t added any yet this month, you can add up to 95,000 more contacts.\n\nIf you _update or add new data about existing contacts_ in your Marketing Campaigns account, it does not count against the number of contacts you can add.\n\nIf you _delete a contact and re-add them_, that is counted as a new add.\n\nIf you exceed your allotment of contacts in a given month, you’ll be charged overages according to your chosen Marketing Campaigns package.\n\n## Email API Plans\n\n<call-out type=\"warning\">\n\nEvery email processed by SendGrid uses an email credit. Free, Essentials, Pro, and Premier accounts will see their email credits reset the 1st day of each month at 12:01 Pacific Time.\n\n</call-out>\n\nThe [Email API package](https://sendgrid.com/pricing/) includes charges for any emails you send over the Twilio SendGrid Email API. Sending emails through the API with this package will not deduct from your Marketing Campaigns plan.\n\n### Free\n\n#### Features include:\n\n- APIs, SMTP Relay, and Webhooks\n- Libraries and documentation\n- Delivery Optimization Tools\n- Transactional Template Editor\n- 3 days of Email Activity History\n- 3 Email Testing credits during the trial period\n- Ticket Support\n\n#### Limits:\n\n- 40,000 emails/day for your first 30 days\n- 100 emails/day indefinitely after your first 30 days are over\n- No ability to purchase additional Email Testing credits\n\n### Essentials\n\n#### Features include:\n\n- APIs, SMTP Relay, and Webhooks\n- Libraries and documentation\n- Delivery Optimization Tools\n- Transactional Template Editor\n- 3 days of Email Activity History\n- Ticket and chat\n\n#### Limits:\n\n- Up to 100,000+ emails/month depending on the package you purchase.\n- No Email Testing access\n\n### Pro\n\n#### Features include:\n\n- APIs, SMTP Relay, and Webhooks\n- Libraries and documentation\n- Delivery Optimization Tools\n- Transactional Template Editor\n- Dedicated IP Included\n- Subuser Management\n- 7 days of Email Activity History\n- 60 Email Testing credits with the ability to purchase more\n- Ticket, chat, and phone support\n\n#### Limits:\n\n- Up to 1.5 million+ emails/month depending on the package you purchase.\n\n### Premier\n\n#### Features include:\n\n- APIs, SMTP Relay, and Webhooks\n- Libraries and documentation\n- Delivery Optimization Tools\n- Transactional Template Editor\n- Dedicated IP Included\n- Subuser Management\n- 7 Days of Email Activity History\n- 500 Email Testing credits with the ability to purchase more\n- Ticket, chat, and phone support\n\n## Limits and Overage Rates\n\n_What to do if you’ve reached your limit_:\n\nYou will be charged a small amount per-email for each email that you send beyond the limit of your current plan. Any overage charges will appear on the invoice of the month _after_ any over-limit sending and contact storage occurs.\n\n<call-out>\n\nUpgrading your account does NOT absorb already incurred overage charges, so make sure you are using the right package for your use case.\n\n</call-out>\n\n<call-out type=\"warning\">\n\n**Important:** If your SendGrid account is created through Microsoft Azure, Heroku or Google Cloud, these subscriptions do _not_ allow for overages. For pricing, billing and account package details for these types of SendGrid accounts, please refer to each of the partner's respective online resources.\n\n</call-out>\n\n### Marketing Campaigns Overage Costs\n\n<table>\n <tr>\n   <th colspan=\"3\">Marketing Campaigns Overage Costs</th>\n </tr>\n <tr>\n   <td colspan=\"3\">The exact amount you pay will vary month-to-month if you exceed your plan allotment of email sends or contact storage.<br>If you go over your plan limits, here’s a breakdown of the overage costs you’ll incur:</td>\n </tr>\n <tr>\n   <td>Plan Information</td>\n   <td>Monthly Plan Limits</td>\n   <td>Cost per Extra Email or Contact*</td>\n </tr>\n <tr>\n   <td>Free</td>\n   <td>2,000 contacts and 6,000 emails</td>\n   <td>-</td>\n </tr>\n <tr>\n   <td>Basic 5K</td>\n   <td>5,000 contacts and 15,000 emails</td>\n   <td>$0.0040</td>\n </tr>\n <tr>\n   <td>Basic 10K</td>\n   <td>10,000 contacts and 30,000 emails</td>\n   <td>$0.0030</td>\n </tr>\n <tr>\n   <td>Basic 20K</td>\n   <td>20,000 contacts and 60,000 emails</td>\n   <td>$0.0030</td>\n </tr>\n <tr>\n   <td>Basic 50K</td>\n   <td>50,000 contacts and 150,000 emails</td>\n   <td>$0.0028</td>\n </tr>\n <tr>\n   <td>Basic 100K</td>\n   <td>100,000 contacts and 300,000 emails</td>\n   <td>$0.0023</td>\n </tr>\n <tr>\n   <td>Advanced 10K</td>\n   <td>10,000 contacts and 50,000 emails</td>\n   <td>$0.0075</td>\n </tr>\n <tr>\n   <td>Advanced 20K</td>\n   <td>20,000 contacts and 100,000 emails</td>\n   <td>$0.0060</td>\n </tr>\n <tr>\n   <td>Advanced 50K</td>\n   <td>50,000 contacts and 250,000 emails</td>\n   <td>$0.0060</td>\n </tr>\n <tr>\n   <td>Advanced 100K</td>\n   <td>100,000 contacts and 500,000 emails</td>\n   <td>$0.0050</td>\n </tr>\n <tr>\n   <td>Advanced 200K</td>\n   <td>200,000 contacts and 1,000,000 emails</td>\n   <td>$0.0050</td>\n </tr>\n <tr>\n   <td colspan=\"3\">*Taxes may apply.</td>\n </tr>\n</table>\n\n### API Plans Overage Costs\n\n<table>\n <tr>\n   <th colspan=\"3\">API Plans Overage Costs</th>\n </tr>\n <tr>\n   <td colspan=\"3\">The exact amount you pay will vary month-to-month based on how many emails you send over your limits.<br>If you go over your plan limits, here’s a breakdown of the overage costs you’ll incur:</td>\n </tr>\n <tr>\n   <td>Plan Information</td>\n   <td>Monthly Plan Limits</td>\n   <td>Cost per Extra Email*</td>\n </tr>\n <tr>\n   <td>Free</td>\n   <td>40,000 emails</td>\n   <td>-</td>\n </tr>\n <tr>\n   <td>Essentials 40K</td>\n   <td>40,000 emails</td>\n   <td>$0.00100</td>\n </tr>\n <tr>\n   <td>Essentials 100K</td>\n   <td>100,000 emails</td>\n   <td>$0.00075</td>\n </tr>\n <tr>\n   <td>Pro 100K</td>\n   <td>100,000 emails</td>\n   <td>$0.00100</td>\n </tr>\n <tr>\n   <td>Pro 300K</td>\n   <td>300,000 emails</td>\n   <td>$0.00063</td>\n </tr>\n <tr>\n   <td>Pro 700K</td>\n   <td>700,000 emails</td>\n   <td>$0.00051</td>\n </tr>\n <tr>\n   <td>Pro 1.5M</td>\n   <td>1,500,000 emails</td>\n   <td>$0.00048</td>\n </tr>\n <tr>\n   <td>Pro 2.5M, Pro 2.5M Legacy</td>\n   <td>2,500,000 emails</td>\n   <td>$0.00047</td>\n </tr>\n <tr>\n   <td>Premier</td>\n   <td>Custom</td>\n   <td>-</td>\n </tr>\n <tr>\n   <td colspan=\"3\">*Taxes may apply.</td>\n </tr>\n</table>\n\n## Requesting a refund\n\nYou must meet both criteria below for a refund to be considered:\n\n- You have not used your account in the current calendar month.\n- You have no overages, and you have no contacts stored in Marketing Campaigns.\n\nTwilio SendGrid packages operate off of a monthly subscription model, not direct usage. We will not issue a refund if you have used your account in the same calendar month as your request. Instead, please cancel your account to avoid any future subscription charges.\n\nRefunds are only applicable to the current subscription charge on your account, not for overage or contact storage charges from the prior month. We hold our customers responsible for managing their account credit limits and contact storage.\n\nIf you meet these conditions, please respond directly to the invoice email you have received, or email billing@sendgrid.com to begin the discussion about a possible refund.\n\n## Changing your plan\n\nYou can change your plan under the Email API or Marketing Campaigns sections on the \"Your Products\" tab of the [Account Details page](https://app.sendgrid.com/account/products).\n\n<call-out type=\"warning\">\n\n**Please note:** Downgrading from a paid Basic or Advanced Marketing Campaigns plan to a Free account will permanently delete all contacts associated with that account. You will need to reimport any contacts that you would like to use with your Free account.\n\nOther limits (like the number of Signup Forms or Email Testing credits available to you) will downgrade to the Free plan limits, keeping the most recently updated items when applicable. For example, if you have 10 Signup Forms and downgrade to a Free plan, we will keep your most recently updated Signup Form and remove the other 9.\n\n</call-out>\n\n## Cancelling your account\n\nTo cancel your account, go to the bottom of the \"Your Products\" tab of the [Account Details page](https://app.sendgrid.com/account/products), click **Cancel Account**, and follow the prompts.\n\n<call-out>\n\nWhen you cancel an account, it changes to a [free](https://sendgrid.com/free?mc=SendGrid%20Documentation) plan.\n\n</call-out>\n\n## Additional Resources\n\n- [SendGrid Pricing](https://sendgrid.com/pricing/)\n- [Reading your invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/cancel-your-account.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: account-management\ntitle: Canceling your account\nnavigation:\n  show: true\nseo:\n  title: Canceling your account\n  override: true\n  description: Steps for canceling your SendGrid account using the SendGrid UI\n---\n\n*To cancel your SendGrid account:*\n\n1. Log into SendGrid.com\n1. Select **Settings** and then click **Account Details**.\n1. Select **Your Products**.\n1. At the bottom of the page, click **Cancel Account**\n\n<call-out>\n\nCancellations take full effect on the first day of the next calendar month, at which point your account will still be usable, but will be automatically downgraded to the Free package level.\n</call-out>\n\nBecause it takes some time for the cancellation to take effect, Twilio SendGrid recommends you secure your account if you have not already:\n\n1. Run a virus and malware scan on all computers and servers that access Sendgrid.com\n1. Change your and all teammate account passwords.\n1. Enable [two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/#setting-up-two-factor-authentication) for your account if you have not already.\n1. Review recent IP's that logged into your account via the IP Access Management page in Account Settings.\n1. Ensure any installed content management systems such as Apache, PHP, Perl, etc. are up to date.\n1. Verify that your account credentials and API keys are not publicly listed on code repositories or associated comments on sites such as GitHub or BitBucket.\n\nIf you run into issues Cancelling your account, please contact our [support team](https://support.sendgrid.com/).\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/configuring-sign-in-with-apple.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Configuring Sign in with Apple\ngroup: sender-authentication\nnavigation:\n  show: true\nseo:\n  title: Configuring Sign in with Apple\n  override: true\n  description: Configure your authenticated domain to support Sign in with Apple and successfully deliver email to Apple's Private Email Relay addresses.\n  keywords: Apple, Sign-in, Auth, Authorization, Authentication, Email, Relay, Proxy\n---\n\n## Introduction\n\nWith the release of iOS 13, Apple began providing a feature called [Sign in with Apple](https://developer.apple.com/sign-in-with-apple/get-started/). This [OAuth](https://en.wikipedia.org/wiki/OAuth) feature allows users to authenticate with supported apps and websites using their Apple IDs. Sign in with Apple also provides a privacy feature called [\"Hide My Email\"](https://support.apple.com/en-us/HT210425#hideemail) that is particularly relevant to your SendGrid configuration.\n\nThis page contains all the relevant SendGrid documentation required to successfully deliver messages to one of Apple’s [private email relay](https://developer.apple.com/documentation/signinwithapplejs/communicating_using_the_private_email_relay_service) addresses. For more information about Sign in with Apple, be sure to consult Apple’s [Developer Documentation](https://developer.apple.com/documentation).\n\n## Delivering Mail to Private Addresses Generated by Apple\n\nTo provide users with greater privacy, Sign in with Apple will create app-specific email addresses for users who prefer not to reveal their email addresses to a service. Apple does this with a private email relay.\n\nWhen a user chooses to hide their email address, Apple will create a unique address shared between only the user and the specific service. These private addresses follow the format: `<unique-alphanumeric-string>@privaterelay.appleid.com`.\n\nApple will forward Messages sent to one of these relay addresses to the user’s actual email address. As a developer, you must configure your mail send according to requirements specified by Apple if you wish to support Sign in with Apple as an authentication provider. If you fail to follow Apple’s requirements, your messages to Apple’s private relay addresses will be bounced with the error “550 5.1.1 bad mailbox name.”\n\nThis guide will step you through either a recommended configuration, which will work for most of you, or an alternate configuration for those of you with many authenticated domains. If you have thirty-two or more authenticated domains, read the prerequisites, and then jump to the [Alternative Configuration](#alternative-configuration) section.\n\n## Prerequisites\n\n### Domain Authentication\n\nBefore you can configure Sign In with Apple, you need to complete [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) setup for the domain you will use when sending mail to Apple’s private addresses.\n\nThe option to configure Sign in with Apple will show only for a fully authenticated domain, so be sure to complete this step first.\n\n<call-out type=\"warning\">\n\nWhen using the Alternative Configuration, it is critically important that you turn off automated security when completing the authentication process. Failure to do so will result in issues later in the configuration process.\n\n</call-out>\n\n### Apple Developer Account\n\nTo configure a [Private Email Relay Service](https://help.apple.com/developer-account/?lang=en#/devf822fb8fc) with Apple, you will also need a registered [Apple Developer](https://developer.apple.com/) account.\n\n## Recommended Configuration\n\nOnce you have successfully authenticated your domain, navigate to https://app.sendgrid.com/settings/sender_auth, and locate the configured domain.\n\nClick on the domain to navigate to its detail page. You should see a Settings section with a “Sign In with Apple Address” option and a button labeled “Show Address.”\n\n![Sender Auth Domain Settings]({{root_url}}/img/sign-in-apple-sender-auth-settings.png 'Sender Auth Domain Settings')\n\n![Sign in with Apple Tooltip]({{root_url}}/img/sign-in-apple-sender-auth-tooltip.png 'Sign in with Apple Tooltip')\n\nClick “Show Address” to reveal an allowed address that you can provide to Apple. This address should be the word “bounces,” a `+` symbol, your account number, the `@` symbol, and your authenticated domain. For example, your address may look like this: `bounces+12345678@email.example.com`. Copy the address from the information modal on the Sender Authentication page.\n\n![Allowed email address]({{root_url}}/img/sign-in-apple-sender-auth-info-modal.png 'Allowed email address')\n\n### Configuring your Apple Developer Account\n\nLog in to your Apple Developer account, and navigate to the [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources) section of your developer resources. Click on \"Configure Sign in with Apple.\"\n\nIn the section labeled “Individual Email Addresses,” paste the allowed address you copied from SendGrid earlier, and click “Register.” You should immediately see a green checkmark next to the email address. If you see an error, ensure that you completed domain authentication on the [SendGrid Sender Authentication page](https://app.sendgrid.com/settings/sender_auth).\n\nYou should now be set to send messages to Apple's private relay addresses.\n\n<call-out type=\"warning\">\n\nIf you are sending to Apple relay addresses from a sub user account, you must add the `bounces+subuserID@domain.com` (example) return path under \"Individual Email Addresses\" within the Apple console for each sub user and domain authentication combination from which you send in order for mail to be accepted by Apple properly.\n\n</call-out>\n\n## Alternative Configuration\n\nApple limits the number of addresses you can allow in the Apple Developer portal to [a total of thirty-two](https://help.apple.com/developer-account/?lang=en#/devf822fb8fc). If you have more than thirty-two verified domains, you will need to configure each of the addresses following the steps below.\n\n<call-out type=\"warning\">\n\nThe majority of this setup and management occurs outside of the SendGrid console. SendGrid Support can help only with the steps that happen within your SendGrid account such as Domain Authentication setup.\n\n</call-out>\n\n### Alternative Configuration Prerequisites\n\nBefore you begin the four-step process, you will need access to the following:\n\n- The [Sender Authentication section](https://app.sendgrid.com/settings/sender_auth) of your Twilio SendGrid account\n- The DNS panel of the domain you’ll be sending from\n- The [Apple Developer portal](https://developer.apple.com/) for your app\n- An SSL certificate for your domain\n- A webserver to host files over HTTPS\n\n### Domain Authentication\n\nWhen using the alternative configuration, be sure to turn off automated security. You will find this option in the settings section of the Sender Authentication page for your domain. Failure to do this will result in issues later in the configuration process.\n\nPlease note that if you have an existing domain that is set to use automated security, and you want to configure this domain to work with Sign in with Apple, you must create a new authentication for that domain that does not use automated security.\n\n<call-out>\n\nChanging the root domain of your existing authentication will require rewarming that domain with Gmail. You want to avoid any changes to that root to avoid slowing this process.\n\n</call-out>\n\n### Registering your Domain with Apple\n\nOnce your domain authentication completes successfully, navigate to https://app.sendgrid.com/settings/sender_auth. Locate your authenticated domain and copy it. You will need this entire domain, including the subdomain. For example, with an authenticated domain of `email.example.com`, `email` is the subdomain. The entire domain is `email.example.com`.\n\nLog in to your [Apple Developer account](https://developer.apple.com/develop/), and navigate to the [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources) section. Select “More” from the sidebar, and click “Configure Sign In with Apple.”\n\nIn the section titled “Domains and Associated Email Addresses,” paste the entire authenticated domain from your SendGrid setup. Next, click the “Register” button. The page will prompt you with a download link. Click this link to download a unique text file generated by Apple.\n\n### Hosting Apple’s Association Text File\n\nApple will use the text file you downloaded to verify that you control the domain associated with your mail send. You must host and serve this text file over https using a publicly available web server.\n\nFor more information about hosting and serving files, you may need to contact your web host. Many domain providers also offer web hosting solutions and may be able to help you configure delivery over SSL. You can also obtain free SSL certificates using [Let's Encrypt](https://letsencrypt.org/).\n\nTo ensure verification of your domain by Apple, you must serve the file at the path `/.well-known/apple-developer-domain-association.txt`. This path should follow the domain you authenticated with SendGrid and provided to Apple in the previous steps. If you authenticated `email.example.com`, the full URL used to access the unique text file would be `https://email.example.com/.well-known/apple-developer-domain-association.txt`. To break this down, the parts of this address are:\n\n- https — HTTP with an SSL certificate\n- email.example.com — Your full domain, including the subdomain\n- /.well-known/apple-developer-domain-association.txt — the path required by Apple\n\nFinally, log in to the service you use to manage your domain's [DNS]({{root_url}}/glossary/dns/) records. This may be a service such as Amazon Route 53 or a panel provided by the company where you purchased the domain. Add a new [A record]({{root_url}}/glossary/a-record/) to your domain containing the IP address of your web host. The A record needs to be located at the subdomain and domain you registered in the Apple Developer portal.\n\n<call-out>\n\nIf your DNS provider and web hosting provider are the same, you may be able to create a subdomain. Creating a new subdomain will usually create a new web host with the necessary A record and a location for uploading the file.\n\n</call-out>\n\nOnce you have added the A record and uploaded the file, paste the full URL path to your text file into your browser. Again, the URL should look something like `https://email.example.com/.well-known/apple-developer-domain-association.txt`. If the contents of the file you uploaded show in your browser, you’re ready to move on to the next step.\n\n### Finish the Registration\n\nBack in the Apple Developer portal, go to the Sign In With Apple setup page, and click “Verify.\" You should see a green checkmark. If you receive an error, check that:\n\n- Your domain was authenticated properly with SendGrid\n- You uploaded the text file to the correct location\n- Your SSL certificate is configured correctly for your full domain\n\nYou should now be set to send messages to Apple's private relay addresses. We recommend testing your implementation by signing into your app with your Apple ID and attempting to send an email to the app-specific email address that is issued. You can use [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) to verify that the message was delivered. If you have questions, we recommend reaching out to our [Support Team](https://support.sendgrid.com/hc/en-us).\n\nAgain, please note that SendGrid Support is unable to assist you with the configuration of the services required outside of the SendGrid product.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/custom-ssl-configurations.md",
    "content": "---\nseo:\n  title: Adding a Custom SSL configuration\ntitle: Adding a Custom SSL configuration\nlayout: page\nweight: 0\ngroup: account-management\nnavigation:\n  show: true\n---\n\nIf you can't or don't want to use Content Delivery Networks when setting up SSL for click and open tracking, you can set up a custom SSL configuration.\n\nBefore Adding a Custom SSL configuration, you need to set up a valid [link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/) on your account.\n\n_To add a custom SSL configuration:_\n\n1. Prepare a proxy (like a web application, NGINX, or Amazon API Gateway) to take all traffic for `mailing.example.com` and forward it to `http://sendgrid.net` or `https://sendgrid.net`.\n1. Set up the proxy to use HTTP or HTTPS. For HTTPS, provide a valid SSL certificate for `mailing.example.com` domain.\n1. To forward traffic, set the `Host` HTTP header to `mailing.example.com` domain.\n1. Point the CNAME record to your proxy. For example, `CNAME mailing.example.com proxy.example.com`.\n\n<call-out type=\"warning\">\n\nDon't validate the DNS record more than once. After changing the CNAME, a second validation will fail, and the authentication will stop working.\n\n</call-out>\n\n[Contact SendGrid Support](https://support.sendgrid.com/hc/en-us) to enable SSL click and open tracking.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/dedicated-ip-addresses.md",
    "content": "---\nseo:\n  title: Dedicated IP addresses\n  description: Dedicated IP addresses\n  keywords: sendgrid ip address, ips, ip addresses, purchase IPs, add, additional, more, new, IP, address, purchase, dedicated, account, another, need, IPs, warmup, sending, originating, originate, plan, reputation, monitoring, monitor\ntitle: Dedicated IP addresses\nweight: 0\ngroup: ip-management\nlayout: page\nnavigation:\n  show: true\n---\n\n##     What are dedicated IP Addresses?\n\nAn Internet Protocol (IP) address is a unique numerical address that defines a location. At Twilio SendGrid, you'll receive a dedicated IP address with either a Pro Email API plan or an Advanced Marketing Campaigns plan. If you have one of these accounts, you can purchase additional IP addresses dedicated to your account. For more information, see our [pricing](https://sendgrid.com/pricing/) page. Since you are the only one sending email over this IP, the sender reputation associated with this IP is determined purely by your sending practices.\n\n\n##     Why would I want a dedicated IP address?\n\nIf you are sending any significant amount of email, we typically suggest sending your marketing and transactional emails from separate IP addresses. In order to do this, you'll need to set up [IP Pools]({{root_url}}/ui/account-and-settings/ip-pools/). In addition, it is strongly recommended to associate your sending domain with your new outbound IP address (provided to you by SendGrid). This is available at no extra cost and can be accomplished by [completing an rDNS setup for your dedicated IP]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/).\n\nWe also suggest having at least 2 promotional IP addresses when your volume reaches 200-300K/month.\n\n\n##     Do I have a dedicated IP address?\n\nDepending on the plan you have chosen, you either have a dedicated sending IP address or you are using a shared sending IP address.\n\n- All Pro or Premier Email API and Advanced Marketing Campaigns customers get one dedicated sending IP by default. You can view any IPs attached to your account [here](https://app.sendgrid.com/settings/ip_addresses).\n- Free and Essential customers send from groups of shared IP addresses, where they group with senders of similar reputation and deliverability. Shared IPs addresses that these accounts send from can change without notice as your reputation changes, or as we make changes to IP groups to improve deliverability. In these cases, you will not be able to view your shared sending IP addresses from within your account.\n\n\n##     How many dedicated IPs should I have?\n\nPlease see our document on [suggested IP allocation based on volume]({{root_url}}/assets/IPWarmupSchedule.pdf).\n\n\n##     Adding an additional dedicated IP address\n\nYou can purchase an additional dedicated IP Address from the IP Addresses Settings page or from your [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page.\n\n*To add an additional dedicated IP Address:*\n\n1. In the left navigation, select **Settings** and then click **IP Addresses**.\n   Here you'll see a list of your current d IPs. Your IPs in warmup will have a 'warmup' label.\n1. Click **Add an IP Address**.\n1. Select the number of IP addresses you would like to purchase.\n\nUnder \"Additional Options\" you will find the following options:\n\n  - **Use automated IP warmup**: SendGrid will gradually increase the amount of email sent over this IP. Note: It is best practice to [warm an IP address]({{root_url}}/ui/sending-email/ip-warmup-for-the-new-marketing-campaigns-experience/) over time before sending fully over that IP address. When using automated warmup, you must have at least one other warm IP that can handle the overflow traffic from the IP in warmup.\n  - **Allow my parent account to send mail using these IP addresses**: You want your parent account to be able to send over this IP. If you are assigning this IP to a subuser and only want that subuser to have permission to send on this IP, leave this box unchecked.\n  - **Allow my subusers to send mail using these IP addresses**: Select any subusers you would like to send on this IP address.\n\n\nAfter purchasing your IP, we strongly encourage you to set up reverse DNS. For more information about setting up reverse DNS, see [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/).\n\n<call-out>\n\nOnly the Parent account or Teammates with either Billing or Admin permissions can purchase and add dedicated IPs.\n\n</call-out>\n\n<call-out>\n\nAdditional IPs cost an extra $30 per additional IP per month. You may add 1 new IP address to your account per month through the user interface.  For the addition of more than 1 IP address per month, please contact our support team.\n\n</call-out>\n\n##     Reputation Monitoring for dedicated IP Accounts\n\nTwilio SendGrid does not offer dedicated IP address reputation monitoring as a service. We do not manage the reputation of your dedicated IP address since your mail only sends via your dedicated IP. This means that you have ultimate control over the content that is being sent out and therefore are responsible for monitoring and maintaining its reputation and listing status. However, many services can help you maintain your IP’s reputation.\n\nThe following are some third party tools available to assist you in maintaining your reputation:\n\n* [250ok](https://250ok.com/tools/blacklists/)\n* [Return Path](https://returnpath.com/request-a-demo-social/?sfdc=701000000006Za6&gclid=CIO88sevkcwCFRSPfgod6u8AXA)\n* [Sender Score](https://www.senderscore.org/blacklistlookup/)\n\n\nIn addition, SendGrid offers [Expert Services](https://sendgrid.com/solutions/expert-services/) services to Pro and Premier accounts that can help with deliverability and onboarding. Services include how to maintain/improve domain and IP reputation, reviewing message content, dedicated IP configuration, and creating a custom IP warmup plan to name a few.\n\n##     Warming Up a dedicated IP Address\n\nFor more information on warming up an IP Address, see [Warming up a dedicated IP]({{root_url}}/ui/sending-email/ip-warmup-for-the-new-marketing-campaigns-experience/).\n\n##     Assigning a dedicated IP address to a subuser\n\nSubusers cannot set up and add reverse DNS to their own dedicated IPs, but you can set it up for them and assign it to them. You can add a dedicated IP to a subuser when you [create the subuser]({{root_url}}/ui/account-and-settings/subusers/#create-a-subuser), or in the [subuser management](https://app.sendgrid.com/settings/subusers) page.\n\n ###     Before you begin\n\nYou need to have a [subuser]({{root_url}}/ui/account-and-settings/subusers/#create-a-subuser), and a [dedicated IP address]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/#adding-an-additional-dedicated-ip-address) you want to assign the subuser.\n\n*To assign a dedicated IP to a pre-existing subuser:*\n\n1. Navigate to **Settings** and select **IP Addresses**.\n1. Find and select the IP address you wish to add any of your subusers to, and then hover over the action menu. Click the pencil icon that says **Edit**.\n1. Select the **Choose the Subusers** field and then click on any of the subusers you want to add from the dropdown menu to add them to the specified IP address.\n1. Select **Save**.\n\n##     Additional Resources\n\n- [Warming up a dedicated IP]({{root_url}}/ui/sending-email/ip-warmup-for-the-new-marketing-campaigns-experience/)\n- [API IP Access Management]({{root_url}}/ui/account-and-settings/ip-access-management/)\n- [SendGrid billing information]({{root_url}}/ui/account-and-settings/billing/)\n\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Do you want expert help to get your email program started on the right foot?\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/dkim-records.md",
    "content": "---\nseo:\n  title: DKIM Records Explained\n  description: DKIM Records Explained\n  keywords: permission, dkim, sender verification, include, return, path, sender, permitted, forgery, spoofing, spoof, fail, failed, validation, validate\ntitle: DKIM Records Explained\ngroup: account-management\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nDomainKeys Identified Mail (DKIM) is an authentication standard used to prevent email spoofing. Specifically, DKIM attempts to prevent the spoofing of a _domain_ that's used to deliver email.\n\nDKIM employs the concept of a domain owner who controls the DNS records for a domain. When sending email with DKIM enabled, the sending server signs the messages with a private key. A domain owner also adds a DKIM record, which is a modified [TXT record](https://en.wikipedia.org/wiki/TXT_record), to the DNS records on sending domain. This TXT record will contain a public key that's used by receiving mail servers to verify a message's signature. The DKIM [public-key cryptography](https://www.twilio.com/blog/what-is-public-key-cryptography) process allows recipients to be confident of a sender's authenticity.\n\n## DKIM mail flow\n\nTo understand DKIM, it may be helpful to understand how email is sent when DKIM is added to the process. Imagine an email sent by `sender@example.com`. For DKIM to work properly, the following steps take place:\n\n1. Before sending the message, the sending server signs the email using a private key.\n2. When the message is delivered, the receiving server obtains the DKIM record from the DNS records for `example.com`.\n3. The receiving server then uses the public key in the DKIM record to verify the message’s signature.\n4. If the DKIM check passes, the receiving server can be confident the message was sent by the address in the `return-path` and wasn’t altered in transit.\n5. If the DKIM check fails, the message is likely illegitimate and will be processed using the receiving server’s failure process.\n\n![A diagram of the DKIM traffic flow described in the steps above this image]({{root_url}}/img/dkim_mail_flow.jpeg 'DKIM mail flow diagram')\n\nWhile DKIM authentication is an email best practice, it’s important to understand that a DKIM signature is limited in scope. It does not verify content or tell the receiver to treat the message any differently. Its main purpose is to help verify [Sender Identity]({{root_url}}/for-developers/sending-email/sender-identity/), which is an important factor (although not the only factor) when it comes to email delivery.\n\nYou can authenticate with DKIM yourself, or the DKIM signature can be created by your sending message transfer agent ([MTA]({{root_url}}/glossary/mta/)). Setting up DKIM can be a complex process. If not done right, Internet service providers (ISPs) will block your email, particularly because incorrect implementation is a sign of a spammer.\n\nSendGrid automatically enables DKIM for all email to improve your email deliverability, whether you’re on a shared IP or a dedicated one. This is just one more example of how SendGrid helps thousands of customers follow email best practices to ensure maximum delivery for their emails.\n\n## Automated Security and Your DKIM Signature\n\nWhen you set up an authenticated domain, you will be given the option of using automated or manual security. When you select automated security, SendGrid will manage your DKIM and [SPF]({{root_url}}/ui/account-and-settings/spf-records/) records for you. This means that whenever you make a change to your account that could impact your deliverability, such as adding a new dedicated sending IP address, SendGrid will automatically update your DNS settings and your DKIM signature.\n\n<call-out>\n\nSendGrid will always provide you with a custom DKIM signature. However, your custom DKIM signature is only automatically updated if you select automated security when [authenticating your domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). If you turn automated security OFF, you will be responsible for updating your DKIM signature whenever you make a change to your sending domain.\n\n</call-out>\n\n### Example DKIM Record: Automated Security ON\n\n```text\nsubdomain.yourdomain.com. | CNAME | uXXXXXXX.wlXXX.sendgrid.net\ns1._domainkey.yourdomain.com. | CNAME | s1.domainkey.uXXX.wlXXX.sendgrid.net.\ns2._domainkey.yourdomain.com. | CNAME | s2.domainkey.uXXX.wlXXX.sendgrid.net.\n```\n\n### Example DKIM Record: Automated Security OFF\n\n```text\nem1234.yourdomain.com | MX | mx.sendgrid.net\nem1234.yourdomain.com | TXT | v=spf1 include:sendgrid.net ~all\nm1._yourdomain.com | TXT | k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPtW5iwpXVPiH5FzJ7Nrl8USzuY9zqqzjE0D1r04xDN6qwziDnmgcFNNfMewVKN2D1O+2J9N14hRprzByFwfQW76yojh54Xu3uSbQ3JP0A7k8o8GutRF8zbFUA8n0ZH2y0cIEjMliXY4W4LwPA7m4q0ObmvSjhd63O9d8z1XkUBwIDAQAB\n```\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n### Do you want expert help to get your email program started on the right foot?\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n</call-out-link>\n\n## Additional resources\n\n- [Sender Identity](/for-developers/sending-email/sender-identity/)\n- [Domain Authentication](/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Single Sender Verification](/ui/sending-email/sender-verification/)\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n- [Troubleshooting Sender Authentication]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/dns-providers.md",
    "content": "---\nseo:\n  title: DNS Provider video tutorials\n  description: Here are guides for setting up sender authentication with specific DNS providers\n  keywords: sender verification, dns, provider, spf, dkim, dmarc, godaddy, hover, sender authentication\ntitle: DNS Provider video tutorials\ngroup: sender-authentication\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n## Sender authentication with GoDaddy\n<iframe src=\"https://player.vimeo.com/video/149805633\" width=\"700\" height=\"400\" frameborder=\"0\" allowfullscreen=\"\"></iframe>\n\n## Sender authentication with Hover\n<iframe src=\"https://player.vimeo.com/video/158954155\" width=\"700\" height=\"400\" frameborder=\"0\" allowfullscreen=\"\"></iframe>\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/forced-password-reset-faq.md",
    "content": "---\nseo:\n  title: Forced Password Reset FAQ\n  description: Forced Password Reset FAQ\ntitle: Forced Password Reset FAQ\nweight: 0\ngroup: security\nlayout: page\nnavigation:\n  show: false\n---\n\n## What is a credential stuffing attack?\n\n* Credential stuffing involves sourcing lists of previously compromised credentials that are traded and used by bad actors on the internet, to gain access to a given site or application. When a site is compromised, and credentials stolen, they’re often tested against other sites and applications because people often use the same email and password combination to log into multiple sites.\n\n## Where can I look for evidence of bad activity in my account?\n\n* Although available features may vary by subscription, and also what individuals have chosen to set up on their account, careful attention should be paid to the following pages to identify unauthorized activity Including:\n  * account settings\n  * api key console pages\n  * payment methods page \n  * 2fa settings console page\n  * Teammate management page\n  * IP address (IPAM) management page\n  * Webhooks management page\n  * subusers management page\n\n## What were the subject lines of the phishing emails?\n\n* This can vary by account. We suggest you review all the emails sent from your account over the past 30 days and scrutinize any subject lines that you don’t immediately recognize.\n\n## Could a user gain access with username and password and send mail if we have IP access management set up on our account?\n\n* If you are using IP access management,you’ve taken extra precautions which would’ve prevented the attackers from accessing your account. IP access management effectively locks them out and prevents this kind of account takeover.\n\n## How could a user gain access with username and password and send mail if we use API keys for V3 mail send? Did they create an API key?\n\n* In some cases the attackers used the account credentials to gain access to the account and then created a new API key to allow them to gain access to the account’s functionality and send email. In these cases we have taken the additional step of invalidating some recently created API keys to revoke sending access to the attackers. You can check your API Key status by visiting the API Key page in your account.\n\n## How do you know we were affected?\n\n* Our team conducted a thorough investigation of the IP addresses accessing accounts and identified the IPs of bad actors accessing multiple accounts of which your account was one of them.\n\n## I didn’t get an account reset email and when I click ‘Forgot Your Password’ I don’t receive an email. What happened?\n\n* If you’re unable to generate an account reset email then please contact our support team for further assistance.\n\n## Why was I not notified before you reset my account and/or invalidated my API token?\n\n* It was important to reset the account passwords as soon as possible without alerting the bad actors. We’ve coordinated the timing of the notification with the reset to avoid alerting the bad actors.\n\n## What services will be disrupted by a password reset?\n\n* Any services which use basic authentication, including access to the UI and API calls will be disrupted.\n\n## How can I better protect my account?\n\n* In addition to 2FA we suggest all users take advantage of IP access management to lock down the IP addresses that can access a given account. If account owners work with a team of people we recommend the use of Teammates to restrict access and give the account admin greater flexibility to structure how their colleagues can or can not access the account.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/heroku-credentials.md",
    "content": "---\nseo:\n  title: Heroku Users - Find your SendGrid Credentials\n  description: Learn how to find and recover your username/password as a SendGrid add-on user...\n  keywords: heroku, password, reset, recover, username\ntitle: Heroku Users - Find your SendGrid Credentials\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\n## \tFinding your existing username and password in the Heroku portal\n \t\nIf you are a Heroku user using [the SendGrid add-on](https://addons.heroku.com/sendgrid), and would like to access the SendGrid web interface, or would just like to know your SendGrid account credentials; you can find them by doing the following from the Heroku interface:\n\n1. In Heroku, go to your Apps, choose your SendGrid app\n\n    ![]({{root_url}}/images/HerokuPW1.png \"Heroku SendGrid App Screenshot\")\n\n1. Click **Settings** and then click **Reveal Config Vars**.\n\n    ![]({{root_url}}/images/HerokuPW2.png \"Heroku Config Vars Screenshot\")\n\n<call-out>\n\nEditing your username or password here will not have an effect on your SendGrid account credentials.\n\n</call-out>\n\n## \tResetting your SendGrid add-on password\n \t\nGo to the [SendGrid Password Reset page](https://sendgrid.com/user/forgotPassword) and enter your SendGrid username, and click submit. An email will be sent to the email address on file with instructions on how to reset your password. If you don't know your SendGrid username, use the steps detailed above to find your username through the Heroku portal.\n\n<call-out>\n\nResetting your password will not update the Config Vars of your SendGrid add-on in the Heroku portal. To update this please follow the directions above to pull up your add-on Settings/Config Vars. Then click the “edit” button to manually input your new password:\n\n</call-out>\n\n![]({{root_url}}/images/HerokuPW3.png \"Heroku Config Vars Edit Screenshot\")\n\n![]({{root_url}}/images/HerokuPW4.png)\n\n<call-out type=\"warning\">\n\nResetting your SendGrid password may break any integrations you have that are currently using the existing credentials for authentication.\n\n</call-out>\n\nAlternatively, you can contact [Heroku Support](https://www.heroku.com/support) directly to request a password reset for the SendGrid add-on.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/hipaa-compliant.md",
    "content": "---\nseo:\n  title: Is SendGrid HIPAA Compliant?\n  description: Sending email with SendGrid is not HIPAA compliant...\n  keywords: security, hipaa, encryption, tls, ssl, secure, GLBA, gramm leach, bliley, act, health, law\ntitle: Is SendGrid HIPAA Compliant?\nweight: 0\ngroup: security\nlayout: page\nzendesk_id: 200182978\nnavigation:\n  show: true\n---\n\n **No, we are not.**\n\nSendGrid does not natively support HIPAA compliant data transmission. We do not offer any  encryption or security measures surrounding message transmission beyond those included in the SMTP RFC, which was not designed with HIPAA compliancy in mind.\n\nWe suggest that you encrypt the message body of your emails on your end if you are concerned about being compliant with HIPAA, or offer a secure download link for secure documents rather than transmitting them directly via email.\n\nFrom our [Terms of Service](https://sendgrid.com/policies/tos/): \n\n>SendGrid does not intend uses of the Service to create obligations under The Health Insurance Portability and Accountability Act of 1996 (“HIPAA”), the Gramm-Leach-Bliley Act (“GLBA”) or similar laws and makes no representations that the Service satisfies the requirements of such laws. If You are (or become) a Covered Entity or Business Associate (as defined in HIPAA) or a Financial Institution (as defined in GLBA), You agree not to use the Service for any purpose or in any manner involving Protected Health Information (as defined in HIPAA) or Nonpublic Personal Information (as defined in GLBA).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/how-to-set-up-domain-authentication.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: How to set up domain authentication\ngroup: sender-authentication\nnavigation:\n  show: true\nseo:\n  title: How to set up domain authentication\n  override: true\n  description: Set up sender authentication to improve your deliverability and security of your emails.\n---\n\n<iframe src=\"https://player.vimeo.com/video/265066856\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n## What is domain authentication?\n\nDomain authentication, formerly known as domain whitelabel, shows email providers that SendGrid has your permission to send emails on your behalf. To give SendGrid permission, you point DNS entries from your DNS provider (like GoDaddy, Rackspace, or Cloudflare) to SendGrid. Your recipients will no longer see the “via sendgrid.net” message on your emails.\n\nEven though this is a small change from your recipient's perspective, this change has a huge positive impact on your reputation as a sender and your email deliverability. Email service providers distrust messages that don't have domain authentication set up because they can not be sure that the message comes from you. Explicitly stating that it comes from you increases your reputation with email service providers which makes it much less likely that they will filter your mail and not allow it get to your recipient's inbox, which increases your deliverability. You are also explicitly showing your recipients that this email comes from you, so they are less likely to mark your mail as spam.\n\n## Key terminology\n\n### DNS\n\nDNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from, or that you want to link images from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/glossary/dns/).\n\n### DKIM\n\nDKIM stands for DomainKeys Identified Mail which was designed to help email providers prevent malicious email senders by validating email from specific domains.\n\nAs one of the most popular email authentication methodologies, it works by using cryptographic technology that adds a digital signature to your message header. This DKIM signature validates and authorizes your domain name in the eyes of the receiver. The DKIM signature is created using a unique string of characters stored as a public key.\n\nWhen your email is received, the public key is retrieved through the DNS and decrypted by the receiver to allow them to confidently verify the identity of your domain. For more information about DKIM, see our [DKIM glossary page]({{root_url}}/glossary/dkim/).\n\n### SPF\n\nSender Policy Framework (SPF) is an email authentication standard developed by AOL that compares the email sender’s actual IP address to a list of IP addresses authorized to send mail from that domain. The IP list is published in the domain’s DNS record. For more information about SPF, check out our [SPF glossary page]({{root_url}}/glossary/spf/).\n\n### CNAME\n\nThe CNAME record creates an alias for subdomain.yourdomain.com and points to sendgrid.net. The CNAME is needed for our click and open tracking features in order for those statistics to be routed back to your SendGrid account. This will also be what your messages are signed by, so your recipients will be able to see what you have chosen for your CNAME. You set up the CNAME files that SendGrid provides with your DNS host. For more information about CNAME, see our [CNAME glossary page]({{root_url}}/glossary/cname/).\n\n## Setting up domain authentication\n\n### Before you begin\n\nTo set up domain authentication, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up domain authentication.\n\n_To set up domain authentication:_\n\n1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/sender_auth).\n2. In the domain authentication section, click **Get Started**.\n3. Next, add in information about your DNS host, and indicate whether you also want to set up link branding. Click **Next**. For more information about link branding, check out [What is link branding?]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/#what-is-link-branding).\n4. Fill in the domain that you want to send from and add advanced settings as needed. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field. Your domain needs to match the domain of your FROM address on the emails you are sending out. For example, if I am sending an email from `example@sendgrid.com`, I would set my domain authentication domain to be `sendgrid.com`. Click **Next**. For more information about advanced settings, see [Advanced settings](#advanced-settings).\n5. Next, you need to add all of the CNAME records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your CNAME to some popular DNS service providers, check out these [videos]({{root_url}}/ui/account-and-settings/dns-providers/). If you don't have access to modify your companies DNS records, you can also email a request to a co-worker. This email includes a direct link to the CNAME records. This link does expire. The recipient doesn't need login access to your SendGrid account.\n\n<call-out>\n\nGoDaddy, Amazon Route 53, and Namecheap, are among providers that automatically add your domain to your new DNS record values, resulting in a CNAME entry with too much information that fails authentication. An example of this would be **em123.yourdomain.com.yourdomain.com**.\n\nBe sure to check your CNAME for this behavior if your domain doesn't validate initially.\n\nBelow is an example of the CNAME values under the HOST column as they are displayed and how you will need to enter them into your DNS management with one of these providers:\n\n- HOST/NAME **em123.yourdomain.com** . ENTER CNAME RECORD HOST/NAME AS: **em123**\n- HOST/NAME **s1.\\_domainkey.yourdomain.com**  ENTER CNAME RECORD HOST/NAME AS: **s1.\\_domainkey**\n- HOST/NAME **s2.\\_domainkey.yourdomain.com**  ENTER CNAME RECORD HOST/NAME AS: **s2.\\_domainkey**\n\nEntries made in the VALUE or POINTS TO field do not need to be changed.\n\n</call-out>\n\n<call-out>\n\nIf you [turn off automated security](#using-automated-security), you add TXT and MX records in this step instead of CNAME records.\n\n</call-out>\n\nIt can take up to 48 hours for the records to verify after you upload them into your DNS host, so you will likely have to come back later to verify.\n\n### Verifying your DNS\n\nOnce you add the CNAME records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/sender_auth) and click **Verify**.\n\n<call-out>\n\nIf you click verify, and only half of your CNAME records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/).\n\n</call-out>\n\nAny time that you send an email with a FROM address whose domain matches the domain set in the domain authentication, SendGrid applies that domain to your email. You only need to update your domain authentication if you want to update the domain you are emailing from.\n\n## Advanced settings\n\n<iframe src=\"https://player.vimeo.com/video/267486083\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n### Using automated security\n\nAutomated security allows Twilio SendGrid to handle the signing of your DKIM and authentication of your SPF for your outbound email with CNAME records. This allows you to add a dedicated IP address or update your account without having to update your SPF record.\n\nAutomated security defaults to **On**. If your DNS provider does not accept underscores in CNAME records, you will have to turn off Automated Security to use MX and TXT records.\n\nWhen Automated Security is **On**, SendGrid generates 3 different CNAME records. In a later step of setting up domain authentication, you give these records to your DNS provider, and then you verify that they upload correctly.\n\nIf you select **Off**, we generate 1 MX record and 2 TXT records. In a later step of setting up domain authentication, you give these records to your DNS provider, and then you verify that they upload correctly.\n\n<call-out>\n\nIf you turn off automated security, you are responsible for managing and updating the MX and TXT records yourself.\n\n</call-out>\n\n### Using a custom return path\n\nUse a custom return path to customize your subdomain.\n\n_To use a custom return path:_\n\nWhen you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Use a custom return path** and input letters or numbers to build a custom return path. If you don't select these, SendGrid automatically selects them for you. Make sure the characters you select are different from what SendGrid assigned you initially.\n\n### Using a custom DKIM selector\n\nUse a custom DKIM selector if you want to authenticate a single domain multiple times. This works by adding the custom selector to the domain as a custom subdomain.\n\n_To use a custom DKIM selector:_\n\nWhen you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Use a custom DKIM selector** and input 3 letters or numbers to build a custom subdomain. If you don't select these, SendGrid automatically selects them for you. Make sure the 3 characters you select are different from your original selection. For example, you could use `org` or `001`.\n\n### Assigning a subuser\n\nBy assigning an authenticated domain to one of your subusers, you can give them the benefit of improved authentication and security, but also separate from the sending reputation of your parent account. If you assign a subusers domain, they can't edit or delete it.\n\n_To assign an authenticated domain to a subuser:_\n\nWhen you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Assign to a subuser**, and select a subuser to assign to that domain.\n\n## Migrating from legacy Domain Authentication (Whitelabel)\n\nIf you authenticated a domain (whitelabel) before 2015, your domain will still work. However, if you need to change or update it, you need to delete it and recreate it as an authenticated domain in our new system.\n\nIf you set up a whitelabel after 2015, it has been automatically migrated to our new domain authentication system.\n\n## Additional resources\n\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n- [Troubleshooting Sender Authentication]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n- [Configuring Sign in with Apple]({{root_url}}/ui/account-and-settings/configuring-sign-in-with-apple/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/how-to-set-up-link-branding.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: How to set up link branding\ngroup: sender-authentication\nnavigation:\n  show: true\nseo:\n  title: How to set up link branding\n  override: true\n  description: Set up link branding to improve your deliverability and security of your emails.\n---\n\n<iframe src=\"https://player.vimeo.com/video/265136044\" width=\"640\" height=\"360\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n## What is link branding?\n\nEmail link branding allows all of the click-tracked links and opens tracked images in your emails to be from your domain instead of from sendgrid.net. Spam filters and recipient servers look at the links within emails to determine whether the email looks trustworthy enough to deliver - they use the reputation of the root domain to determine whether the links can be trusted. Implementing link labeling helps in email deliverability because you are no longer relying on click tracking going through a domain that you do not control.\n\n## Key terminology\n\n### DNS\n\nDNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from, or that you want to link images from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/glossary/dns/).\n\n### CDN\n\nA CDN (content delivery network) is a network that delivers the content of webpages to the end user. The network selects the servers for delivery based on the location of the end user, the originating location of the webpage and the location of the content delivery server. Content Delivery Networks are a great mechanism that you can use to serve up content very quickly and easily across multiple mediums as well as handle security certificates for you.\n\nWe suggest [CloudFlare]({{root_url}}/ui/sending-email/content-delivery-networks/#using-cloudFflare), [Fastly]({{root_url}}/ui/sending-email/content-delivery-networks/#using-fastly), or [KeyCDN]({{root_url}}/ui/sending-email/content-delivery-networks/#using-keycdn) when using Content Delivery Networks with SendGrid.\n\n### CNAME\n\nThe CNAME record creates an alias for subdomain.yourdomain.com and points to sendgrid.net. The CNAME is needed for our click and open tracking features in order for those statistics to be routed back to your SendGrid account. This will also be what your messages are signed by, so your recipients will be able see what you have chosen for your CNAME. You set up the CNAME files that SendGrid provides with your DNS host. For more information about CNAME, see our [CNAME glossary page]({{root_url}}/glossary/cname/).\n\n### Before you begin\n\nTo set up link branding, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up link branding.\n\n<call-out>\n\nNote that you can also set up link branding when you set up your domain authentication and you may not need to set it up again.\n\n</call-out>\n\n_To set up and verify link branding:_\n\n1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/sender_auth).\n2. In the link branding section, click **Get Started**.\n3. Next, add in information about your DNS host. Click **Next**.\n4. Enter the domain that you want to brand the links and images with and add advanced settings. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field. Your domain needs to match the domain of your from address on the emails you are sending out. For example, if I am branding with the domain `example.sendgrid.com`, I would set my link branding domain to be `sendgrid.com`. Click **Next**. For more information about advanced settings, see [Advanced settings](#advanced-settings).\n5. Next, you need to add all of the CNAME records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your CNAME to some popular DNS service providers, check out these [videos]({{root_url}}/ui/account-and-settings/dns-providers/). If you don't have access to modify your companies DNS records, you can also email a request to a co-worker. This email includes a direct link to the CNAME records. This link does expire. The recipient doesn't need login access to your SendGrid account.\n\n<call-out>\n\nA recent change with how GoDaddy handles new DNS record values automatically adds your domain, resulting in a CNAME entry with too much information and a failure when trying to complete Link Branding. An example of this would be **url1234.yourdomain.com.yourdomain.com.**\n\nBelow is an example of the CNAME values under the HOST column as they are displayed in step 5 and how you will need to enter into your GoDaddy DNS Management:\n\nHOST/NAME **url1234.yourdomain.com** ENTER CNAME RECORD HOST/NAME AS: **url1234**\nHOST/NAME **1234567.yourdomain.com** ENTER CNAME RECORD HOST/NAME AS: **1234567**\n\nEntries made in the VALUE or POINTS TO field do not need to be changed.\n\n</call-out>\n\n<call-out>\n  \nWhen configuring CNAME records in CloudFlare, check the bottom of the DNS settings page and make sure \"CNAME Flattening\" is set to \"Flatten CNAME at root\".\n\n</call-out>\n\nNow links and images in your emails are from your custom domain. You only need to update your link branding if you want to update the domain that appears in the links in your email.\n\nIt can take up to 48 hours for the records to verify after you upload them into your DNS host, so you will likely have to come back later to verify.\n\n### Verifying your DNS\n\nOnce you add the CNAME records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/sender_auth) and click **Verify**.\n\n<call-out>\n\nIf you click verify, and only half of your CNAME records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/).\n\n</call-out>\n\nAny time that you send an email with image or links that match the branded link, SendGrid applies that link to your email. You only need to update your link branding if you want to update the links used in your emails.\n\n## Advanced settings\n\n### Using a custom subdomain for links\n\n_To customize your subdomain:_\n\nWhen you are in the process of branding a link, and on the screen where you input domain settings, open the advanced settings, select **Custom subdomain for links** and input letters or numbers to build a custom domain. If you don't select these, SendGrid automatically selects them for you. Make sure the characters you select are different from what SendGrid assigned you initially.\n\n### Assigning a subuser\n\nBy assigning an authenticated domain to one of your subusers, you can give them the benefit of improved authentication and security, but also separate from the sending reputation of your parent account. If you assign a subusers domain, they can't edit or delete it.\n\n_To assign an authenticated domain to a subuser:_\n\nWhen you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Assign to a subuser**, and select a subuser to assign to that domain.\n\n## Migrating from legacy Whitelabel\n\nIf you authenticated a domain (whitelabel) before 2015, your domain will still work. However, if you need to change or update it, you need to delete it and recreate it as an authenticated domain in our new system. If you do set up a new branded link, make sure to keep the same subdomain for domain authentication, but then use a different one for link branding.\n\nIf you set up a whitelabel after 2015, it has been automatically migrated to our new sender authentication system.\n\n## Additional resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n- [Troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/how-to-set-up-reverse-dns.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: How to set up reverse DNS\ngroup: sender-authentication\nnavigation:\n  show: true\nseo:\n  title: How to set up reverse DNS\n  override: true\n  description: Set up reverse DNS to improve your deliverability and security of your emails.\n  keywords: reverse DNS, rDNS \n---\n\n<!-- OUTDATED REVERSE DNS VIDEO --!>\n<!-- <iframe src=\"https://player.vimeo.com/video/265831363\" width=\"500\" height=\"281\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> -->\n\n<call-out>\n\nYou can only set up reverse DNS if you have a [dedicated IP]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/).\n\n</call-out>\n\n## \tWhat is reverse DNS?\n\nSetting up reverse DNS on an IP address allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. When you update your DNS provider with a DNS record provided by SendGrid, and then send mail over your IP, the recipient's email service provider performs a reverse DNS lookup (rDNS) using an A Record (address record). An A Record maps your domain to your IP address. When a mailbox provider looks up your A Record, they see your SendGrid IP address. When they look at your IP address, they see the rDNS that matches your A Record. This circular checking proves your SendGrid IP association with your domain and your domain association with your SendGrid IP.\n\n## \tKey terminology\n\n ### \tIP Address\n\nAn Internet Protocol (IP) Address is a unique numerical address that defines an internet location. These addresses have 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. At SendGrid, you can be on a shared IP address, or you can have a dedicated IP address. We recommend a dedicated IP address for people sending high volumes of email or for people who want control over the quality of mail sent on the same IP as theirs. The aggregate performance of all the senders who use the IP determines its reputation.\n\n ### \tDNS\n\nDNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/glossary/dns/).\n\n ### \tA Record\n\nThe A Record (address record) links your dedicated IP address to your chosen domain. It does this by mapping your domain to your IP address through records that you export from SendGrid and upload into your DNS host.\n\nIf your domain+subdomain is `marketing.example.com`, and your dedicated IP address is `101.10.10.101`, setting up the SendGrid A Record links your domain with your dedicated IP address - so anything sent over your domain associates with your dedicated IP, and anything sent over your dedicated IP associates with your domain.\n\n ### \tSubdomain\n\nA subdomain is a prefix appended to your domain and used for tracking and reporting on your validated IP. Your subdomain cannot be the same as your other IP subdomains. It's a good idea to check your current DNS settings with your DNS provider to confirm that the subdomain you would like to use is available. Try to pick a name for this subdomain that represents the type of email you will send using it. For example, \"marketing\" or \"billing\". Do not use underscores in your subdomain. We create your DNS records based on the subdomain, and DNS providers do not accept DNS records that contain underscores.\n\n<call-out type=\"warning\">\n\n Your sending reputation is determined by the reputation of your root, or top-level, domain. This is true even if you have several different subdomains with the same authenticate domain. For example, both `billing.example.com` and `marketing.example.com` will share the reputation of `example.com`.\n\n</call-out>\n\n\n ### \tBefore you begin\n\nTo set up reverse DNS, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up reverse DNS.\n\n*To set up and verify reverse DNS:*\n\n1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/sender_auth).\n2. In the reverse DNS section, click **Get Started**.\n3. Next, select the IP to set up reverse DNS.\n4. Add a subdomain. For more information about picking a subdomain, see [Subdomains](#subdomain).\n5. Select or enter a domain you want to associate with the IP. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field! Your domain needs to match the domain of your from address on the emails you are sending out. For example, if I am setting up the domain `example.sendgrid.com`, I would set my domain to be `sendgrid.com`. Click **Save** and then **Confirm**. An individual IP address can only have one reverse DNS set up.\n6. Next, you need to add all of the A Records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your A Records to some popular DNS service providers, check out these [videos]({{root_url}}/ui/account-and-settings/dns-providers/).\n\n<call-out>\n\nA recent change with how GoDaddy handles new DNS record values automatically adds your domain, resulting in an A record with too much information and a failure when trying to complete reverse DNS.  An example of this would be **o1.test.yourdomain.yourdomain.com**.\n\nBelow is an example of the A record values under the HOST column as they are displayed in step 6 and how you will need to enter into your GoDaddy DNS Management:\n\nHOST/NAME:  **01.test.yourdomain.yourdomain.com**  ENTER A RECORD HOST/NAME AS:  **O1.test**\n\nEntries made to the VALUE or POINTS TO field to not need to be changed.\n\n</call-out>\n\n<call-out>\n\nIf you plan to send from multiple domains, you should set up reverse DNS for at least one IP address per domain.\n\n</call-out>\n\nIt can take up to 48 hours for the records to verify after you upload them to your DNS host, so you will likely have to come back later to verify.\n\n ### \tVerifying\n\nOnce you add the A Records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/sender_auth) and click **Verify**.\n\n<call-out>\n\nIf you click verify, and only half of your A name records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/).\n\n</call-out>\n\nNow your dedicated sending IP is associated with your domain. You only need to update your reverse DNS if you add additional dedicated IPs to your account.\n\n## \tReverse DNS for a subuser\n\nOnly a parent account can set up reverse DNS for an IP address. For a subuser account to have an IP that has reverse DNS set up, the parent account needs to buy the IP, set up reverse DNS and then [assign the IP to the subuser]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/#assigning-a-dedicated-ip-address-to-a-subuser).\n\n## \tWhat do I do if I have more than 10 IPs?\n\nThere is a character limit in SPF (sender policy framework) records that means that if you have more than 10 IP addresses, they will not fit in the record. When this is true, we will provide you with the generic SendGrid SPF record which includes all IPs at SendGrid, not just yours. If you would like to secure your SPF record only to include your IPs, you can chain multiple SPF records together manually. For more information see Open SPF’s [website](http://www.open-spf.org/).\n\n## \tAdditional resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [Troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/inbound-parse.md",
    "content": "---\nseo:\n  title: Inbound Parse Webhook\n  description: Manage your Inbound parse settings\n  keywords: inbound parse, inbound parse webhook, parse settings, inbound parse settings\ntitle: Inbound Parse\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid’s Inbound Parse Webhook allows you to receive emails that get automatically broken apart by SendGrid and then sent to a URL of your choosing. SendGrid will grab the content, attachments, and the headers from any email it receives for your specified hostname. Please see our [Inbound Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) technical docs for more information about how to handle the information coming to you from SendGrid’s Inbound Parse.\n\n## \tManage inbound parse\n\nYou can see all of your hostname and URL pairs that you have set up in the table on the main [Inbound Parse page](https://app.sendgrid.com/settings/parse). From there, you can use the gear icon on the right side of each pair to remove and edit the Inbound Parse Webhook settings.\n\n## \tAdd host and URL\n\nThe Inbound Parse Webhook requires a hostname, where the emails will be sent, and the URL where SendGrid will POST the data it builds from every incoming email.\n\n**Host Name** - The domain where you have pointed an MX Record so addresses at this hostname can receive email. For example: parse.yourdomain.com.\n\nWhen entering your host name (also referred to as the receiving domain), the subdomain-domain combination must be globally unique, and the domain must be one of your authenticated domains.\n\n**URL** - The URL for the Inbound Parse Webhook to POST all parsed email information.\n\n**Spam Check** - Inbound Parse will check incoming emails for spam, then assign them a spam score and report. This will be reflected under `spam_score` and `spam_report` in your Parse Webhook post. The user can then determine how this score is interpreted and the severity.\n\n**Send Raw** - Select this option if you would prefer to receive the full MIME message.\n\n## \tUsing the API\n\nIf you're interested in how to use the Inbound Parse Webhook, please check out our [Inbound Parse Webhook API](https://sendgrid.api-docs.io/v3.0/settings-inbound-parse/).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/ip-access-management.md",
    "content": "---\nseo:\n  title: IP Access Management\n  description: Control which IPs have access to your SendGrid account.\n  keywords: mail settings, access management, IP allow listing, security\ntitle: IP Access Management\nweight: 0\ngroup: ip-management\nlayout: page\nnavigation:\n  show: true\n---\n\n<iframe src=\"https://player.vimeo.com/video/298041979\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n## What is IP access management?\n\n[IP Access Management](https://app.sendgrid.com/settings/access) is a security feature that allows you to control who can access your SendGrid account based on their [IP address]({{root_url}}/glossary/ip-address/). After you allow an IP address, you can only access the SendGrid UI, API, and SMTP relay if you are connecting from an allowed IP address. Any access attempts from other IPs will be blocked. This is a powerful security tool that you can use to help prevent malicious activity on your account.\n\n<call-out>\n\nThere is no limit on how many IP addresses you can allow.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nIt is possible to remove your own IP address from your list of allowed addresses, thus blocking your own access to your account. While we are able to restore your access, we do require thorough proof of your identify and ownership of your account. We take the security of your account very seriously, and wish to prevent any \"bad actors\" from maliciously gaining access to your account.\n\nYour current IP is clearly displayed to help prevent you from accidentally removing it from the allowed addresses.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nIf you do not access SendGrid via a static IP address (for example, via VPN or from a business internet service), setting up IP Access Management may result in being locked out of your SendGrid account. If you do discover that you have locked yourself out of your account, please contact [SendGrid Support](https://support.sendgrid.com/hc/en-us/requests/new#ipam-lockout).\n\n</call-out>\n\n## Allowing an IP Address\n\nThere are several different ways to allow an IP address. If you navigate to the IP Access Management page under Settings, you will see a list of any currently allowed IP addresses and a list of IPs that recently attempted to access your account.\n\n![]({{root_url}}/images/ip_access_management.png)\n\n### Recent Access Attempts\n\nUnder Recently Accessed 20 IPs, you will see a list of recent IPs that attempted to connect to your account, regardless of whether or not they are allowed addresses. You will also see some additional information about those IPs, such as the date of the first and most recent access attempt, the physical location of the IP, and the method by which they attempted to access your account.\n\nYou can allow one of these IPs by clicking the gear icon in the row of the IP you would like to allow, then clicking **Add To Allowed List** .\n\n![]({{root_url}}/img/add_ip_from_recent_access_attempts.png)\n\n### Adding IP Addresses Manually\n\nTo manually allow one or more IP addresses, click **+ Add IP Addresses**.\n\n![]({{root_url}}/images/add_ip_address_button.png)\n\nYou can add recently accessed IPs by clicking **Add to Form Below** next to the IP you wish to save, or you can enter a single IP address or range of IP Addresses in the field at the bottom of the modal and then click **Save**.\n\n![]({{root_url}}/images/ip_access_management_add_ip.png)\n\nIt is possible for advanced users to use CIDR notation to allow a range of IP addresses. To do so, simply enter your routing prefix followed by a `/` and then the number of bits in your routing mask. For example: `192.168.100.14/24`.\n\n<call-out type=\"warning\">\n\nExplaining CIDR notation is beyond the scope of this article, and we only recommend that advanced users use this notation when allowing IPs. If you are unfamiliar with CIDR notation, we recommend that you enter each IP individually when allowing a range of IPs.\n\n</call-out>\n\nTo enter a range of IP addresses using a “wildcard”, simply add an asterisk to the end of the IP. For example, `25.203.44.*` would include all IPs that begin with `25.203.44`.\n\nAfter entering the IP addresses you would like to allow, click Save.\n\n<call-out>\n\nIf you remove every IP address from your list of allowed addresses, you will again be able to log in to your account from any IP address.\n\n</call-out>\n\nFor additional information about using IP Access Management through our API, see our [API Reference](https://sendgrid.api-docs.io/v3.0/ip-access-management).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/ip-pools.md",
    "content": "---\nseo:\n  title: IP Pools\n  description: Using IP Pools to manage your sender reputation\n  keywords: IP, IP address, deliverability\ntitle: IP Pools\nweight: 0\ngroup: ip-management\nlayout: page\nnavigation:\n  show: true\n---\n\nIP Pools allow you to group your dedicated Twilio SendGrid IP addresses together in order to have more control over your deliverability, and as a result, your sender reputation. For example, you might have separate pools for both transactional and marketing email. \n\n<call-out>\n\nDedicated IP addresses are available with Pro and Premier Email API accounts as well as Advanced Marketing Campaigns accounts. Click [here](https://sendgrid.com/pricing/)for more information.\n\n</call-out>\n\n## Create an IP Pool\n\n**Before you get started**\n\nIn order to create an IP pool, your dedicated IPs must have [reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/) set up. You also need to check to see if the IP is active before setting up an IP Pool.\n\n*To activate an IP in your account*:\n\n1. Log into your SendGrid account.  \n1. Navigate to **Settings** and then select **IP Addresses**.  \n1. Find the ip address you want to activate and then click **Edit**.  \n1. Check \"Allow my account to send mail using this IP address\"\n1. Then click **Save**.\n\n*To create an IP Pool:*\n\n1. Navigate to **Settings** and then click **IP Addresses**. \n1. Select **IP Pools**. \n1. Click **Create an IP Pool**. \n1. Enter an *IP Pool Name* and select the IP addresses you want to add to the pool.\n1. Click **Create**. \n\n\n<call-out>\n\nFor information on creating and managing IP pools using the API, see our [documentation](https://sendgrid.api-docs.io/v3.0/ip-pools).\n\n</call-out>\n\n## Edit an IP Pool\n\n*To edit an IP Pool:*\n\n1. Navigate to **Settings** and then click **IP Addresses**. \n1. Select **IP Pools**. \n1. Find the IP Pool you wish to delete and select the action menu.\n1. Click **Edit**. \n1. From here, you can edit the name of the IP pool as well as select or deselect IP addresses associated with the pool.\n1. When you have finished making all changes to the IP pool, click **Save**.\n\n## Delete an IP Pool\n\n*To delete an IP Pool:*\n\n1. Navigate to **Settings** and then click **IP Addresses**. \n1. Select **IP Pools**. \n1. Find the IP Pool you wish to delete and select the action menu.\n1. Click **Delete**. \n1. A modal appears asking if you are sure you want to delete the selected IP Pool. Confirm, and then click **Delete**. \n\n<call-out>\n\nIf you would like to create and manage IP Pools using the API, see our [API Reference](https://sendgrid.api-docs.io/v3.0/ip-pools/create-an-ip-pool).\n\n</call-out>\n\n## Additional Resources\n\n- [Dedicated IP addresses]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/)\n- [Warming up a dedicated IP]({{root_url}}/ui/sending-email/warming-up-an-ip-address/)\n- [IP Access Management]({{root_url}}/ui/account-and-settings/ip-access-management/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/log-in-issues.md",
    "content": "---\nseo:\n  title: Troubleshooting account login issues\n  description: Troubleshooting account login issues\n  keywords: password, log, can't, authentication, username, reset, get, failed, user, invalid, account, deactivated, banned, in, terminated, bad username/password, name, won't, 535, 535 Authentication failed&#58; Bad username / password, login, access, denied\ntitle: Troubleshooting account login issues\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 204192663\nnavigation:\n  show: true\n---\n\nThere are a number of reasons why you may find yourself unable to log into your account. This article aims to explain these reasons as well as offer steps to get you back in action.\n\n## Invalid username and/or password\nUsually this is as simple a retyping one or both fields (you're only human after all), but could be something else. Check out to following for some possible reasons.\n\n## You haven't confirmed your email address\nDid you just sign up? If you don't verify your email address we never create your account, so be sure to check your registration email and click on the link we send!\n\n## Check with other users\nYou may have at some point shared your credentials with someone else/another department, check with them to make sure they haven't changed anything. Also consider implementing [Teammates]({{root_url}}/ui/account-and-settings/teammates/) to set different levels of permissions.\n\n\n## Reset your password\nSometimes passwords just vanish from memory, it happens to the best of us. Use the reset password link from the login screen to start the reset process via email. **_Be careful_** though, changing your password can break existing API and SMTP integrations you have in production, so be sure to update your password wherever else it is used after resetting.\n\n## Usernames can be anything\nWe don't have a strict username syntax policy, so it may be something you wouldn't normally use. Read more about finding and recovering your username [here]({{root_url}}/ui/account-and-settings/resetting-your-username-and-password/).\n\n\n## Bad username/password\nUsually received via the API, this error means we don't recognize one or both of the **api\\_user** and **api\\_key** parameters that you've passed in your call.\n\n\n## Billing terminated\nOn the last week of each month, we terminate accounts with outstanding unpaid balances from the previous month's bill run. _Terminated accounts cannot be accessed nor send mail._\n\nWe will send out several warning emails in the course of a month if an account fails to pay on time, so you should have ample warning before Termination. However, if you believe your account has been terminated due to non-payment, please get in touch with [Support](https://support.sendgrid.com) and we can help get you out of the red and sending again.\n\n## Account banned\nWhen an account is banned, it is permanently canceled. Access to the account is blocked and no further requests to our system will be accepted. A banned account is not allowed back on SendGrid in the future. If the account had dedicated IPs they will be removed. Related sub-users will also be banned.\n\nWe don't make a habit of letting banned accounts back on, but if you would like to discuss it, _please respond to the email you received regarding the ban._\n\n<call-out type=\"alert\">\n\nSupport cannot assist in reactivation of banned accounts.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/mail.md",
    "content": "---\nseo:\n  title: Mail Settings\n  description: Manage your SendGrid mail settings\n  keywords: sendgrid mail settings, email settings, sending settings\ntitle: Mail Settings\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nMail Settings allow you to tell SendGrid specific things to do to every email that you send to your recipients over SendGrid’s [Web API]({{root_url}}/api-reference/) or [SMTP Relay]({{root_url}}/glossary/smtp-relay/).\n\n## Address Allow List\n\nThe Address Allow List setting allows a specified email address or domain for which mail should never be suppressed. For example, you own the domain “example.com,” and one or more of your recipients use email@example.com addresses, by placing example.com in the Address Allow List setting, all bounces, blocks, and unsubscribes logged for that domain will be ignored and sent as if under normal sending conditions.\n\n**Settings**\n\n- Status - On or Off\n\n- Emails/Domains - Either a single email or the domain, for which all emails belonging to this domain will be allowed.\n\n## BCC\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nAutomatically sends a blind carbon copy (BCC) to an address for every email sent without adding that address to the header. Please note that only one email address may be entered in this field, if you wish to distribute BCCs to multiple addresses you will need to create a distribution group or use forwarding rules.\n\n<call-out type=\"warning\">\n\nWith this setting turned on, you will be charged an extra email for every email you send.\n\n</call-out>\n\n**Settings**\n\n- Status - On or Off\n\n- Email to BCC To - Click **Edit** to add an email address to which all emails you send will be BCCd.\n\n## Bounce Purge\n\nAllows you to set a schedule for SendGrid to automatically delete contacts from your soft and hard bounce suppression lists.\n\n**Settings**\n\n- Status - On or Off\n\n- Soft Bounces - The number of days soft bounces will be kept in your soft bounces suppression lists. Any soft bounces older than this value will be purged (Min: 1, Max: 3650).\n\n- Hard Bounces - The number of days hard bounces will be kept in your hard bounces suppression lists. Any hard bounces older than this value will be purged (Min: 1, Max: 3650).\n\nPlease Note: Entering values for both Soft and Hard Bounces is not necessary. Only enter a value for the types of bounces you would like purged; empty values will be ignored.\n\n## Event Notification\n\nThe Event Notification setting controls webhook notifications for events, such as bounces, clicks, opens, and more. This setting allows these events to be POSTed to a URL of your choosing.\n\nPlease see our technical [Event Webhook API docs](https://sendgrid.api-docs.io/v3.0/webhooks) for more information about Event Webhook.\n\n**Settings**\n\n- Status - On or Off\n\n- HTTP Post URL - The URL you would like us to send all event notifications.\n\n- Select Actions - Check the boxes for which events you would like sent to your webhook endpoint.\n\n### Other features\n\n**Test Your Integration** - Once you have a valid URL entered, this button will be made active. When you click the button, we will attempt to send a test post to your webhook code. If we see any issues, we will notify you in a warning message at the top of your browser.\n\n## Footer\n\nThe Footer setting will insert a custom footer at the bottom of the text and HTML bodies. Use the embedded HTML editor and plain text entry fields to create the content of the footers to be inserted into your emails.\n\n<call-out>\n\nThis feature is not available in our Marketing Campaign Editor.\n\n</call-out>\n\n**Settings**\n\n- Status - On or Off\n\n- Footer - HTML Body: Click “Edit” to add your custom footer content.\n\n## Forward Bounce\n\nActivating this setting allows you to specify an email address to which bounce reports are forwarded. Insert the email address to which you would like to receive these bounce reports.\n\n<call-out>\n\nYou will not be charged an email when these reports are forwarded to you.\n\n</call-out>\n\n**Settings**\n\n- Status - On or Off\n\n- Email - Click “Edit” to add an email address where you’d like bounce emails to be forwarded.\n\n## Forward Spam\n\nActivating this setting allows you to specify an email address to which spam reports are forwarded. Insert the email address to which you would like to receive spam reports.\n\n<call-out>\n\nYou will not be charged an email when these reports are forwarded to you.\n\n</call-out>\n\n### Forwarding abuse\n\nThe email address specified in the Forward Spam mail setting may also be used to receive emails sent to abuse@ and postmaster@ role addresses if you have [authenticated your domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).\n\nFor example, if you create a valid authenticated domain with a custom return path of `sub` and a root domain `example` _and_ have turned on Forward Spam, any emails sent to abuse@sub.example.com or postmaster@sub.example.com will be forwarded to the email address you entered in the Forward Spam mail setting.\n\n**Settings**\n\n- Status - On or Off\n\n- Email - Click “Edit” to add an email address where you’d like spam to be forwarded.\n\n## Legacy Email Template\n\n<call-out type=\"warning\">\n\nThis setting refers to our original Email Templates. We now support more full featured [transactional templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/), with support for multiple templates, versioning, and more.\n\n</call-out>\n\nThis setting wraps an HTML template around your email content. This can be useful for sending out marketing email and/or other HTML formatted messages. Use the embedded, full-featured HTML editor to create a template that your emails will be wrapped in. Be sure to include a tag to place the content of your email.\n\n**Settings**\n\n- Status - On or Off\n\n- Template - Click **Edit** to define your HTML template within the WYSIWYG editor.\n\n## Plain Content\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nThe Plain Content setting will automatically convert any plain text emails that you send to HTML before sending (if disabled).\n\nTurn _on_ if you don't want to convert your plain text email to HTML.\n\n<call-out>\n\nLarge plain text files are sometimes unable to be converted to HTML. Instead, SendGrid will send only the plain text version. If HTML versions are essential, it is best practice to include the HTML portion of the email within your email requests. When SendGrid is unable to convert from plaintext to HTML, an alert is sent to the From address.\n\n</call-out>\n\n**Settings**\n\n- Status - On or Off\n\n## Spam Checker\n\n<call-out type=\"warning\">\n\nDue to low usage, this setting has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nThe Spam Checker setting, is useful when your web application allows your end users to create content that is then emailed through your SendGrid account. Since emailing user generated content is hard to monitor and can often be abused by spammers, the Spam Checker filter notifies you when emails are detected that exceed a predefined spam threshold.\n\n<call-out type=\"warning\">\n\nThe default threshold is 5.0 and can range between 1 and 10. The lower the number, the more strict the filtering. For example, a value of 2 will drop all but the most flawless emails, whereas 9 will only drop the spammiest of spam emails.\n\n</call-out>\n\nWe use [SpamAssassin](http://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Conf.html#scoring_options) to process the spam checks for this filter. The default threshold is 5.0, but you can set this to any value between 1 and 10. You must provide a URL, so we will post the message to that URL. If a message is flagged as spam using this filter, it will automatically be dropped by our system and will not be delivered to the recipient.\n\n**Settings**\n\n- Status - On or Off\n\n- Spam Threshold - Click **Edit** to change the threshold from 1-10 (**see the message above**)\n\n- URL To Post Spam Messages To - Click **Edit** to provide an Inbound Parse URL to send spam messages to, so you can inspect them. If you don't have an Inbound Parse URL, check out [Setting Up The Inbound Parse Webhook]({{root_url}}/for-developers/parsing-email/inbound-email/).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/notifications.md",
    "content": "---\nlayout: page\nweight: 90\ngroup: account-management\ntitle: Notifications\nnavigation:\n  show: true\nseo:\n  title: Notifications\n  override: true\n  description:\n---\n\nIf you would like to have notifications sent to an email other than your parent account address, you can opt in to receive email notifications from SendGrid about your account's Marketing Campaigns activity.\n\n*To add an email address to new Marketing Campaigns:*\n\n1. Navigate to new Marketing Campaigns and then click **Notifications**. \n1. Click **Add New Email**.\n1. Enter the name of the person or account you are setting up the notification for.\n1. Enter the email address of the person or account you are setting up the notification for.\n1. Click **Save**.\n\n*To add an email address to legacy Marketing Campaigns:*\n\n1. Navigate to legacy Marketing Campaigns and then click **Notifications**.\n1. Click **Add New Email**.\n1. Enter the name of the person or account you are setting up the notification for.\n1. Enter the email address of the person or account you are setting up the notification for.\n1. Click **Save**.\n\n<call-out>\n\nEmail notifications about CSV upload summaries, sender verifications, A/B test winner notifications, and list/segment exports can be sent to up to 10 different email addresses.\n\n</call-out>\n\n ## \tAdditional Resources\n\n- [Contacts]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/partners.md",
    "content": "---\nseo:\n  title: Partner Settings\n  description: Manage your SendGrid partner settings\n  keywords: sendgrid partner settings, partner settings, 3rd party settings\ntitle: Partners\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nPartner settings allow you to integrate your SendGrid account with our partners to increase your SendGrid experience and functionality.\n\n## \tSendGrid For New Relic\n\nAccess your email statistics via the [New Relic Dashboard](http://newrelic.com/). In less than 5 minutes your statistics should be sent to your New Relic Dashboard. We send statistics to New Relic every 5 minutes for users with the setting enabled. For more information, please see our [Setting up SendGrid for New Relic page]({{root_url}}/ui/analytics-and-reporting/tracking-stats-using-new-relic/).\n\n **Settings**\n\n* Status - On or Off\n\n* New Relic License Key - The license key provided with your New Relic account.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-appdirect.md",
    "content": "---\nseo:\n  title: How to change password when integrated via AppDirect\n  description: How to change password when integrated via AppDirect\n  keywords: password, appdirect\ntitle: How to change password when integrated via AppDirect\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205005058\nnavigation:\n  show: true\n---\n\nIf your SendGrid account is integrated via AppDirect the process for changing your password is slightly different . Rather than updating them via the **Account Settings**  you can update your credentials by going to **Manage Apps** > **SendGrid** > **Settings**  via the AppDirect UI."
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-azure.md",
    "content": "---\nseo:\n  title: How to change the password for your SendGrid add-on via Azure\n  description: How to change the password for your SendGrid add-on via Azure\n  keywords: password, azure, microsoft, change\ntitle: How to change the password for your SendGrid add-on via Azure\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205027298\nnavigation:\n  show: true\n---\n\n\nPlease note that in order to maintain seamless email flow, it is important to also update any custom code, web pages or servers that use this account with your new passwords. If you are uncertain about these additional steps, consult the email administrator who created the account.\n\nYou should also make sure you are logged out of SendGrid.com before making any changes to your password via the Azure portal.\n\n1. Log into your Azure subscription at portal.azure.com and find your SendGrid deployment:\n\n    ![]({{root_url}}/images/AzurePW1.png)\n\n1. Select **Change Password**, then enter and re-confirm your new password. Remember to save your new password in order for it to take effect. Your new password must be a minimum of 8 alpha-numeric characters.\n\n    ![]({{root_url}}/images/AzurePW2.png)\n\n1. If you do not know your current password then click “Reset Password” instead. \n\n    ![]({{root_url}}/images/AzurePW3.png)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-email.md",
    "content": "---\n\nseo:\n  title: I didn't receive the password reset email\n  description: Initiate a password reset and haven't received it? \n  keywords: password, reset, email, account, bad username/password, login\ntitle: I didn't receive the password reset email\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nThere are a few things to take into account when requesting a password reset:\n\n* Make sure you are entering your username and not your email address in the password reset screen.\n\n* Ensure that you are expecting the email at the correct address. The password reset will be sent to email you have in your SendGrid account settings for the username you enter. \n\n* It is also possible that you cannot login because our billing team has terminated your account due to non-payment. In this case you would have received several emails detailing the reason behind the termination. These emails are also going to the email you have in your SendGrid account settings. \n\n* The reset email may be in your SPAM or Junk folder. If you do find it there, be sure to mark it as \"not spam\".\n\n\n**For security reasons, SendGrid support agents cannot change account passwords.**\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-ibm-cloud-marketplace.md",
    "content": "---\nseo:\n  title: How to change the password for your SendGrid add-on via the IBM Cloud Marketplace\n  description: How to change the password for your SendGrid add-on via the IBM Cloud Marketplace\n  keywords: password, icloud, ibm, marketplace\ntitle: How to change the password for your SendGrid add-on via the IBM Cloud Marketplace\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205306378\nnavigation:\n  show: true\n---\n\nAs an IBM Cloud Marketplace user you can change the password for your SendGrid account by following a few simple steps. From the Cloud Marketplace go to  **Services > SendGrid > Settings.** From there you should see the following:\n\n![]({{root_url}}/images/ibmcld.png)\n\nAfter entering the new password and confirming it, click **Save**.\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-openshift.md",
    "content": "---\nseo:\n  title: How to change the password for your SendGrid add-on via OpenShift\n  description: How to change the password for your SendGrid add-on via OpenShift\n  keywords: \ntitle: How to change the password for your SendGrid add-on via OpenShift\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205102558\nnavigation:\n  show: true\n---\n\nAfter a user logs in they will arrive at Purchased Products where it will list their products. From here they will need to find the SendGrid app. Below is a step by step screenshot of how to locate the password section so that they can update their credentials.\n\nFrom the Purchased Products section select **SendGrid** on the left hand side of the application block.\n\n![]({{root_url}}/images/openshiftshot1.png)\n\nAfter selecting the link you’ll be in the Manage Product page specific to SendGrid:\n\n![]({{root_url}}/images/openshiftedit3.png)\n\nFrom here you can select the **settings** tab which will display the below information. From here, you can reset your password for SendGrid. Please keep in mind this is for the parent access and not subuser access that may have been added via the SendGrid UI.\n\n \n\n \n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/password-reset-softlayer.md",
    "content": "---\nseo:\n  title: How to change the password for your SendGrid account via SoftLayer\n  description: How to change the password for your SendGrid account via SoftLayer\n  keywords: password, softlayer\ntitle: How to change the password for your SendGrid account via SoftLayer\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205325008\nnavigation:\n  show: true\n---\n\nIf you have a SendGrid account via Softlayer you can use the following steps to change your account password. From the Softlayer UI navigate to the  **Services** drop down and select  **Mail Delivery**. From there click **Actions** and select **Update contact information**. Enter a new password, re-enter to confirm it and you're done!\n\n \n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/pci-compliant.md",
    "content": "---\nseo:\n  title: Is SendGrid PCI compliant?\n  description: Is SendGrid PCI compliant?\n  keywords: credit, card, pci, dss, compliant\ntitle: Is SendGrid PCI compliant?\nweight: 0\ngroup: account-management\nlayout: page\nzendesk_id: 205104628\nnavigation:\n  show: true\n---\n\n **Yes!** We do not store your credit card information anywhere in our systems. \n\nWe can provide a PCI-DSS certificate upon request.\n\n \n\n \n"
  },
  {
    "path": "content/docs/ui/account-and-settings/reading-your-invoice.md",
    "content": "---\nseo:\n  title: Reading your invoice\n  description: Reading your invoice\n  keywords: invoice, bill, receipt, refund, line, item, marketing, campaigns, charge, contacts, usage, overage\ntitle: Reading your invoice\nweight: 0\ngroup: billing\nlayout: page\nnavigation:\n  show: true\n---\n\nYour Twilio SendGrid invoice contains a lot of information which may be difficult to understand. To see your invoice, check your email or visit the Plan & Billing tab on your [Account details](https://app.sendgrid.com/account/billing) page. Here's information on how to read your invoice:\n\n![A screenshot of an example invoice]({{root_url}}/img/invoice-legend.png)\n\n## 1. Physical Address\n\n**The physical address of your business.** This address is the same address you entered when you first signed up. If you would like to update the address as it appears on your invoices, edit your company info on the [Account details](https://app.sendgrid.com/account/billing) page. If you need to change the address on an existing invoice, please send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com).\n\n## 2. Billing Email\n\n**The email address where you receive Twilio SendGrid statements**. By default, this is the primary email address on file in your account.\n\nNeed to send invoices to multiple addresses? Consider creating a role address on your side that includes all of the billing stakeholders in your organization, or send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com).\n\n## 3. Charge Summary\n\nThe Charge Summary section breaks down your invoice total into individual charges. Some charges covered by this invoice are retroactive, meaning you are paying for usage in the previous month, while others are proactive, meaning you are paying for services for the upcoming month. This information is broken down in the **Service Period** column.\n\n### API Plan\n\n![Charge summary section]({{root_url}}/img/invoice-plan.png)\n\nThis is the **plan you subscribe to**. In this case, the user is on an API Pro 100K plan and will pay $89.95 to use it for the month of February.\n\n### Marketing Campaigns Plan\n\n![Charge summary section]({{root_url}}/img/invoice-marketing-plan.png)\n\nThis is the **Marketing Campaigns plan you subscribe to**. In this case, the user is on a Marketing Campaigns Basic 5K plan, and will pay $15.65 to use it for the month of February.\n\n### IP Address\n\n![Additional IP address section]({{root_url}}/img/invoice-IP-address.png)\n\nThis charge indicates that you have an **additional Dedicated IP Address** allocated to your account. If you have more than one IP address the total cost will be listed on this line.\n\nIP addresses cost $30.00/mo each and are available on Pro API and Advanced Marketing Campaigns plans and above.\n\nFor more information on Twilio SendGrid Plans, visit our [pricing page](https://sendgrid.com/pricing).\n\n### Contact List Storage\n\n![Contact storage section]({{root_url}}/img/invoice-contact-1.png)\n\nThis item is the charge for the highest number of **contacts stored in Marketing Campaigns during the previous month**.\n\nRefer to \"Contact List Usage\" in the Usage Summary section below for more information on how this charge is calculated.\n\n### Email Activity History\n\n![Email activity section]({{root_url}}/img/invoice-ease.png)\n\nThis charge is for access to the **Email Activity Feed API** as well as **30 days worth of Email Activity History** in the app. These 2 features are sold as a package and cannot be added individually.\n\nThe price for access to this feature varies per plan. For more information on pricing for Email Activity History, visit our [pricing page](https://sendgrid.com/pricing).\n\n### Tax\n\n![Tax summary section]({{root_url}}/img/invoice-tax.png)\n\nIf you are in [a jurisdiction where Twilio SendGrid is required to charge sales tax]({{root_url}}/ui/account-and-settings/taxes-and-tax-exempt/), your **tax charges** will appear here.\n\n## 4. Usage Summary\n\nThe Usage Summary section outlines usage-based charges on your account **during the previous month**.\n\n### Plan Overage\n\n![Overage charges section]({{root_url}}/img/invoice-overage.png)\n\nThis item is a calculation of **any emails sent beyond the monthly limit** of your package **during the previous month**.\n\nIn this example, the Pro 100K plan allows for 100,00 emails to be sent per month. We see that in the previous month, 160,000 emails were sent for a total of 60,000 emails over the limit. The overage rate for the Pro 100K plan is $0.001 per extra email, which works out to a $60.00 overage charge (60,000 x .001 = 60).\n\n### Contact List Usage\n\n![Highest number of stored Marketing Campaigns Contacts in the previous month.]({{root_url}}/img/invoice-contact-storage.png)\n\nThis item refers to the highest number of **stored Marketing Campaigns Contacts in the previous month**. For more detailed breakdown on how Contact Storage billing works in Marketing Campaigns, [click here]({{root_url}}/ui/account-and-settings/billing/).\n\nIn this example, the number under the \"Used\" column refers to the number of \"blocks\" of 10,000 contacts that were stored in the previous month. We see that the highest number of blocks stored in that month was 1, or 10,000 contacts.\n\nThe charge for contact storage is **$10.00/mo for every 10,000 contacts (1 block)**, so this example works out to a $10.00 usage charge for contacts stored in the previous month.\n\n## 5. Transaction and Payment Summary\n\n![Transaction and payment summary]({{root_url}}/img/invoice-payment-summary.png)\n\nThe Transaction Summary shows the total charges for the month, and the Payment Summary shows the payment type and last 4 digits of the card that was charged. To change your payment method, go to [Account details](https://app.sendgrid.com/account/billing).\n\n**These sections always reflect the plan you currently have, not necessarily \"Pro 100K\", which is shown for the purposes of demonstration**.\n\n## Additional Resources\n\n- [SendGrid Pricing](https://sendgrid.com/pricing)\n- [Billing]({{root_url}}/ui/account-and-settings/billing/)\n- [Sales Tax and Tax Exempt Status]({{root_url}}/ui/account-and-settings/taxes-and-tax-exempt/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/resetting-your-username-and-password.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Resetting your username and password\ngroup: account-management\nnavigation:\n  show: true\nseo:\n  title: Resetting your username and password\n  override: true\n  description: Steps for resetting your username and password using the SendGrid UI\n\n\n---\n\n## \tChanging your password\n\nIf you already know your password, you can change your SendGrid password by editing your [Account Details](https://app.sendgrid.com/settings/account) in the UI. If you've forgotten your password, you can reset it on the [Reset password page](https://app.sendgrid.com/forgot_password).\n\n<call-out type=\"warning\">\n\nWhen you change your account password, your SMTP and API access will change as well. Make sure you update your account information on all systems and software.\n\n</call-out>\n\n ### \tChanging your password through the SendGrid UI\n\n*To change your password through the SendGrid UI:*\n\n1. From the homepage, select the drop-down in the top left corner and then select **Account Details** or navigate to **Settings** and then click **Account Details**.\n1. Locate the *Username* and *Password* section and click **Edit**.\n1. Enter your current password and a new password in the fields and then click **Save**.\n\n ### \tResetting your password\n\nIf for some reason you cannot remember your password and cannot log in, you can still change your password.\n\n*To reset your password using the Forgot Password link:*\n\n1. Navigate to the [SendGrid login page](https://sendgrid.com/login).\n1. Click **[Forgot Password](https://sendgrid.com/user/forgotPassword)**.\n1. Enter your SendGrid username.\n\nWe will send you an email with account reactivation steps - follow these to access your account again. If you don't receive the email, you may not be entering the correct username.\n\n## \tChanging your username\n\n*To change your username:*\n\n1. From the homepage, select the drop-down in the top left corner and then select **Account Details** or navigate to **Settings** and then click   **Account Details**.\n1. Click **Edit**.\n1. Enter a new username and then click **Save**.\n\n<call-out type=\"warning\">\n\nWhen you change your account username, your SMTP and API access will change as well. Make sure you update your account information on all systems and software.\n\n</call-out>\n\n ### \tResetting your username\n\nIn the event that you forget your username, you can reset it by filling out [this form](https://support.sendgrid.com/hc/en-us/requests/new#forgot-username).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/retired-mail-settings.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Underused Mail Setting Retirement\ngroup: account-management\nnavigation:\n  show: false\nseo:\n  title: Underused Mail Setting Retirement\n  keywords:   \n  override: \n  description: This page explains the changes to Twilio SendGrid mail settings coming in Q1 2020\n---\n\nAs we continuously modernize our email delivery infrastructure, we have sunset some sparsely used features in order to improve efficiency. \n\n<table>\n  <tr>\n    <th>Mail Setting</th>\n    <th>Recommended Action</th>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">Plain Content</span> is an option within SendGrid Mail Settings that disables the automatic conversion of plain text emails to HTML.</td>\n    <td>If you would like to maintain open and click tracking, you must send HTML. Otherwise, you can continue sending plain text emails without open and click tracking.</td>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\"><a href=\"http://en.gravatar.com/\">Gravatar</a></span> third party integration.</td>\n    <td>Due to low adoption among customers we decided to sunset this feature.</td>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">Sections</span> is a form of mail merge where sections of an email content can be customized by recipient.</td>\n    <td>We recommend using Twilio SendGrid <a href=\"https://sendgrid.com/docs/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/\">transactional templates</a> with handlebars syntax through our v3 API.</td>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">BCC </span>automatically BCCs an email address for every email sent.</td>\n    <td>We recommend identifying bcc as a <a href=\"https://sendgrid.com/docs/for-developers/sending-email/personalizations/#sending-a-single-email-to-a-single-recipient-with-a-cc-and-a-bcc\">personalization</a> in each API call.</td>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">Spam Checker </span>is an option within SendGrid Mail Settings that checks outbound messages for spam content.</td>\n    <td>We recommend using  <a href=\"https://sendgrid.com/docs/ui/sending-email/email-testing/\">Email Testing</a> to maximize your deliverability.</td>\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">Drop feature</span> is a test feature that goes through the processing of mail, but just drops it without delivering in the end.</td>\n    <td>We have a <a href=\"https://sendgrid.com/docs/for-developers/sending-email/sandbox-mode/\">Sandbox Mode</a> feature which allows you to send a test email to ensure that your request body is formatted correctly without delivering the email to any of your recipients.</td> h\n  </tr>\n  <tr>\n    <td><span style=\"font-weight:bold\">Sendwithus</span> third party Integration</td>\n    <td>We recommend using Twilio SendGrid Marketing Campaigns.</td>\n  </tr>\n   <td><span style=\"font-weight:bold\">DomainKey</span> is an old feature for signing emails which has been deprecated by email industry. </td>\n<td>Users should utilize <a href=\"https://sendgrid.com/docs/glossary/dkim/\">DKIM</a> which is the new standard for signing emails. </td>\n</table>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/reverse-dns.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: How to set up reverse DNS - beta\ngroup: sender-authentication\nnavigation:\n  show: true\nseo:\n  title: How to set up reverse DNS\n  override: true\n  description: Set up reverse DNS to improve your deliverability and security of your emails.\n  keywords: reverse DNS, rDNS, sender verification\n---\n\n<!-- OUTDATED REVERSE DNS VIDEO --!>\n<!-- <iframe src=\"https://player.vimeo.com/video/265831363\" width=\"500\" height=\"281\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> -->\n\nYou can only set up reverse DNS if you have a [dedicated IP]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/).\n\n</call-out>\n\n## \tWhat is reverse DNS?\n\nSetting up reverse DNS on an IP address allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. When you update your DNS provider with a DNS record provided by SendGrid, and then send mail over your IP, the recipient's email service provider performs a reverse DNS lookup (rDNS) using an A Record (address record). An A Record maps your domain to your IP address. When a mailbox provider looks up your A Record, they see your SendGrid IP address. When they look at your IP address, they see the rDNS that matches your A Record. This circular checking proves your SendGrid IP association with your domain and your domain association with your SendGrid IP.\n\n## \tKey terminology\n\n ### \tIP Address\n\nAn Internet Protocol (IP) Address is a unique numerical address that defines an internet location. These addresses have 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. At SendGrid, you can be on a shared IP address, or you can have a dedicated IP address. We recommend a dedicated IP address for people sending high volumes of email or for people who want control over the quality of mail sent on the same IP as theirs. The aggregate performance of all the senders who use the IP determines its reputation.\n\n ### \tDNS\n\nDNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/glossary/dns/).\n\n ### \tA Record\n\nThe A Record (address record) links your dedicated IP address to your chosen domain. It does this by mapping your domain to your IP address through records that you export from SendGrid and upload into your DNS host.\n\nIf your domain+subdomain is `marketing.example.com`, and your dedicated IP address is `101.10.10.101`, setting up the SendGrid A Record links your domain with your dedicated IP address - so anything sent over your domain associates with your dedicated IP, and anything sent over your dedicated IP associates with your domain.\n\n ### \tSubdomain\n\nA subdomain is a prefix appended to your domain and used for tracking and reporting on your validated IP. Your subdomain cannot be the same as your other IP subdomains. It's a good idea to check your current DNS settings with your DNS provider to confirm that the subdomain you would like to use is available. Try to pick a name for this subdomain that represents the type of email you will send using it. For example, \"marketing\" or \"billing\". Do not use underscores in your subdomain. We create your DNS records based on the subdomain, and DNS providers do not accept DNS records that contain underscores.\n\n<call-out type=\"warning\">\n\n Your sending reputation is determined by the reputation of your root, or top-level, domain. This is true even if you have several different subdomains with the same authenticate domain. For example, both `billing.example.com` and `marketing.example.com` will share the reputation of `example.com`.\n\n</call-out>\n\n\n ### \tBefore you begin\n\nTo set up reverse DNS, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up reverse DNS.\n\n*To set up and verify reverse DNS:*\n\n1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/sender_auth).\n2. In the reverse DNS section, click **Get Started**.\n3. Next, add information about your DNS host and select the IP address you would like to use to set up reverse DNS. Optionally, you may wish to filter your IP addresses by the subuser they are assigned to.\n4. Select or enter a domain you want to associate with the IP address. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field. Your domain needs to match the domain of your FROM address on the emails you are sending out. For example, if I am setting up the domain `example.sendgrid.com`, I would set my domain to be `sendgrid.com`. An individual IP address can only have one reverse DNS set up. Optionally, you may wish to access advanced settings, where you can add a custom subdomain. For more information about picking a subdomain, see [Subdomains](#subdomain).\n5. Click **Next** to save and view verification information. \n6. Next, you need to add all of the A Records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your A Records to some popular DNS service providers, check out these [videos]({{root_url}}/ui/account-and-settings/dns-providers/). If you don't have access to modify your companies DNS records, you can also email a request to a co-worker. This email includes a direct link to the A records. This link does expire. The recipient doesn't need login access to your SendGrid account.\n\n<call-out>\n\nIf you plan to send from multiple domains, you should set up reverse DNS for at least one IP address per domain.\n\n</call-out>\n\nIt can take up to 48 hours for the records to verify after you upload them to your DNS host, so you will likely have to come back later to verify.\n\n ### \tVerifying\n\nOnce you add the A Records to your DNS host, return to the IP address detail page, or locate the IP on the [Reverse DNS listing page](https://app.sendgrid.com/settings/sender_auth/reverse_dns). Once you have located the correct IP address, click **Verify**.\n\n<call-out>\n\nIf you click verify, and only half of your A name records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/).\n\n</call-out>\n\nNow your dedicated sending IP is associated with your domain. You only need to update your reverse DNS if you add additional dedicated IPs to your account.\n\n## \tReverse DNS for a subuser\n\nOnly a parent account can set up reverse DNS for an IP address. For a subuser account to have an IP that has reverse DNS set up, the parent account needs to buy the IP, set up reverse DNS and then [assign the IP to the subuser]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/#assigning-a-dedicated-ip-address-to-a-subuser).\n\n## \tWhat do I do if I have more than 10 IPs?\n\nThere is a character limit in SPF (sender policy framework) records that means that if you have more than 10 IP addresses, they will not fit in the record. When this is true, we will provide you with the generic SendGrid SPF record which includes all IPs at SendGrid, not just yours. If you would like to secure your SPF record only to include your IPs, you can chain multiple SPF records together manually. For more information see Open SPF’s [website](http://www.openspf.org/).\n\n## \tAdditional resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [Troubleshooting]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/safely-test-your-sending-speed.md",
    "content": "---\nseo:\n  title: Safely Test Your Sending Speed\n  description: Safely Test Your Sending Speed\n  keywords: throughput, through, put, speed, requests, sending\ntitle: Safely Test Your Sending Speed\ngroup: account-management\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nHave you ever wanted to see how quickly you can send multiple messages through SendGrid, but you were concerned about how it would affect your reputation? Worry no more!\n\nWe have configured a special domain for any users who are interested in testing out SendGrid's relay speeds at higher volumes without it negatively impacting your reputation. You can send your test messages to any address **@sink.sendgrid.net** while still using our standard integration practices. All messages to this domain are accepted for delivery and then immediately deleted. Sending to this domain will not contribute to the [IP warmup process]({{root_url}}/ui/sending-email/warming-up-an-ip-address/) if you have an account with a dedicated IP address.\n\n<call-out>\n  \n Please be aware that all of the messages you send to this domain will still consume billable email credits for your account!\n \n</call-out>\n\nIf you are looking to test your API integration, you can enable the `sandbox_mode` in the [`mail_settings` parameters of our Mail Send API]({{root_url}}/for-developers/sending-email/sandbox-mode/). **This will allow you to validate each parameter you include, and the structure of your JSON payload, all without actually sending a message.**\n\n<call-out>\n\nPlease note, `sandbox_mode` is not available for other endpoints, only `mail_send`.\n\n</call-out>\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/spf-dkim.md",
    "content": "---\nseo:\n  title: Internet Standards (SPF and DKIM) and Deliverability\n  description: Internet Standards (SPF and DKIM) and Deliverability\n  keywords: spf, dkim, trusted, sender verification, standards, 10, dns\ntitle: Internet Standards (SPF and DKIM) and Deliverability\nweight: 0\ngroup: sender-authentication\nlayout: page\nnavigation:\n  show: true\n---\n\nFor standards like [SPF]({{root_url}}/glossary/spf/) and [DKIM]({{root_url}}/glossary/dkim/) / DomainKeys, whether they improve deliverability or bypass filters is entirely at the discretion of the validating receivers. It is expected that messages from a sender with a good reputation would be subject to less scrutiny by the receiver's filters. In other words, omitting these standards usually doesn't hurt, but providing them can only help deliverability.\n\nSome other things to consider:\n\n- [DKIM](http://tools.ietf.org/html/rfc4871) is an internet standards track standard and deprecates [DomainKeys](http://tools.ietf.org/html/rfc4870)\n- If you turn off DomainKeys, we will still sign the email with DKIM which is not affected by the [on behalf of issue]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/), and is designed for the type of third-party signing we do.\n- An SPF record is invalid if it requires [more than 10 DNS lookups]({{root_url}}/ui/account-and-settings/spf-records/)\n- An SPF record is invalid if you have more than one SPF record for a given domain. In this case, you will want to merge the additional SPF records into one SPF record.\n\n## Additional resources\n\n- [DKIM Frequently Asked Questions](http://www.dkim.org/info/dkim-faq.html)\n- [SPF Records Explained]({{root_url}}/ui/account-and-settings/spf-records/)\n- [DKIM Records Explained]({{root_url}}/ui/account-and-settings/dkim-records/)\n- [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/spf-limitations.md",
    "content": "---\nseo:\n  title: SPF&#58; Don't Exceed Ten DNS Lookups!\n  description: SPF&#58; Don't Exceed Ten DNS Lookups\n  keywords:\ntitle: SPF&#58; Don't Exceed Ten DNS Lookups!\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nMany people may not realize it, but the Sender Policy Framework (SPF) specification has a limit on the number of DNS lookups (10) required to fully resolve an SPF record. One typically quickly exceeds this limit through the reckless use of the include modifier.\n\nSection 10.1, \"Processing Limits\" of the [SPF RFC](http://datatracker.ietf.org/doc/rfc4408/?include_text=1) specifies the following in regards to DNS lookups:\n\n> SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check, including any lookups caused by the use of the \"include\" mechanism or the \"redirect\" modifier. If this number is exceeded during a check, a PermError MUST be returned. The \"include\", \"a\", \"mx\", \"ptr\", and \"exists\" mechanisms as well as the \"redirect\" modifier do count against this limit. The \"all\", \"ip4\", and \"ip6\" mechanisms do not require DNS lookups and therefore do not count against this limit. The \"exp\" modifier does not count against this limit because the DNS lookup to fetch the explanation string occurs after the SPF record has been evaluated.\n\nThis limit is in place to prevent SPF lookups from being a useful avenue for Denial of Service attacks.\n\nIs your SPF record validating? You can find out [here](http://www.kitterman.com/spf/validate.html).\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/spf-records.md",
    "content": "---\nseo:\n  title: SPF Records Explained\n  description: SPF Records Explained\n  keywords: permission, spf, sender verification, include, spf1, spf2, return, path, ~all, -all, +all, sender, permitted, forgery, spoofing, spoof, fail, failed, validation, validate\ntitle: SPF Records Explained\ngroup: account-management\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nSender Policy Framework (SPF) is an open standard aimed at preventing sender address forgery. This article describes how SPF is configured for use with SendGrid.\n\n## SPF overview\n\nSPF attempts to prevent email sending abuse by ensuring that the IP address from which a message was sent is authorized to send mail on behalf of the domain in the email’s Envelope From or `return-path`.\n\n<call-out>\n\nFor more information about From addresses and email, see our article on [email spoofing]({{root_url}}/glossary/spoofing/).\n\n</call-out>\n\nSPF is implemented by adding a [TXT record](https://en.wikipedia.org/wiki/TXT_record) to a domain’s [DNS]({{root_url}}/glossary/dns/) records. The TXT record specifies which IP addresses are allowed to send email for the domain.\n\n## SPF mail flow\n\nTo understand SPF, it may help to understand how email traffic is handled when SPF is added to the process. Imagine an email server receives a message and checks the message's `return-path`. The `return-path` is `sender@example.com`. To perform an SPF check, the following steps take place:\n\n1. The receiving email server retrieves the SPF record from the DNS records for the `example.com` domain.\n2. The receiving server then checks the SPF record for all the IP addresses that are approved  to send email on behalf of the domain.\n3. If the SPF check passes, the receiving server can be confident the message was sent from an approved sending server and will continue processing the message.\n4. If the SPF check fails, the message is likely illegitimate and will be processed using the receiving server’s failure process.\n\n![A diagram of the SPF traffic flow described in the steps above this image]({{root_url}}/img/spf_mail_flow.jpeg \"SPF mail flow diagram\")\n\n## SPF and sender authentication\n\n### SendGrid's automated security\n\nWhen you complete Domain Authentication, [automated security]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/#using-automated-security) is enabled by default. Automated security handles your SPF and [DKIM]({{root_url}}/glossary/dkim) records for you. Twilio SendGrid provides [CNAME records]({{root_url}}/glossary/cname) that you need to add to your DNS records. This allows you to add dedicated IP addresses and make other account updates without having to manage your SPF records manually.\n\nTo disable this behavior, uncheck **Use automated security** when completing the domain authentication process. With automated security disabled, Twilio SendGrid provides you with TXT records like those discussed in this documentation rather than CNAME records.\n\n![Domain Authentication Automated Security]({{root_url}}/img/domain_auth_advanced_settings.png)\n\n### Custom SPF records\n\nIf you have an SPF record set for your domain already, you must add a unique alphanumeric string before the `all` mechanism of this record in order to authenticate mailings through your SendGrid account. If you do not have an existing SPF record for your domain, you must create a TXT record with the value provided to you during the [domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) process. Each SendGrid account gets a unique SPF TXT record to authenticate their outbound mailings. An example of such a record is:\n\n```text\nv=spf1 include:u123456.wl.sendgrid.net -all\n```\n\nIn this example, we have a unique SPF record for the authorization of outbound mail for a SendGrid account. A `-all` inclusion versus an `~all` inclusion indicates that this SPF record is the only record used to authenticate mail for your domain. Make sure to include any other authorized sender into this SPF record if you need to authenticate mailings from other sources.\n\nDo not create more than one SPF1 record for a given domain. If more than one SPF1 record exists for a domain, you will want to merge any additional SPF records into one SPF record. You also cannot have [more than 10 DNS lookups]({{root_url}}/ui/account-and-settings/spf-limitations/) in your single SPF record.\n\n## Working with an existing SPF record\n\nIf you already have an SPF record for your domain, you need to add your SendGrid account's unique SPF inclusion into your existing record.\n\nFor example, say your existing record looks like this:\n\n```text\nv=spf1 a mx include:\\_spf.google.com include:spf.protection.outlook.com -all\n```\n\nYou would need to add the SendGrid lookup at the end of the string, before the `all` mechanism, like so:\n\n```text\nv=spf1 a mx include:\\_spf.google.com include:spf.protection.outlook.com include:u826348.wl.sendgrid.net -all\n```\n\n## Don't want to include another hostname lookup?\n\nIf you would rather not include SendGrid's SPF hostname lookup in your record, or perhaps you have [too many already]({{root_url}}/ui/account-and-settings/spf-limitations/), you can also choose to give permission to a **specific IP address** to send mail for your domain. This is accomplished using the `ip4` mechanism within your SPF record.\n\nYou can choose to specify your [dedicated IP address]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/) as a lookup, which means that only mail coming from that particular IP address will be considered a permitted sender within SendGrid for that domain. An example of this looks like:\n\n```text\nv=spf1 a mx include:\\_spf.google.com include:spf.protection.outlook.com ip4:12.34.56.78 -all\n```\n\nIf you wish to add multiple `ip4` lookups (if you have an account that sends from multiple dedicated IPs, for example), add them to your record separated by spaces. Unlike with `include:hostname` lookups, a SPF1 record can have any number of `ip4` includes.\n\nFor more information on official SPF best practices and syntax, you can find the SPF specification at [www.openspf.org](http://www.open-spf.org/).\n\n## Additional Resources\n\n* [Sender Identity](/for-developers/sending-email/sender-identity/)\n* [Domain Authentication](/ui/account-and-settings/how-to-set-up-domain-authentication/)\n* [Single Sender Verification](/ui/sending-email/sender-verification/)\n* [DKIM Records Explained]({{root_url}}/ui/account-and-settings/dkim-records/)\n* [How to Implement DMARC]({{root_url}}/ui/sending-email/how-to-implement-dmarc/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/sso-okta.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: account-management\ntitle: Twilio SendGrid Single Sign-On with Okta\nseo:\n  title: Twilio SendGrid Single Sign-On with Okta\n  description: Configure Single Sign-On with SendGrid and the Okta IdP\n  keywords: SSO, Authentication, Password, SAML, Okta\nnavigation:\n  show: true\n---\n\n<call-out type=\"beta\">\n\nTwilio SendGrid Single Sign-On is currently in beta. The following documentation and product interface may change as the product is improved.\n\n</call-out>\n\nThe following guide will help you add Twilio SendGrid Single Sign-On (SSO) as an integration to your Okta Admin Console. This guide covers the steps necessary to work with Okta only. The following prerequisites should be completed before proceeding with this guide.\n\n## Prerequisites\n\nAdding an SSO configuration requires some back-and-forth between the Service Provider (Twilio SendGrid) and your IdP (Okta). The Twilio SendGrid App will provide values required by Okta. Likewise, Okta will provide values required by Twilio SendGrid. You should retrieve values from the Twilio SendGrid App for the fields listed in the following table before proceeding. To understand how to retrieve these values, please follow the instructions in our [main SSO documentation]({{root_url}}/ui/account-and-settings/sso/).\n\nTwilio SendGrid, Okta, and other identity providers often refer to the same values by different names. The table below provides the name used by both Okta and Twilio SendGrid, a short description for each required field, and which application provides the information during setup.\n\n<table>\n  <tr>\n    <th>Twilio SendGrid label</th>\n    <th>Okta label</th>\n    <th>Provided by</th>\n    <th>Description</th>\n  </tr>\n  <tr>\n    <td>Name</td>\n    <td>Name</td>\n    <td>Twilio SendGrid</td>\n    <td>The name of your integration. This name can be anything that makes sense for your organization (e.g., \"Twilio SendGrid\" or \"Email\")</td>\n  </tr>\n  <tr>\n    <td>Single Sign-On URL</td>\n    <td>Single sign on URL</td>\n    <td>Twilio SendGrid</td>\n    <td>The URL where Okta should POST its SAML response. This URL is responsible for receiving and parsing a SAML assertion. This is the same URL as the Audience URL when using Twilio SendGrid.</td>\n  </tr>\n  <tr>\n    <td>Audience URL (SP Entity ID)</td>\n    <td>Audience URL (SP Entity ID)</td>\n    <td>Twilio SendGrid</td>\n    <td>The URL where Okta should POST its SAML response. This URL is responsible for receiving and parsing a SAML assertion. This is the same URL as the Single Sign-On URL when using Twilio SendGrid.</td>\n  </tr>\n  <tr>\n    <td>N/A</td>\n    <td>Application username</td>\n    <td>N/A</td>\n    <td>This should be set to \"Email\" when using Twilio SendGrid.</td>\n  </tr>\n  <tr>\n    <td>Embed Link</td>\n    <td>Identity Provider Single Sign-On URL</td>\n    <td>Okta</td>\n    <td>Okta's SAML POST endpoint. This endpoint should receive requests and initiate an SSO login flow.</td>\n  </tr>\n  <tr>\n    <td>SAML Issuer ID</td>\n    <td>Identity Provider Issuer</td>\n    <td>Okta</td>\n    <td>An identifier provided by Okta to identify Twilio SendGrid in the SAML interaction.</td>\n  </tr>\n  <tr>\n    <td>X509 Certificate</td>\n    <td>X.509 Certificate</td>\n    <td>Okta</td>\n    <td>This certificate is used by Twilio SendGrid to verify that SAML requests are coming from Okta.</td>\n  </tr>\n</table>\n\n## Add the Twilio SendGrid application to Okta\n\nWith the prerequisite values prepared, you can begin adding your Application in the Okta Developer Console. The URL for this console will likely follow the pattern: `<your subdomain>.okta.com/admin/dashboard`.\n\n1. Once in the Developer Console, navigate to **Applications** > **Applications**. You will see a list of active applications and an **Add Application** button.\n\n![The Okta Applications Page]({{root_url}}/img/okta-applications-applications.png \"Okta Applications\")\n\n2. Click **Add Application** to load a view of **Featured Integrations**. You can ignore these integrations and click **Create New App** to start the \"Application Integration Wizard.\"\n\n![The Okta Create New Application Page]({{root_url}}/img/okta-create-application.png \"Okta Create New Application\")\n\n3. In the modal that loads, select **Web** from the **Platform** drop-down menu, select **SAML 2.0** as the **Sign on method**, and click **Create**.\n\n![Create a New Application Integration modal]({{root_url}}/img/okta-sign-on-method-modal.png \"Create a New Application Integration\")\n\n4. A screen will load where you should add the **App name**. We recommend \"Twilio SendGrid,\" but you can choose anything that makes sense for your organization (e.g., Email). You can optionally upload a logo and choose whether or not to display it to users.  Click **Next** to continue.\n\n<call-out>\n\nYou can download the Twilio SendGrid logo from our brand assets page at https://sendgrid.com/resource/brand/.\n\n</call-out>\n\n![Okta Create Integration page]({{root_url}}/img/okta-new-integration-general-settings.png \"Create Integration\")\n\n5. You will now begin adding the values listed in the prerequisites of this guide to the fields in the Okta **Configure SAML** form.\n\n### Okta SAML settings\n\n**SAML Settings**\n- **Single Sign on URL**: The Single Sign-on URL provided by the Twilio SendGrid App.\n   - **Use this for Recipient URL and Destination URL**: Leave this box checked.\n   - **Allow this app to request other SSO URLs**: Leave this box unchecked.\n- **Audience URI (SP Entity ID)**: The Audience URI (SP Entity ID) provided by the Twilio SendGrid App.\n- **Default RelayState**: Leave this field blank.\n- **Name ID format**: Leave this field set to, **Unspecified**. If you are using an IdP other than Okta, you may need to set this to \"emailAddress.\"\n- **Application username**: Select, **Email**.\n\n**Attribute Statements(optional)**\n- **Name**, **Name format**, **Value**: Leave these fields blank.\n\n**Group Attribute Statements (optional)**\n- Leave this section blank.\n\n6. Select **Next** at the end of the **Configure SAML form**.\n\n![Okta Create SAML Integration settings page]({{root_url}}/img/okta-saml-settings.png \"Create SAML Integration settings\")\n\n7. You will now be able to select whether you are a customer or partner on the next page. You should select **I'm an Okta customer adding an internal app**. Then select **Finish**.\n8. A new page will load displaying the **Sign On** tab for your application. In this tab, you should see a message stating that \"SAML 2.0 is not configured until you complete the setup instructions.\" Click on **View Setup Instructions**.\n\n![Okta View Setup Instructions]({{root_url}}/img/okta-view-setup-instructions.png \"View Setup Instructions\")\n\n9. A new tab will open with the information required by the Twilio SendGrid App to complete SAML setup. See \"IdP settings\" in the [Twilio SendGrid SAML SSO documentation]({{root_url}}/ui/account-and-settings/sso/#idp-settings) for instructions on adding this information to the Twilio SendGrid App.\n\n## Edit your existing Twilio SendGrid application in Okta\n\nOnce you have added Twilio SendGrid to Okta, you may need to modify the integration.\n\n1. To edit an existing integration, navigate to **Applications** > **Applications**. Select the Twilio SendGrid application from the list of active applications.\n2. The Twilio SendGrid integration will load. You can modify your **App Settings** or retrieve the values required to integrate with Twilio SendGrid from the **General** tab.\n3. You can add or remove users from the application using the **Assignments** tab.\n\n![Okta Applications menu with the \"General\" tab open]({{root_url}}/img/sso_okta_edit_integration.png \"Okta Applications Genral tab\")\n\n## Adding users to your Okta Application\n\nOnce you complete your Okta configuration in the Twilio SendGrid App, you will be able to manage your users.\n\n1. To assign a user to the Twilio SendGrid Application in Okta, navigate to **Applications** > **Applications** in the Okta Admin interface.\n2. You will see a list of your active applications. From the action menu beside your Twilio SendGrid application, select **Assign to Users**.\n\n![Okta action menu, assing to users]({{root_url}}/img/okta-assing-to-users-modal.png \"Assign to Users\")\n\n3. A modal will load where you can search for and assign users to the application. These users' email addresses should match the email addresses assigned to them as SSO Teammates in the Twilio SendGrid App.\n\n## Completing setup with Twilio SendGrid\n\nTo further manage users, remove an IdP integration, or make other changes to your integration, please return to the [main Twilio SendGrid SAML SSO documentation]({{root_url}}/ui/account-and-settings/sso/) for next steps.\n\n## Additional Resources\n\nOkta provides its own developer documentation, which may be helpful depending on your integration needs.\n\n- [Okta](https://developer.okta.com/docs/guides/build-sso-integration/saml2/create-your-app/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/sso.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: account-management\ntitle: SendGrid Single Sign-On\nseo:\n  title: SendGrid Single Sign-On\n  description: Configure Single Sign-On with SendGrid\n  keywords: SSO, Authentication, Password, SAML\nnavigation:\n  show: true\n---\n\n<call-out type=\"beta\">\n\nTwilio SendGrid Single Sign-On is currently in beta. The following documentation and product interface may change as the product is improved.\n\n**Known limitations during beta**  \nTwilio SendGrid SSO does not currently support granting an SSO user access to more than one Subuser without granting the SSO user administrator access at the top level of your Twilio SendGrid account.\n\n</call-out>\n\n## SSO beta release schedule\n\nSingle Sign-On is being released in phases for each plan type. The table below provides an estimated release schedule — the provided dates are estimates only and may change. See our [pricing page](https://sendgrid.com/pricing/) for a list of all Twilio SendGrid plans and features.\n\n<table>\n    <thead>\n        <tr>\n            <th>Twilio SendGrid Plan</th>\n            <th>Estimated Availability</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n          <td>Marketing Campaigns Advanced</td>\n          <td>Now available</td>\n        </tr>\n        <tr>\n          <td>Email API Pro</td>\n          <td>May 31st - June 11th</td>\n        </tr>\n        <tr>\n          <td>Email API Premier and Custom</td>\n          <td>June 14th - June 25th</td>\n        </tr>\n    </tbody>\n</table>\n\n## Introduction to Twilio SendGrid SSO\n\nTwilio SendGrid Single Sign-On (SSO) uses the widely supported [Security Assertion Markup Language (SAML 2.0)](https://en.wikipedia.org/wiki/SAML_2.0) to integrate your Twilio SendGrid user authentication with identity and access management platforms such as [Okta](https://www.okta.com/), [Duo](https://duo.com/), and [Microsoft Azure Active Directory](https://azure.microsoft.com/en-us/services/active-directory/).\n\n### Terminology\n\nSSO and SAML terminology is defined throughout this document. Twilio SendGrid will commonly be referred to as the **Service Provider (SP)**. An identity management provider such as Okta will commonly be referred to as the **Identity Provider (IdP)**. One IdP often uses different terminology from another to label the same required fields in a SAML configuration. This document attempts to clarify and call attention to the alternative terminology used by IdPs whenever possible.\n\n## Access and manage your SSO settings\n\nThe Twilio SendGrid [SSO settings menu](https://app.sendgrid.com/settings/sso) allows you to configure integrations with your IdP(s). Managing users and permissions is covered in the [user management section](#manage-users) of this document.\n\n### Add a Twilio SendGrid SSO Configuration\n\nAdding an SSO configuration requires some back-and-forth between the Service Provider (Twilio SendGrid) and the IdP. The Twilio SendGrid App will provide values required by your IdP. Likewise, your IdP will provide values required by Twilio SendGrid. This document will cover the exchange in sections, beginning from the Twilio SendGrid App.\n\nYou can find IdP-specific documentation for some of the most popular IdPs in the [Additional Resources section](#additional-resources).\n\n#### Twilio SendGrid Service Provider settings\n\nTo add, delete, or modify an SSO integration, log in to the top level of your Twilio SendGrid account using your administrator credentials.\n\n1. Once logged in, navigate to **Settings** and select **SSO Settings**.\n2. The SendGrid App will display a page with an **Add Configuration** button.\n\n![The Twilio SendGrid SSO Settings page]({{root_url}}/img/sso-sso-settings-nav-link.png 'SSO Settings')\n\n3. Click **Add Configuration**. A page will load and display the following configuration values needed by your IdP.\n\n   - **Name**: A friendly name for your IdP configuration. This **Name** will be set to “My IdP configuration” by default. You can change it to something that will help you differentiate it from additional IdP configurations you add later.\n   - **Single Sign-On URL**: The Twilio SendGrid URL where your IdP should POST its SAML response. This URL is responsible for receiving and parsing a SAML assertion. The Single Sign-On URL and the Audience URL are the same when using Twilio SendGrid.\n   - **Audience URL (SP Entity ID)**: The Twilio SendGrid URL where your IdP should POST its SAML response. This URL is responsible for receiving and parsing a SAML assertion. The Audience URL and the Single Sign-On URL are the same when using Twilio SendGrid.\n   - **SP Public Key**: The SP Public Key may not be required by your IdP. It is used to verify that requests are coming from the correct Service Provider.\n   - **Additional Fields**: The following fields may or may not be required by your IdP. If they are required, you can provide the following values.\n      - **Default RelayState**: This field is not applicable; leave it blank.\n      - **Name ID format**: \"unspecified.\" If your IdP generates an error with this field set to \"unspecified\", try setting it to \"emailAddress.\"\n      - **Application username**: \"Email\"\n\n![The Twilio SendGrid SSO IdP Configuration page]({{root_url}}/img/sso-add-configuration-values.png 'Add IdP Configuration')\n\n4. You can now add the values for each field to your IdP.\n5. Your IdP will also provide values necessary to complete the SSO setup in the Twilio SendGrid App.\n\n#### IdP settings\n\nOnce you have added the previous settings where appropriate in your IdP, your IdP will provide the values necessary to complete the setup in the Twilio SendGrid App.\n\n1. From the page displaying your SendGrid SSO configuration, click **Next**. A page will load and display the following SAML fields. The necessary values are provided by your IdP.\n\n- **SAML Issuer ID**: An identifier provided by your IdP to identify the Service Provider in the SAML interaction. Your IdP may call this an \"Entity ID,\" \"Identity Provider Issuer,\" \"Azure AD Identifier,\" or other identifier.\n- **Embed Link**: The IdP’s SAML POST endpoint. This endpoint should receive requests and initiate an SSO login flow. Your IdP may call this the \"Identity Provider Single Sign-On URL,\" \"Login URL,\" or some other authentication URL.\n\n2. Copy the values from your IdP to the appropriate fields in the Twilio SendGrid App.\n\n![The \"Add IdP Configuration\" menu in the Twilio SendGrid App.]({{root_url}}/img/sso-IdP-configuration-value2.png 'Add IdP Configuration')\n\n3. Click **Add Certificates** to load the configuration menu. The loaded modal will have one field labeled **X509 Certificate**. This certificate is used by Twilio SendGrid to verify that SAML requests are coming from an IdP it knows and trusts.\n4. Paste the certificate provided by your IdP into the **X509 Certificate** field and click **Add Certificate**.\n\n![The \"Add X509 Certificate\" modal in the Twilio SendGrid App.]({{root_url}}/img/sso-x509-cert-sidebar.png 'Add X509 Certificate')\n\n5. The modal will close after you click **Add Certificate**. You can now select **Enable SSO** to complete the configuration. You can also **Save without enabling**.\n\nYour SSO configuration should now be complete. You can follow the next steps in this document to edit or delete a configuration. You can also skip to the [user management](#manage-users) section to begin onboarding SSO users.\n\n### Disable or enable an SSO IdP Configuration\n\nYou can toggle the state of a configuration by selecting **Settings** > **SSO Settings** from the left sidebar navigation of the Twilio SendGrid App.\n\n1. A page will load displaying all your existing IdP configurations.\n2. Each configuration will have an action menu to the far right. Select this menu to display a dropdown where you can choose **Edit** or **Disable**.\n\n![The SSO settings page with an SSO configuration and its action menu expanded.]({{root_url}}/img/sso-configuration-action-menu-expanded.png 'Edit or Disable SSO configuration')\n\n3. Selecting **Disable** will load a modal asking you to confirm your decision. Disabling a configuration will inactivate the configuration but will not delete it. Once disabled, any SSO users whose access is tied to the configuration will no longer be able to authenticate with Twilio SendGrid.\n\n![The SSO settings modal asking to confirm that you want to disable the configuration.]({{root_url}}/img/sso-configuration-disable-confirmation-modal.png 'Disable SSO configuration')\n\n4. To reenable a configuration, select the action menu. For any disabled configuration, you will see the options to **Edit** or **Enable**.\n5. Selecting **Enable** will reactivate the configuration for any Teammates assigned to it.\n\n### Edit or delete an SSO IdP configuration\n\nYou can edit or delete a configuration by selecting **Settings** > **SSO Settings** from the left sidebar navigation.\n\n1. A page will load displaying all your existing IdP configurations.\n2. Each configuration will have an action menu to the far right. Select this menu to display a dropdown where you can choose **Edit** or **Disable**.\n\n![The SSO settings page with an SSO configuration and its action menu expanded.]({{root_url}}/img/sso-configuration-action-menu-expanded.png 'Edit or Disable SSO configuration')\n\n3. Select **Edit** from the action menu. A page will load that allows you to modify or complete an unfinished SSO integration.\n4. After modifying any of the fields in your configuration, select **Save** at the bottom of the page.\n5. To delete the configuration, select **Delete <name of your configuration>**.\n\n![The \"Edit My IdP Impletmentation\" page.]({{root_url}}/img/sso-edit-IdP-configuration-page.png 'Edit my IdP implementation')\n\n6. When you select **Delete <name of your configuration>**, you will be presented with a modal asking you to confirm the deletion.\n\n![A modal asking you to confirm the deletion of your IdP configuration.]({{root_url}}/img/sso-delete-configuration-confirmation-modal.png 'Delete this IdP configuration')\n\n## Manage users\n\nOnce you have successfully enabled an SSO IdP configuration, you will need to add SSO users to the account. Twilio SendGrid calls these users Teammates. An account administrator can add two types of Teammates to an account: SSO Teammates and Password Teammates. Password Teammates will log in with a username, password, and Twilio SendGrid 2FA. This documentation covers the SSO Teammate setup only. For more information about our Teammates feature, see the dedicated [Teammates documentation]({{root_url}}/ui/account-and-settings/teammates/).\n\n<call-out>\n\nTwilio SendGrid does not currently offer a migration tool that will convert existing Teammates to SSO Teammates. You must manually add existing Password Teammates as SSO Teammates to your account.\n\n</call-out>\n\n<call-out>\n\nTwilio SendGrid requires Two-factor Authentication (2FA) to access its services. This means that any account administrators who access Twilio SendGrid outside of an SSO configuration must enable 2FA. See our [2FA documentation]({{root_url}}/ui/account-and-settings/two-factor-authentication/) for more information.\n\nConfiguring 2FA for SSO Teammates should not be done in the Twilio SendGrid App. You will manage any 2FA requirements for your SSO Teammates in your IdP. For example, the Okta or Duo apps may be configured to send Push or SMS notifications.\n\n</call-out>\n\n### Add a Teammate\n\n1. To add a Teammate, navigate to **Settings** and select **Teammates**.\n2. A page will load displaying any existing Teammates. If there are no existing Teammates, you will see a **Get started creating teammates** button.\n3. Click the **Add Teammate** button at the top of the page to display a dropdown menu with options to **Add password teammate** or **Add SSO teammate**.\n\n![The Twilio SendGrid Teammates App page.]({{root_url}}/img/sso-teammates-add-teammate.png 'Add a Teammate')\n\n4. Select **Add SSO teammate**. A menu will load and display the following fields required to create the Teammate.\n\n   - **Teammate’s Email Address**: Twilio SendGrid will use this email address as the primary identifier when authenticating the SSO user. For this reason, a Teammate’s email address must match the address you assign it in your IdP, and the address cannot be changed after you create it. If a single user must access multiple accounts, you will need to configure your IdP to pass through a unique email address for each account+user pair; these unique email addresses must be added as SSO Teammates in the Twilio SendGrid App.\n   - **Teammate’s First Name**: The Teammate’s first name.\n   - **Teammate’s Last Name**: The Teammate’s last name.\n   - **Teammate’s Permissions**:\n\n       - **Add as Admin**: Administrators can fully manage the Twilio SendGrid account. They have the ability to add, remove, and edit other Teammates.\n       - **Add with Read-Only Access**: Read-only permissions allow a Teammate to work within the SendGrid App to send email, manage templates, and perform other email-related tasks; however, a read-only Teammate cannot manage other Teammates.\n       - **Add with Restricted Access**: You can finely control a user's permissions by creating a Teammate with restricted access. For example, a software developer may need to create API keys but never require billing access. The Twilio SendGrid App also provides permission presets that will toggle on the access most often needed by common types of users.\n\n![The \"Add SSO Teammate\" modal with a restricted access user selected.]({{root_url}}/img/sso_teammate_restricted_access.png 'Add SSO Teammate')\n\n5. With all the fields complete, click **Add** to finish creating the Teammate.\n\n### Edit a Teammate\n\nExisting Teammates can be edited from the **Settings** > **Teammates** page of the Twilio SendGrid App.\n\n1. On the Teammates management page, each Teammate will have an action menu on the far right. Click the action menu to reveal **Edit** and **Delete** options.\n\n![An SSO Teammate with the action menu open to edit or delete the Teammate.]({{root_url}}/img/sso-teammate-action-menu.png 'Edit or Delete an SSO Teammate')\n\n2. Selecting **Edit** from the action menu will load a sidebar modal with the same fields that were present when adding the Teammate. You can edit any of the fields except the **Teammate’s Email Address**, which cannot be changed after the Teammate is created.\n\n### Remove a Teammate\n\nExisting Teammates can be deleted from the **Settings** > **Teammates** page of the Twilio SendGrid App.\n\n1. On the Teammates management page, each Teammate will have an action menu on the far right. Click the action menu to reveal **Edit** and **Delete** options.\n\n![An SSO Teammate with the action menu open to edit or delete the Teammate.]({{root_url}}/img/sso-teammate-action-menu.png 'Edit or Delete an SSO Teammate')\n\n2. Selecting **Delete** from the action menu will load a modal asking you to confirm the deletion.\n\n![A modal asking you to confirm the deletion of a Teammate]({{root_url}}/img/sso-teammate-delete-modal.png)\n\n## User authentication flow\n\nUser authentication can be initiated in two ways: from the Service Provider or from the IdP. We call these SP-initiated and IdP-initiated authentication flows respectively.\n\n### SP-initiated authentication flow\n\nThe SP-initiated flow occurs when a user authenticates directly with the Twilio SendGrid App.\n\nWhen a user enters their email address, Twilio SendGrid performs a check and redirects any email address associated with an SSO account to the SSO login page. Users will then authenticate by entering their IdP credentials.\n\n### IdP-initiated authentication flow\n\nThe IdP-initiated flow occurs when a user authenticates with their IdP. For example, a user may click on the SendGrid app tile from Okta. This flow will authenticate the user and redirect them to the Twilio SendGrid App.\n\n## Additional Resources\n\n- [The Twilio SendGrid SSO REST API]({{root_url}}/api-reference)\n\n**Twilio SendGrid IdP guides**\n\n- [Twilio SendGrid Single Sign-On with Okta]({{root_url}}/ui/account-and-settings/sso-okta/)\n\n**IdP documentation sites**\n\n- [Okta](https://developer.okta.com/docs/guides/build-sso-integration/saml2/create-your-app/)\n- [Microsoft Azure Active Directory](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso)\n- [Duo](https://duo.com/docs/sso-generic)"
  },
  {
    "path": "content/docs/ui/account-and-settings/subusers.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: teammates-subusers\ntitle: Subusers\nseo:\n  title: Subusers\n  description: Create and Manage Subusers\n  keywords: Subuser settings, create Subuser, manage Subuser, delete Subuser\nnavigation:\n  show: true\n---\n\nSubusers help you segment your email sending and API activity. You assign permissions and credit limits when you create the subuser. We recommend creating subusers for each of the different types of emails you send - one subuser for transactional emails, and another for marketing emails. Breaking your sending up this way allows you to get separate statistics for each type of email you send.\n\n<call-out>\n\nIf you have a **Pro or Premier API plan** or an **Advanced Marketing Campaigns Plan**, you may create up to 15 subusers through your account. If you reach the maximum of 15 and require more subusers, please use the form in the [Subuser Management](https://app.sendgrid.com/settings/subusers) page to request more.\n\n</call-out>\n\n##     Create a subuser\n\nNew SendGrid accounts do not come with subusers; you must create them with the parent account.\n\n*To create a subuser:*\n\n1. Navigate to **Settings** and select **Subuser Management**.\n1. Click **Create New Subuser**.\n1. Enter the following required information into the corresponding fields:\n    * Username - The username your subuser will use to send emails and access the API.\n    * Email Address - The contact email address for this subuser. This must be an active email account as SendGrid may contact a subuser to provide support, resolve sending and deliverability issues, or to enforce [SendGrid's Terms of Service](https://sendgrid.com/policies/tos/). Whenever we contact a subuser, it is our policy to contact the parent account email address at the same time.\n    * Password - The password your subuser will use to access SendGrid.com.\n    * Avatar - If you have [gravatar](http://gravatar.com), or globally recognized avatar, that you use for other applications, it is automatically associated with this subuser when you enter an email address. This makes it easier to identify all of the subusers attached to your account.\n\n\n4. Assign an IP Address to the subuser account.\n  You are assigned a dedicated IP address when you create a Pro 100k plan or higher. If you send at a high volume, and you're using subusers to separate out your sending traffic, it's best practice to purchase a separate IP for each sending type.\n\n##     Manage subusers\n\nSubusers can be managed via [Subuser API](https://sendgrid.api-docs.io/v3.0/Subusers-api) or by using the SendGrid UI.\n\n*To manage a subuser from the SendGrid UI:*\n\n1. Navigate to **Settings** and select **Subuser Management**.\n1. Select the name of the subuser. This takes you to the subuser’s account and profile settings. From there, you can manage and update your subuser Settings.\n\n###     Optional Profile Information\n\nWe do not require this information for your subusers, but we suggest that you fill out as much as possible to improve the deliverability for this subuser, especially if the information does not match your parent account’s information. This will also allow SendGrid to contact your subuser directly if we notice anything on their account.\n\nThe following fields in the subuser profile are optional:\n\n**First Name** - The first name of the person responsible for this subuser.\n\n**Last Name** - The last name of the person responsible for this subuser.\n\n**Company** - The name of your subuser’s company.\n\n**Address 1** - The first line of your subuser’s address.\n\n**Address 2** - The second line of your subuser’s address.\n\n**City** - The city in which your subuser operates.\n\n**State** - The state or province in which your subuser operates.\n\n**Country** - The country in which your subuser operates.\n\n**Zip** - The zip code in which your subuser operates.\n\n**Company Phone Number** - The phone number for your subuser’s business.\n\n**Company Website** - The website for your subuser’s business.\n\n###     Allocating or removing credits from a subuser\n\n<call-out type=\"warning\">\n\nYou can only allocate credits by selecting the nonrecurring credit option.\n\n</call-out>\n\nIf your Subuser account has nonrecurring credits, you can allocate credits to, or remove credits from this subuser account. On the subuser's profile, click **Change Credit Rules** and then choose the appropriate credit amount for the subuser.\n\n###     Monitoring subuser email content\n\nThis feature allows you to receive a sample of a subuser's email content to help ensure that the content is not damaging your reputation.\n\n<call-out type=\"warning\">\n\nEach monitor email costs one email credit.\n\n</call-out>\n\nThe “Collect Sample Rate” is the number of emails SendGrid will allow through before copying the email address you set on the next email sent. For example, if you set the collect sample rate at 100, then you will receive a copy of every 100th email this subuser sends.\n\n###     Disabling a subuser account\n\n*To turn off a subuser’s access to SendGrid temporarily:*\n\n1. Navigate to **Settings** and select **Subuser Management**.\n1. Locate the subuser account you wish to disable and click on the name to view the account details.\n1. Click **Disable Account**.\n\nTo re-enable a subuser’s account, follow steps 1 and 2 above, then click **Enable Account**.\n\n###     Deleting a subuser account\n\n<call-out type=\"warning\">\n\nDeleting a subuser account cannot be undone. Please make sure that you are ready to delete this account before you delete it. Deleting this subuser will immediately revoke all access.\n\n</call-out>\n\n*To delete a subuser account:*\n\n1. Navigate to **Settings** and select **Subuser Management**.\n1. Locate the subuser account you wish to delete and click on the name to view the account details.\n1. On the *Account Settings* page, click **Delete**.\n   A confirmation window appears.\n1. Click **Confirm** to delete the subuser account.\n\n## Adding subusers to Dedicated IP Addresses\n\nYou will need to have a dedicated IP address already. Adding subusers to dedicated IP addresses can help you separate your sending traffic, improving your deliverability rate. \n\n1. Navigate to **Settings** and select [Subuser Management](https://app.sendgrid.com/settings/subusers).\n1. Select the subuser to assign the dedicated IP.\n1. Select **Change Sending**.\n1. Under IP Addresses, select an IP address to assign to the subuser.\n1. Select **Save**.\n\n##     Impersonating a Subuser\n\nWhen you set up subusers, it may be useful to see what the subuser’s settings are and to see what the subuser can see in the SendGrid UI.\nTo make this easier, we’ve made it so you can impersonate a subuser from your parent account and then manage the subuser the same way as if you had logged in with that user’s credentials, without having to log out of your parent account.\n\n*To impersonate a Subuser:*\n\n1. Log into SendGrid.\n2. Go to the top left corner of the portal screen and click on your name just above the navigation menu.\n3. Click **Switch User**.\n4. Choose the subuser you want to impersonate by clicking that subuser’s name.\n\nThe page will refresh, and you will notice a message at the top of the screen that says, “You're currently logged in as [subuser name]”.\n\nIf you have more than one subuser, you can also switch to another subuser by clicking **Switch Subuser** in the top-right corner once you are impersonating any subuser.\n\n###     Switching back to your parent account\n\nClick the link at the top left that says “Back to Parent Account”. This will log you out of the subuser account and take you back to your parent account portal.\n\n##     Export subuser Information\n\nIf you would like to see how your subusers are performing in comparison to each other, you can export subuser data.\n\n*To export subuser information:*\n\n1. Navigate to **Settings** and select **Subuser Management**.\n1. Click **Export Data**.\n <br>This downloads a CSV file with each subuser’s reputation, the number of requests they made this month, and the number of requests they made last month.\n\n##     Additional Resources\n\n- [Assigning an Authenticated Domain to a subuser]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/#assigning-a-subuser)\n- [Teammates]({{root_url}}/ui/account-and-settings/teammates/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/support.md",
    "content": "---\nseo:\n  title: Contacting SendGrid Support\n  description: SendGrid support contact information\n  keywords: SendGrid support, support contact, sendgrid support chat, sendgrid support phone number\ntitle: How to contact SendGrid support\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n<iframe src=\"https://player.vimeo.com/video/263354373\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n<div class=\"row\">\n  <div class=\"col-md-4\"></div>\n  <div class=\"col-md-4\">\n    <a href=\"https://support.sendgrid.com/\" class=\"btn btn-large btn-primary center-block\">Contact Support</a>\n  </div>\n  <div class=\"col-md-4\"></div>\n</div>\n\nYou can contact SendGrid support from the [SendGrid Support Portal](https://support.sendgrid.com). Click **Login & Contact Support**, and then **Contact Support** to see your support contact options. Paying SendGrid customers have the option to contact support via chat, or by submitting a ticket using our web form. SendGrid customers with a Pro or higher tier plan have access to phone support as well. All SendGrid customers have the option to submit a ticket using our web form.\n\n## \tSupport Hours\n \t\n* Ticket support - 24/7\n* Chat support - 24/7 (For paying customers) \n* Phone support is available for customers with a Pro or higher account 7:00AM - 5:00PM MST, Monday - Friday.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/taxes-and-tax-exempt.md",
    "content": "---\nseo:\n  title: Sales Taxes and Tax-Exempt Status\n  description: Understand where SendGrid charges taxes, and how to let us know if you have tax-exempt status.\n  keywords: taxes, tax jurisdictions, tax-exempt\ntitle: Sales Taxes and Tax-Exempt Status\nweight: 0\ngroup: billing\nlayout: page\nnavigation:\n  show: true\n---\n\nSendGrid now collects sales tax in several US states and metro areas (see below for more details). We assign tax jurisdiction by the billing address you have in our system. If your billing address is in one of these jurisdictions, and you don't have 501(c)(3) tax-exempt status, you will see a line for sales tax [on your invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/). For more information about declaring your tax-exempt status, see [Declaring tax-exempt status](#declaring-tax-exempt-status).\n\n## \tDeclaring tax-exempt status\n\nTo declare tax-exempt status, email your 501(c)(3) (or equivalent) documentation to billing@sendgrid.com.\n\nWhen we receive your paperwork, we'll verify it, and assign you tax-exempt status.\n\n## \tDeclaring reseller status\n\nResellers are responsible for collecting and verifying their own taxes and taxes for their customers, including sales tax. To declare your status as a SendGrid reseller, email your state reseller permit, purchase for resell exemption certificate, or similar document to billing@sendgrid.com.\n\nWhen we receive your paperwork, we'll verify it, and assign you reseller status.\n\n## \tTax FAQ\n\n ### \tWhy does SendGrid collect sales tax?\n\nIf SendGrid has a physical presence in a jurisdiction, and we directly sell a taxable product to someone located in that jurisdiction, then we are required to collect sales tax on behalf of that jurisdiction.\n\n ### \tWho is required to pay sales tax?\n\nSendGrid collects sales tax in the following jurisdictions:\n\n- Alabama\n- Arizona\n- Arkansas\n- California\n- Colorado\n- Connecticut\n- Florida\n- Georgia\n- Hawaii\n- Idaho\n- Illinois\n- Iowa\n- Indiana\n- Kansas\n- Kentucky\n- Louisiana\n- Maine\n- Maryland\n- Massachusetts\n- Michigan\n- Minnesota\n- Mississippi\n- Missouri\n- Nebraska\n- Nevada\n- New Jersey\n- New Mexico\n- New York\n- North Carolina\n- North Dakota\n- Ohio\n- Oklahoma\n- Pennsylvania\n- Rhode Island\n- South Carolina\n- South Dakota\n- Tennessee\n- Texas\n- Utah\n- Virginia\n- Washington\n- Washington D.C.\n- West Virginia\n- Wisconsin\n- Wyoming\n- US metro areas include Denver, Boulder and Chicago\n\nTo determine whether to add sales tax to your monthly SendGrid bill, we use the address you enter as your billing address in [Account Details](https://app.sendgrid.com/account/billing) in the SendGrid UI.\n\n ### \tWhere can I see how much I am getting charged for sales tax each month?\n\nIf you are being charged sales tax, you will see it as a line item on your invoice. You’ll be able to find the new sales tax line item by navigating to [Account Details](https://app.sendgrid.com/account/billing) in the SendGrid UI, then by viewing your invoice, which is in PDF form.\n\n ### \tCan I get an estimate of my sales tax?\n\nUnfortunately, we cannot provide estimates of sales tax for an individual customer ahead of time. The taxes assessed could change monthly for various reasons such as state or local tax laws changing. You can check your bill throughout the month for an estimate of your sales tax.\n\n ### \tWill my tax amount vary from month to month?\n\nTaxes charged can vary month-to-month based on local tax laws changing, or if your product mix causes your bill to be greater or less than in previous months.\n\n ### \tHow does SendGrid calculate the sales tax owed?\n\nTax laws change regularly, so we work with a third party software that focuses on deeply understanding local and state tax laws. SendGrid uses this software to calculate the sales tax you are charged each month.\n\n ### \tOther questions?\n\nIf you have any other questions about taxes, send an email to billing@sendgrid.com.\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/teammates.md",
    "content": "---\nseo:\n  title: Teammates\n  description: Adding and managing Teammates using the SendGrid UI\n  keywords: teammates, teammate, permissions\ntitle: Teammates\nweight: 0\ngroup: teammates-subusers\nlayout: page\nnavigation:\n  show: true\n---\n\nTeammates allows multiple users, or teammates, to send email from a single SendGrid account. It enables groups of users with different roles and responsibilities to share one account, where each of these users has access to varying SendGrid features depending on their needs. By only giving your individual team members access to the features that they need to do their jobs, you can limit access to sensitive areas of your account. Teammates makes it incredibly easy to add, remove, and manage different users. Free and Essentials customers can create 1 teammate per account, and Pro customers or higher packages up to 1000 teammates.\n\n<call-out>\n\nFree and Essentials customers can create 1 teammate per account, and Pro customers or higher packages up to 1000 teammates.\n\n</call-out>\n\n## Adding Teammates\n\n_To invite a Teammate to your account:_\n\n1. Navigate to **Settings**, and click on **Teammates**.\n   <br>This is where you can see the list of all of your current teammates with their details: username, email address, first name, and last name.\n2. To add a new Teammate, click **Add Teammate**.\n3. Enter the Teammate's email address and then select their permission level.\n   <br>Depending on the selected permission level, you may need to do some additional permission [configuration](#configuring-permissions).\n4. Click **Invite**.\n   <br>If you have already sent a teammate invitation, you will see a list titled **Pending Invites**. This list contains the email address of the invitee and the invitation expiration date.\n\n<call-out type=\"warning\">\n\nTeammate invitations are valid for 7 days.\n\n</call-out>\n\n<call-out>\n\nWhile only administrators can create teammates, it is possible for one administrator to create another teammate with administrator permissions. This new teammate would then be able to create and manage other teammates and have access to the account's billing settings. **Please be very careful about who you assign administrator permissions!**\n\n</call-out>\n\n<call-out>\n\nOnly administrator teammates may impersonate subusers.\n\n</call-out>\n\n## Managing Teammates\n\n### Configuring permissions\n\nThe 3 different permission levels are:\n\n- **Restricted Access -** Teammates with no access to a feature cannot change that feature’s settings or view it within the SendGrid UI. However, you can still [grant them access to specific features](#granting-feature-access).\n- **Read-only Access -** Teammates with read-only access will not be able to change or configure a feature. However, they will be able to view any information provided by that feature.\n- **Admin -** Teammates with full access that can view and make any changes.\n\nIf you select **Invite with Restricted Access** when inviting a Teammate, you need to select a preset access level or create your own by selecting **Custom Access**. You can choose from several pre-defined permission levels to fit a variety of roles: Developer Access, Marketer Access, and Accountant Access or you can customize access for the teammate.\n\n_To modify an existing teammate's permissions:_\n\n1. Navigate to the **Teammates Page** under **Settings**.\n1. Under the list of current teammates, click the action menu next to the teammate you would like to edit.\n1. Click **Edit** to open a modal window presenting the teammate's current permissions.\n1. Make your desired changes and click **Update**.\n\n### Removing Teammates\n\n_To delete a teammate:_\n\n1. Navigate to the **Teammates Page** under **Settings**.\n1. Click the action menu next to the teammate you want to delete and click **Delete**.\n\n<call-out type=\"warning\">\n\nYou cannot recover deleted teammates. Once a teammate has been deleted, it can never be restored. SendGrid will not remove any templates, campaigns, contacts, or API keys created by the teammate.\n\n</call-out>\n\n## Requesting feature access\n\nIf you are already signed into a SendGrid account as a teammate, but do not have access to a page or feature, you may request access to that page by clicking **Request Access**.\n\nOnce a request is made, all account administrators receive a notification via email that a request is pending approval.\n\n### Granting feature access\n\nYou can find any access requests listed under **Pending Requests** on the **Teammates** page in your Settings. The request will list the username of the teammate, their email address, their first and last names, along with the feature that they requested access to.\n\nTo grant that teammate access to the feature, click **Approve**.\n\n<call-out type=\"warning\">\n\n**By clicking \"Approve\" you are giving that teammate full access to the feature!** If you only want to give them limited access to the feature, you must navigate back to their teammate settings to make adjustments to their granular permissions.\n\n</call-out>\n\nIf you do not want to grant them access, click **Deny**.\n\n<call-out>\n\nThe teammate receives a notification email when they are either granted or denied access. SendGrid delivers these emails, but the \"reply to\" address is the email address on file for the account owner.\n\n</call-out>\n\n## Managing Teammates\n\n### Teammates and API Keys\n\nAPI Keys are used to authenticate API calls. Just as a teammate can be given specific permissions, API keys can be assigned specific [permissions](https://sendgrid.api-docs.io/v3.0/api-key-permissions/api-key-permissions) to restrict which API calls they can authenticate.\n\n<call-out>\n\nAPI Keys and Teammates can be used as 2 different methods of restricting access to the same SendGrid features.\n\nHowever, a teammate cannot change their own permissions via API key. For example, a teammate with restricted access to features in the SendGrid user interface but full access to API Keys cannot make an API call to modify their permissions in the user interface.\n\n</call-out>\n\n## Related Resources\n\n- [API Reference](https://sendgrid.api-docs.io/v3.0/teammates/teammates-request-access)\n- [Glossary]({{root_url}}/glossary/teammates/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/tracking.md",
    "content": "---\nseo:\n  title: Tracking Settings\n  description: Track clicks, opens, and subscriptions with SendGrid\n  keywords: click tracking, clicks, open tracking, opens, google analytics, tracking with analytics, subscription tracking\ntitle: Tracking Settings\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\n## Click tracking\n\nEnabling Click Tracking causes all the links and URLs in your emails to be overwritten and pointed to either SendGrid’s servers or the domain you branded your link with so that any time a customer clicks a link, SendGrid can track those [clicks]({{root_url}}/glossary/clicks/). SendGrid can track up to 1000 links per email.\n\n### Settings\n\n**Status** - On or Off\n\n## Google Analytics\n\nFor more information about using this app, please refer to [Google’s URL Builder](https://support.google.com/analytics/answer/1033867?hl=en) and their article on \"[Best Practices for Campaign Building](https://support.google.com/analytics/answer/1037445)\".\n\nWe default the settings to Google’s recommendations. Anything you enter into those fields in the app settings or via API will take precedence. For more information see [Google Analytics]({{root_url}}/ui/analytics-and-reporting/google-analytics/).\n\n### Settings\n\n**Status** - On or Off\n\n**Campaign Source** - Name of the referrer source. (e.g. Google, SomeDomain.com, Marketing Email)\n\n**Campaign Medium** - Name of the marketing medium. (e.g. Email)\n\n**Campaign Term** - Identify paid keywords.\n\n**Campaign Content** - Use to differentiate ads.\n\n**Campaign Name** - Name of the campaign.\n\n## Open Tracking\n\n<call-out>\n\nIf you are using email link branding, then your open tracking image will be served from your branded domain instead of from SendGrid.net.\n\n</call-out>\n\nOpen Tracking adds an invisible, one pixel image at the end of the email which can track email [opens]({{root_url}}/glossary/opens/). If the email recipient has images enabled on their email client and a request to SendGrid’s server for the invisible image is executed, then an open event is logged. These events are logged in the Statistics UI, Email Activity interface, and are reported by the Event Webhook.\n\nWhen using this service customers often ask the difference between a unique open versus an open. A unique open is logged only the first time a given recipient opens the email whereas normal opens are logged for all opens of the email in question.\n\n### Settings\n\n**Status** - On or Off\n\n**Replacement Tag** - If you do not want the open tracking image to be inserted at the end of your email, it is possible to specify an alternative location by using a replacement tag and the open tracking [SMTP API header]({{root_url}}/for-developers/sending-email/smtp-filters/#opentrack).\n\nIf you are sending email through our [v3 Web API](https://sendgrid.api-docs.io/v3.0/mail-send), you may also enable the `open_tracking` parameter, and set the `substitution_tag` parameter to a value of your choice. You may insert that substitution tag anywhere in your email, and it will be replaced with the open tracking image.\n\n**Related Information** - [How Google’s Image Caching effects your opens](https://sendgrid.com/blog/googles-new-image-caching-5-things-need-know/)\n\n## Subscription Tracking\n\nAdd automatic subscription management links to the bottom of emails. SendGrid will keep track of these unsubscribes and ensure these users don’t get future emails from you.\n\nYou can customize the text attached to emails and customize the landing page. The links can be configured in whatever fashion suits your needs.\n\n### Settings\n\n**Replacement Tag** - Your custom defined tag for your templates. Use this to place your unsubscribe URL wherever you want in your template. If you provide this, make sure you put it within an `<a href=` tag. If you don’t provide this, your default unsubscribe content will be automatically added to the bottom of your email.\n\n**HTML Unsubscribe Content** - The information and HTML for your unsubscribe link. In this HTML, you should include the link text you would like displayed in your email within the tag, like so:\n\n```html\n<% Unsubscribe Here %>\n```\n\n**Text Unsubscribe Content** - The information in plain text for your unsubscribe link. You should have the “<% %>” tag in your content, otherwise the user will have no URL for unsubscribing.\n\n**Custom Landing Page URL** - The URL where you would like your users sent to unsubscribe. This must be a valid URL.\n\n**SendGrid Landing Page (HTML)** - The HTML that will be displayed on the page that your customers will see after clicking unsubscribe, hosted on SendGrid’s server.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://sendgrid.com/docs/ui/analytics-and-reporting/subscribing-to-expert-insights/), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/troubleshooting-delays-and-latency.md",
    "content": "---\r\nseo:\r\n  title: Troubleshooting Delays and Latency\r\n  description: Troubleshooting Delays and Latency\r\n  keywords: down, outage, latency, header, intermittent, trace, ping, wireshark, traceroute, hop, node, slowness, having issues?, delivering, after, mins, minutes, seconds, ms, milliseconds, slow, delay, hours, delays\r\ntitle: Troubleshooting Delays and Latency\r\nweight: 0\r\ngroup: troubleshooting\r\nlayout: page\r\nzendesk_id: 203884108\r\nnavigation:\r\n  show: true\r\n---\r\n\r\n<call-out>\r\n\r\nExperiencing delays? Check our [Status Page](http://status.sendgrid.com/) for the current state of all SendGrid Services.\r\n\r\n</call-out>\r\n\r\n As you send emails, you may encounter scenarios where mail seems to take more time than it should to get to its final destination. Mail delays can manifest in a number of ways, so we've collected a list of tips to help you try to track them down!\r\n\r\n### 1. Check these suggestions first:\r\n\r\n**1.** If you are integrated with SendGrid using code, we _highly_ recommend using the official SendGrid libraries available on our [GitHub account](https://github.com/sendgrid). These are written with efficiency in mind. If you need help getting started with our libraries, check out the tutorials in each of the languages:\r\n\r\n* [C Sharp](https://github.com/sendgrid/sendgrid-csharp/blob/master/README.md)\r\n* [PHP](https://github.com/sendgrid/sendgrid-php/blob/master/README.md)\r\n* [Ruby](https://github.com/sendgrid/sendgrid-ruby/blob/master/README.md)\r\n* [Node.js](https://github.com/sendgrid/sendgrid-nodejs/blob/master/README.md)\r\n* [Python](https://github.com/sendgrid/sendgrid-python/blob/master/README.md)\r\n* [Go](https://github.com/sendgrid/sendgrid-go/blob/master/README.md)\r\n* [Java](https://github.com/sendgrid/sendgrid-java/blob/master/README.md)\r\n\r\n**2.** You can use our SMTPAPI to greatly increase your message throughput. As with SMTP, 5000 messages can be sent with each connection, but there can be 1000 [TO: recipients]({{root_url}}/for-developers/sending-email/getting-started-smtp/) for each message using the x-smtpapi header. You can use this option through SMTP sending as well as the [Web API v3]({{root_url}}/api-reference).\r\n\r\n**3.** Lastly, you can try to open additional connections from your end: Generally, we recommend a maximum of 10 concurrent connections. However, please note that SendGrid can generally handle as much mail as you can throw at us. One thing to ensure is to make certain that the maximum amount of mail is passed before terminating each connection. We recommend using caution when incrementing your number of active connections.\r\n\r\n### 2. None of those helped, what else can I try?\r\n\r\nMore often that not, one of the 3 suggestions above will resolve a latency problem. However, some latency issues are simply due to the quality of your connection or traffic shaping. There is always the possibility that network problem issue lies with either yours or your ISPs configuration. Below are a number of methods that will help you determine where a latency issue really is.\r\n\r\n**Hping**\r\n1. We'll begin with [hping](http://www.hping.org/)\r\n (or [Test-NetConnection](https://docs.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection?view=win10-ps) as a Windows alternative).\r\n You should always test hping to help determine response time and TTL (time to live) in milliseconds. In our troubleshooting scenario below, we'll run a hping command to our SMTP server at **smtp.sendgrid.net**\r\n2. How to run hping: Open “terminal”. Type “sudo hping smtp.sendgrid.net -p 587 -S” and you will see a ping occur continually.\r\n```\r\nsudo hping smtp.sendgrid.net -p 587 -S\r\nPassword:\r\nHPING smtp.sendgrid.net (gpd0 169.45.89.186): S set, 40 headers + 0 data bytes\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=0 win=29200 rtt=40.5 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=1 win=29200 rtt=40.5 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=2 win=29200 rtt=45.7 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=3 win=29200 rtt=42.8 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=4 win=29200 rtt=47.2 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=5 win=29200 rtt=51.8 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=6 win=29200 rtt=42.4 ms\r\nlen=44 ip=169.45.89.186 ttl=49 DF id=0 sport=587 flags=SA seq=7 win=29200 rtt=45.2 ms\r\n^C\r\n--- smtp.sendgrid.net hping statistic ---\r\n8 packets tramitted, 8 packets received, 0% packet loss\r\nround-trip min/avg/max = 40.5/44.5/51.8 ms\r\n```\r\n\r\n**Anything exceeding 150.000 ms should be the first indication that something may be amiss regarding your network connection. Let your IT department know pronto.**\r\n\r\n**Hping - traceroute mode**\r\n\r\n1. A traceroute is along the same lines as a ping, you can think of a traceroute as a deeper analysis in the sense that it allows you to see at which “hop” the latency may begin to occur. You are able to see every stop along the route that the packet travels from the customer’s network to SendGrid’s servers. At each stop, details are given as to the address it travels to, and the amount of time to get there also in milliseconds.\r\n2. How to run a traceroute: Open “terminal” and type “sudo hping smtp.sendgrid.net -p 587 -S -T -c 10”\r\n```\r\nsudo hping smtp.sendgrid.net -p 587 -S -T -c 10\r\nHPING smtp.sendgrid.net (en0 169.45.113.201): S set, 40 headers + 0 data bytess\r\nhop=1 TTL 0 during transit from ip=172.22.16.1 name=UNKNOWN\r\nhop=1 hoprtt=2.8 ms\r\nhop=2 TTL 0 during transit from ip=4.31.56.1 name=UNKNOWN\r\nhop=2 hoprtt=15.9 ms\r\nhop=3 TTL 0 during transit from ip=4.69.203.121 name=ae-1-3501.ear3.sanjose1.level3.net\r\nhop=3 hoprtt=28.0 ms\r\nhop=4 TTL 0 during transit from ip=4.7.16.38 name=UNKNOWN\r\nhop=4 hoprtt=25.9 ms\r\nhop=5 TTL 0 during transit from ip=50.97.17.78 name=ae6.cbs02.eq01.sjc02.networklayer.com\r\nhop=5 hoprtt=25.2 ms\r\n```\r\n\r\n**As with the hping method, keep an eye out for any large times over 150.000 ms**. You'll also want to pay close attention to notice if there are any major increases from one hop to the next. This could indicate the inherent latency from when the packet leaves a server in France en route to a server in Canada. Another flag to watch out for are any of the increases early in the transit, as this could mean the latency lies within your local network, or at a certain ISP.\r\n\r\nKeep in mind that many modern network nodes will de-prioritize ICMP packets, which traceroute sends, so timeouts at certain hops may not necessarily be indicative of a faulty connection. That said, a traceroute can still go along way in helping isolate where a network issue exists.\r\n\r\n**Google Header Analyzer**\r\n\r\nGoogle provides a great free [header analyzer tool](https://toolbox.googleapps.com/apps/messageheader/analyzeheader) that you can use to analyze the headers of an email, and find out how long an email spent in a particular location. For more information on how to grab the original headers from an email, [check here]({{root_url}}/ui/sending-email/checking-email-source/).\r\n\r\n1. Grab the headers of the message you want to analyze. Make sure you just grab the received headers, which is everything above the first content boundary.\r\n  ![]({{root_url}}/images/headersnocontent.gif)\r\n2. Paste them into the header analyzer tool and hit the Analyze button.\r\n  ![]({{root_url}}/images/headeranalyzer.gif)\r\n\r\nThe results provided should show the exact journey a message takes from one Mail Transfer Agent to the next, and how long it spent at each one! This tool can be invaluable for figuring out who to \"blame\" for email delays.\r\n\r\n**Wireshark**\r\n\r\n1. In cases the ping and traceroute fail to uncover any obvious lag, a TCP dump or packet capture (PCAP) can tell us a lot. One tool we recommend to help troubleshoot is [Wireshark](https://www.wireshark.org/download.html), as it will capture all packet data from network layers A-D as noted in the network OSI model (missing the physical layer of course). For this reason, it is an extremely thorough tool for analyzing traffic, filtering TCP streams, protocols, and even catching plain text within packets, and much more.\r\n2. Support may ask you for a PCAP sometimes during issue troubleshooting, here is an excellent guide on how to perform the capture and begin using Wireshark  [here](http://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/). Make sure that you capture when attempting to send a single message to SMTP.sendgrid.net. Once we receive the PCAP file from the you, we can open it up in Wireshark on our side. The steps below are the same step[s we would take to analyze such a file, so feel free to follow along!\r\n    1. <u>Filter on SMTP protocol</u>: First things first. Let’s go ahead and use the filter to peer through the rest of the noise of the capture, and find what we are really interested in. To apply the filter, type “smtp” into the filter box as shown below:\r\n      ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_16.png)\r\n    2. <u>Change time view value</u>: Next thing you want to do is to change the time value. As per Wireshark default, it will be currently listed as Year:Month:Day - Hour:Minutes:Seconds:Milliseconds. To help troubleshoot the delay, go ahead and change this time display to show “seconds since previously displayed packet” and “milliseconds”\r\n      ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_15.png)\r\n    3. <u>Follow TCP stream</u>: This will allow you to see the transaction in a logical view. You can also see and verify the content of the message transmitted in plain text. To do so, go to “analyze->follow TCP Stream”\r\n      ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_17.png)\r\n    4. <u>Expert information tool</u>: This view can let you know right away if there are any red flags with which you should be concerned. To access the expert info, navigate to “analyze->expert info”. When viewing this information, pay attention to the “errors”, “notes”, and “chats” sections. From the errors section, you can see if there are any big errors such as a bad checksum as shown in the example. Keep in mind that It's usually OK to ignore checksum errors on outbound packets. When looking at the notes, it will inform you of suspected concerns. In the example, the notes section informs me of a suspected retransmission on packet 113. This is important, as we will determine later. In the chat section, you can see the sequences and protocols of interest with the summaries. So for example, you can see the connection established, the POST, and awaiting a response.\r\n      ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_18.png)\r\n    5. <u>Calculate Time</u>: Last but not least, it is time to apply a quantitative value to our latency we can see within the transaction. The best way to go about this is to change the time view settings once again. This time, you will want to change it to view to show “time of day” once again leaving the display in milliseconds. If you do the math you are able to determine the total round-trip time for the transaction.\r\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/troubleshooting-sender-authentication.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Troubleshooting Sender Authentication\ngroup: troubleshooting\nnavigation:\n  show: true\nseo:\n  title: Troubleshooting Sender Authentication\n  override: true\n  description: Troubleshoot your sender authentication.\n---\n\n## \tMy DNS records aren't validating\n\nAfter you add your CNAME, TEXT or MX records to your DNS host, you need to validate them in the SendGrid UI. If your DNS records aren't validating, try these steps:\n\n ### \tAllow your DNS records to propagate\n\nSome DNS providers take longer than others to update your DNS records with the CNAME files or TEXT and MX files that we ask you to add. Give it up to 48 hours to validate.\n\n ### \tAuto appending\n\nSome DNS hosts will automatically add your top-level domain to the end of DNS records you create, which can turn a CNAME for “email.domain.com” into “email.domain.com.domain.com”.\n\nBe sure to follow the convention on existing records in your DNS panel when adding new ones, as sometimes you will only need to add what is to the left of the top-level domain.\n\nFor example, a CNAME for “email.” becomes “email.domain.com”\n\n ### \tError validating domain: Expected TXT record at...\n\n```\nError validating domain:\nExpected TXT record at \"m1._domainkey.example.com\" to match \"k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHLyl8Wk4J06nv56v5+OeEgp9LW3f/\"\"LOlBjWJ9NS4l9X5UlbPJkKeHDXThTig2CxhVuKmIVvRcc9yJ27Tdthj1C1q0rvRtFpNlHbdrJvD8wpxe5rmFeiRPH1KUYbvtbs84aApMwN6Y3A0dgQE7vGkHnPTjwT7q/xv3mu2CvkVntQIDAQAB\", but got the following error: lookup m1._domainkey.example.com: no such host\n```\n\nIf you get an error like this, the problem is that the text record has been split up. The solution is to combine the key back together into one set of quotes, which looks something like this:\n\n```\n\"k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHLyl8Wk4J06nv56v5+OeEgp9LW3f/LOlBjWJ9NS4l9X5UlbPJkKeHDXThTig2CxhVuKmIVvRcc9yJ27Tdthj1C1q0rvRtFpNlHbdrJvD8wpxe5rmFeiRPH1KUYbvtbs84aApMwN6Y3A0dgQE7vGkHnPTjwT7q/xv3mu2CvkVntQIDAQAB\"\n```\n\n ### \tDNS record duplication\n\nSome DNS providers don't automatically prevent you from duplicating a DNS file. For example, there might be an MX and TEXT record where you are trying to set up a CNAME file. If your DNS files aren't validating, check to make sure there are no other DNS records that could be a duplication.\n\n ### \tMy DNS doesn't accept underscores\n\nSendGrid requires underscores for sender authentication, but some DNS providers do not support underscores in zone file entries.\n\nIf your provider does not allow you to use underscores in zone files, consider changing your DNS hosting provider.\n\nYou can also disable automated security - this allows you to set up TXT and CX records that don't have underscores. For more information about setting up automated security, see [Using automated security]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/#using-automated-security).\n\n ### \tManually validating records\n\nSometimes there is no other option but to manually validate your DNS records. This can be caused by certain DNS providers or by customizations you add to your records.\n\n*To manually validate you DNS files:*\n\n ### \tVerify Your DNS Records Manually\n\nTo validate a DNS record manually, use the  Unix command `DIG`. These examples use **Terminal** on a Mac platform.\n\nThese tables show specific validations. If the **ANSWER** section of the dig return is empty, that usually means that either the record does not exist or has yet to propagate.\n\nExamples:\n\n ### \tDomains\n\n ### \tAutomated Security ON\n\n<table class=\"table\">\n  <tr>\n    <th>Command</th>\n    <th>Type</th>\n    <th>ANSWER</th>\n  </tr>\n  <tr>\n    <td>dig cname sub.domain.com</td>\n    <td>CNAME</td>\n    <td>u123456.wl.sendgrid.net</td>\n  </tr>\n  <tr>\n    <td>dig cname s1._domainkey.sub.domain.com</td>\n    <td>CNAME</td>\n    <td>s1.domainkey.u123456.wl.sendgrid.net</td>\n  </tr>\n  <tr>\n    <td>dig cname s2._domainkey.domain.com</td>\n    <td>CNAME</td>\n    <td>s2.domainkey.u123456.wl.sendgrid.net</td>\n  </tr>\n</table>\n\n ### \tAutomated Security OFF\n\n<table class=\"table\">\n  <tr>\n    <th>Command</th>\n    <th>Type</th>\n    <th>ANSWER</th>\n  </tr>\n  <tr>\n    <td>dig mx sub.domain.com</td>\n    <td>MX</td>\n    <td>mx.sendgrid.net</td>\n  </tr>\n  <tr>\n    <td>dig txt m1._domainkey.sub.domain.com</td>\n    <td>TXT</td>\n    <td>k=rsa; t=s; p=MIGfMA0GC...</td>\n  </tr>\n  <tr>\n    <td>dig txt sub.domainkey.domain.com</td>\n    <td>TXT</td>\n    <td>v=spf1 include:sendgrid.net ~all</td>\n  </tr>\n</table>\n\n ### \tEmail Links\n\n<table class=\"table\">\n  <tr>\n    <th>Command</th>\n    <th>Type</th>\n    <th>ANSWER</th>\n  </tr>\n  <tr>\n    <td>dig cname links.domain.com</td>\n    <td>CNAME</td>\n    <td>sendgrid.net</td>\n  </tr>\n  <tr>\n    <td>dig cname 123456.domain.com</td>\n    <td>CNAME</td>\n    <td>sendgrid.net</td>\n  </tr>\n</table>\n\n ### \tIPs\n\n <table class=\"table\">\n  <tr>\n    <th>Command</th>\n    <th>Type</th>\n    <th>ANSWER</th>\n  </tr>\n  <tr>\n    <td>dig a o1.default.domain.com</td>\n    <td>A</td>\n    <td>12.34.56.78 (your SendGrid IP address)</td>\n  </tr>\n</table>\n\nYou can also use the [DNSLookup](http://mxtoolbox.com/DNSLookup.aspx) tool provided by MxToolbox: enter the record you would like to check, and hit enter.\n\nIf you can successfully verify your DNS changes manually, but it won't validate in the tool, contact [Support](https://support.sendgrid.com/hc/en-us), and we can help you investigate.\n\n## \tWhere is my domain hosted?\n\nIf you aren't sure what DNS provider hosts your domain use this command to find out:\n\n```\ndig <<your_domain.com>> ns\n```\n\n## \tCan I authenticate multiple domains?\n\nYes, it’s possible to authenticate multiple domains. When multiple authenticated domains exist on your account, SendGrid will use the from address for each email you send through SendGrid and match it to a domain and branded link. If the from address does not match an existing authenticated domain, SendGrid will fall back to the domain you have chosen as the default.\n\n## \tDomain authentication application logic\n\nRun through the application logic to understand why your sent emails may not be using `SendGrid.net` instead of the domain you authenticated.\n\n<call-out>\n\nIf SendGrid cannot match your email to a valid authenticated domain, `SendGrid.net` is used.\n\n</call-out>\n\nFor any account, SendGrid attaches authenticated domain information in the following order, starting at the top of the list and applying the domain when the criteria are matched:\n\n1. Valid authenticated domain that matches the domain in the FROM address.\n2. Valid default authenticated domain.\n\n*If no valid authenticated domains can be found, your mail domain defaults to sendgrid.net.*\n\nFor subusers, SendGrid attaches authenticated domain information in the following order, starting at the top of the list and applying the domain when the criteria are matched:\n\n1. Authenticated domain **for this subuser** that matches the domain in the FROM address.\n1. Default authenticated domain **for this subuser**.\n1. Authenticated domain assigned by the parent account to this subuser.\n\n*If no valid authenticated domains can be found, the sending domain defaults to sendgrid.net.*\n\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n## \tAdditional resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [How to set up link branding]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/)\n- [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/)\n\n\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/two-factor-authentication.md",
    "content": "---\nseo:\n title: Two-Factor Authentication\n description: Two-Factor Authentication gives you an extra layer of security to protect your SendGrid account.\n keywords: 2FA, two-factor authentication, authentication, security, authy\ntitle: Two-Factor Authentication\ngroup: account-management\nweight: 0\nlayout: page\nnavigation:\n show: true\n---\n\n<iframe src=\"https://player.vimeo.com/video/248169751\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\nTwo-factor authentication, commonly referred to as multi-factor authentication, allows you to make your SendGrid account more secure by requiring authentication beyond a simple username and password when logging in.\n\n<call-out type=\"warning\">\n\nSendGrid no longer accepts Basic authentication (username and password) for API calls when two-factor authentication is enabled for a user. You can now only use two-factor authentication if you are authenticating with an API key. For more information, see [Authentication]({{root_url}}/for-developers/sending-email/authentication/).\n\n</call-out>\n\nTwilio SendGrid’s Two-Factor Authentication can be configured to accept a code sent to your mobile phone either via the [Authy App](https://www.authy.com/app/mobile/), or an SMS message. Enabling 2FA does not require an Authy account, but if you have one, you will be able to use either the [Authy App](https://www.authy.com/app/mobile/) or SMS messages.\n\n## \tSetting Up Two-Factor Authentication\n \t\nBefore setting up two-factor authentication, ensure you have access to your account email address. You can do this by visiting your [Account Details](https://app.sendgrid.com/account/details) and reviewing your email address under Your Account > Personal Info. \n\nIf you need to update your email address, click the pencil icon to update to an email address you can access, send a confirmation email, and visit your inbox to confirm your email address by clicking the link in the email address change confirmation email. \n\nOnce you have confirmed access to your account email address, you may choose from 2 different verification methods when using two-factor authentication:\n\n1. Generate a verification code with the [Authy App](https://www.authy.com/app/mobile/).\n   The Authy App allows you to authenticate over WiFi if you do not have cellular service and allows you to send your code as an SMS message. If you use Authy, enable the [Authy backup feature](https://authy.com/features/backup/) to help prevent getting locked out of your account.  \n1. Enter a code sent to your mobile phone that is generated by SendGrid.\n\n<call-out type=\"warning\">\n\nWhen authenticating via SMS message, you must have cellular service, or you will not be able to log into your account.\n\n</call-out>\n\n*To set up Two-Factor Authentication:*\n\n1. Navigate to **Settings**, and click **Two-Factor Authentication**.\n <br>From this page, you see an overview of your Two-Factor Authentication settings, along with any settings that you have created for credentialed users.\n1. Click **Add Two-Factor Authentication**.\n1. Select either the Authy App or text messages (SMS) as your means of authentication.\n1. Enter your **country code** and **phone number**.\n\n<call-out>\n\nSubusers and Teammates need to create their own Two-Factor Authentication settings in their account using the same steps.\n\n</call-out>\n\n## \tUsing Two-Factor Authentication\n \t\nAfter you create a setting for Two-Factor Authentication, log in as you normally would. If you opt to receive a text message with your authentication token, look for the text message and enter the code that you receive. If you have selected the Authy App, go to your app, and enter the generated code.\n\nOnce set up, you will always be required to use Two-Factor Authentication to perform security-restricted actions in your SendGrid account, such as logging in or changing your Two-Factor Authentication settings. When prompted, enter the 7-digit token sent to your device, or generated by the Authy App.\n\n## \tAdding Multiple Users\n\nTo provide secure access to multiple users of your account we recommend adding [Teammates](https://sendgrid.com/docs/ui/account-and-settings/teammates/) and enabling two-factor authentication for each Teammate. If you cannot add Teammates, use the [Multi-device feature on Authy](https://support.authy.com/hc/en-us/articles/360016317013-Enable-or-Disable-Authy-Multi-Device). \n\n## \tDisabling Two-Factor Authentication\n \t\n*To disable or delete a Two-Factor Authentication setting:*\n\n1. Navigate to **Settings**, and click **Two-Factor Authentication**.\n1. Find the setting you would like to delete.\n1. Click the **action menu**, and then select **Delete**.\n1. Enter the 7 digit code you receive via text or Authy app into the field and then click **Delete**.\n\n## \tRegaining access to my account after being locked out by Two-Factor Authentication\n \t\nIf you find that you’ve lost access to your account as a result of Two-Factor Authentication, please reach out to the [Authy Support Team](https://support.authy.com/hc/en-us).\n\n## \tAdditional Resources\n \t\n* [Restoring Authy access on lost or inaccessible phones](https://support.authy.com/hc/en-us/articles/115012672088-Restoring-Authy-access-on-lost-or-inaccessible-phones)\n* [The Value of Two-Factor Authentication](https://sendgrid.com/blog/the-value-of-two-factor-authentication/)\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/upgrading-your-account.md",
    "content": "---\nseo:\n  title: Upgrading your Plan\n  description: Upgrading your SendGrid plan\n  keywords: sendgrid account, sendgrid plan, email account, emails per month\ntitle: Upgrading your Plan\nweight: 0\ngroup: account-management\nlayout: page\nnavigation:\n  show: true\n---\n\nWhether you’re a startup or a large enterprise, SendGrid has several plans tailored to meet your email needs.\n\n## Upgrade your SendGrid plan\n\nBefore you can upgrade account, you need to complete some verification steps for security purposes.\n\n<call-out type=\"warning\">\n\nIf you signed up for a Twilio SendGrid account prior to 9/17/2020, skip to the [choose a plan](#choose-a-plan) section of this page.\n\n</call-out>\n\n_To unlock your Twilio SendGrid account:_\n\n1. Confirm your email address. If you need to resend the verification email, click **Resend account verification**. If you entered your email address incorrectly in the initial signup form, you can correct the email address and resend the verification email to the correct address.\n1. Set up [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).\n   Authenticating your domain shows email providers that Twilio SendGrid has your permission to send emails on your behalf.\n\n<call-out>\n\nIf you don't have access to your domain's DNS records, you can use the **Send To A Coworker** feature. This feature allows you to enter a colleague's email address so Twilio SendGrid can send them all the information they need to complete domain authentication on your behalf.\n\n![Send to a coworker tab]({{root_url}}/img/domain-auth-send-to-coworker.png 'Send to a coworker tab')\n\n</call-out>\n\n3. Set up [Two-Factor Authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/)\n\n4. Add a [payment method]({{root_url}}/ui/account-and-settings/billing/#payment-methods). Your card will not be charged at this time.\n\n## SendGrid Plans\n\nTo learn more about each plan, see our [**features comparison**](https://sendgrid.com/pricing/).\n\nIf you’d like to speak with a representative about which plan is right for you, feel free to [**contact us**](https://sendgrid.com/contact-us-form/).\n\n### Email API Free Plan\n\n- 100 emails per day.\n\n### Marketing Campaigns Free Plan\n\nSend to up to 2,000 contacts and 6,000 Emails per month and test all the features of Marketing Campaigns, including Automation.\n\n<call-out>\n\n**Dedicated IP with Email API Pro and Premier and Marketing Campaigns Advanced Plans**\n\nTake control of your sending reputation and deliverability with a dedicated IP address, provided with every Pro, Premier and Advanced plan. [Learn More](https://sendgrid.com/blog/shared-and-dedicated-ips-which-should-you-choose/).\n\n</call-out>\n\n### Choose a plan\n\n_Email API_\n\n1. Decide the plan you upgrade to by reviewing features and comparing your current email send volume to the available plans [here](https://sendgrid.com/pricing).\n1. Navigate to your [**Account Details**](https://app.sendgrid.com/account/products) page, and then click on the **Your Products** tab.\n1. Under **Email API**, select **Change Plan**.\n1. Find the plan you would like to upgrade to and then click **Select**.\n1. Add your payment information in the popup window and then click **Submit**.\n\n<call-out type=\"warning\">\n\nYou will not be able to upgrade you account until you complete the verification steps listed above.\n\n</call-out>\n\n_Marketing Campaigns_\n\n1. Decide the plan you upgrade to by comparing your current contact storage usage and email sends to the available plans [here](https://sendgrid.com/pricing).\n1. Navigate to your [**Account Details**](https://app.sendgrid.com/account/products) page, and then click on the **Your Products** tab.\n1. Under **Marketing Campaigns**, select **Change Plan**.\n1. Find the plan you would like to upgrade to and then click **Select**.\n1. Add your payment information in the popup window and then click **Submit**.\n\n<call-out type=\"warning\">\n\nYou will not be able to upgrade you account until you complete the verification steps listed above.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/account-and-settings/verifying-your-account.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: account-management\ntitle: Verifying your Account\nseo:\n  title: Verifying your Account\n  description: Signed up with SendGrid? Learn more about the steps to complete first...\n  keywords: sign, up, signup, account, verification, 2fa, mfa, two, factor, authentication, auth, getting, started, paid, credits, unlock, verify, 100\nnavigation:\n  show: true\n---\n\nWhen you sign up for a SendGrid account, there are a few steps that our users must complete before they can start using their accounts fully. Once you complete the steps presented, your credit usage limits will be unlocked. We require these steps for your security, as well as to help you get started more quickly!\n\n## Access your Upgrade Options\n\nThe time it takes to completely unlock your account can vary based on how quickly you complete the required steps. The faster you complete the steps, the faster you can start sending!\n\n### Unlock your Free Account\n\nIn order to send email with your free Twilio SendGrid account, you must create and verify a Single Sender. Adding a Sender Identity will help protect your sending reputation and legitimize your account in the eyes of the inbox providers for better deliverability. For more information, see [Single Sender Verification]({{root_url}}/ui/sending-email/sender-verification/).\n\n### Upgrading your Account\n\n1. Confirm your email address. If you need to resend the verification email, click **Resend account verification**. If you entered your email address incorrectly in the initial signup form, you can correct the email address and resend the verification email to the correct address.\n2. Set up [Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/). Authenticating your domain shows email providers that Twilio SendGrid has your permission to send emails on your behalf.\n\n<call-out>\n\nIf you don't have access to your domain's DNS records, you can use the **Send To A Coworker** feature. This feature allows you to enter a colleague's email address so Twilio SendGrid can send them all the information they need to complete domain authentication on your behalf.\n\n![Send to a coworker tab]({{root_url}}/img/domain-auth-send-to-coworker.png 'Send to a coworker tab')\n\n</call-out>\n\n3. Set up [two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/#setting-up-two-factor-authentication). Two-factor authentication allows you to make your SendGrid account more secure by requiring authentication beyond a simple username and password when logging in.\n4. Add a [payment method]({{root_url}}/ui/account-and-settings/billing/#payment-methods). Your card will not be charged at this time.\n\nYou will need to complete all of these steps to completely verify your account. You cannot skip any of the verification steps, or your account won't be unlocked.\n\n<call-out type=\"warning\">\n\nIn some instances our compliance team will need to manually verify your account information before you can start sending. In these cases your account should be unlocked within 72 hours of completing the last account verification step.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/browser-comparison.md",
    "content": "---\nseo:\n  title: Browser Comparison Statistics\n  description: Compare your Browser specific email statistics.\n  keywords: Browser comparison statistics, Compare SendGrid Browser statistics\ntitle: Browser Comparison Statistics\nweight: 0\ngroup: statistics\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\nBrowser information can help optimize your email sending by showing you how different browser usage affects how your recipients interact with your email. As a result, you may want to compare one browser’s statistics to another to see differences or to see if a recent change has made an improvement. The browser comparison tool allows you to do this. You can change the metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tComparison Overview\n\nYour top most graph will show you how each selected browser has fared for the selected individual metric in the donut graph.\n\n## \tIndividual Metrics Comparison\n\nThis graph will show you the browser statistics for the selected metric. To change the metric, select it from the button at the top of the page.\n\nYou can remove individual browsers from the graph by clicking the button above and to the right of this chart and unchecking the boxes next to the browser name. The graph will refresh, showing only the statistics for the selected browser.\n\n## \tIndividual Metrics Figures\n\nThis table is titled “Figures for Delivered” and shows you the actual delivery numbers over time for each of the compared browsers.\n\nYou can also choose to show actual counts or percentages by clicking the corresponding button above and to the right of the table.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n\n## \tAdditional Resources\n\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Subusers]({{root_url}}/ui/analytics-and-reporting/subusers/)\n- [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/browser.md",
    "content": "---\nseo:\n  title: Browser Statistics\n  description: View and filter your Browser specific email statistics.\n  keywords: Browser statistics, SendGrid Browser statistics\ntitle: Browser Statistics\nweight: 0\ngroup: statistics\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\nThe browser statistics report which browsers (such as Safari, Firefox, and Chrome) your recipients use to view your email.\n\n<call-out>\n\nThere are similarities between Device and Browser statistics and we are working on ways to consolidate the data. The current reasoning for 2 separate reports is that in some cases an open from a device can result with a click from a browser that represents the device (e.g. Open on an Iphone -> Click on an Iphone), in other cases an open from one device can result in a click from a different browser (e.g. an Open on a desktop computer -> Click on FireFox).\n\n</call-out>\n\nChoose a browser from the list to see statistics about how your recipients interact with your email based on the application they use to look at the internet.\n\nThe actual statistics included vary depending upon [your account settings]({{root_url}}/ui/account-and-settings/account/). Emails sent, bounces, and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled.\n\nYou can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tFigures\n\nThe figures table gives you all of the specific counts or percentages of each event according to how you’ve grouped your statistics (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April based on the browser, this is a great place to look.\n\nThis table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages by clicking the corresponding button above and to the right of the table.\n\n.<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## \tAdditional Resources\n\n- [Account Settings]({{root_url}}/ui/account-and-settings/account/)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Browser Comparison]({{root_url}}/ui/analytics-and-reporting/browser-comparison/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/categories.md",
    "content": "---\nseo:\n  title: Category Statistics\n  description: View and filter your Category specific SendGrid email statistics.\n  keywords: category statistics, SendGrid category statistics\ntitle: Category Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nThis information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n<call-out>\n\nCategory statistics are available for the previous thirteen months only.\n\n</call-out>\n\nCategories can help organize your email analytics by enabling you to “tag” emails by type. Just as you can view the statistics on all your [email activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/), you can go a step further and view the statistics broken down to a particular category.\n\nThe actual statistics included vary depending upon your [account settings]({{root_url}}/ui/account-and-settings/account/). Emails sent, bounces, and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled.\n\nIn order to see statistics for a category, select the category and the page will show you both a graph and a table of your category’s email statistics.\n\nYou can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## Figures\n\nThe figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your statistics (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April, this is a great place to check.\n\nThis table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\n## Using the API\n\n[Using Categories with the SMTP API]({{root_url}}/for-developers/sending-email/categories/)\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## Additional Resources\n\n- [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Account Settings]({{root_url}}/ui/account-and-settings/account/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/category-comparison.md",
    "content": "---\nseo:\n  title: Category Statistics Comparison\n  description: Compare your email category statistics. SendGrid's simplified, real-time analytics allows you to compare up to 10 email categories to measure results.\n  keywords: compare category statistics, SendGrid compare category statistics, category statistic comparison\ntitle: Category Comparison Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nCategories can help organize your email analytics by enabling you to “tag” emails by type. As a result, you may want to compare one category to another. The category comparison tool allows you to do this.\n\n## Select Your Categories\n\nYou can compare up to 10 categories at a time. To select them, click the **+** sign next to each category name in the left-side list. Then, click **Compare**.\n\n## Comparison Overview\n\nOnce you have selected the categories, your top most graph will show you how each selected category has fared for each individual metric in a single graph. Each category will be assigned a color in this bar chart.\n\nYou can remove individual categories from the list of categories you selected initially, by clicking **Categories** and unchecking categories. The graph will refresh, showing only the selected categories.\n\nYou can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## Individual Metrics Comparison\n\nWhen you initially choose the categories to compare, this graph will be titled “Comparison for Deliveries” and will show you the delivery rates over time for each of the compared categories.\n\nYou can remove individual categories from the list of categories you selected initially, by clicking **Categories** and unchecking categories. The graph will refresh, showing only the selected categories.\n\nTo change this graph to see another metric for your categories, click the button next to the Categories button and choose another metric.\n\n## Individual Metrics Figures\n\nWhen you initially choose the categories to compare, this table will be titled “Figures for Delivered” and will show you the actual delivery numbers over time for each of the compared categories.\n\nYou can remove individual categories from the list of categories you selected initially, by clicking **Categories** and unchecking categories. The graph will refresh, showing only the selected categories.\n\nTo change this graph to see another metric, click the button inline with the graph title and choose another metric.\n\nYou can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## Additional Resources\n\n- [Subusers]({{root_url}}/ui/account-and-settings/subusers/)\n- [Using Categories with the SMTP API]({{root_url}}/for-developers/sending-email/categories/)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/click-tracking-html-best-practices.md",
    "content": "---\nseo:\n  title: Click Tracking & HTML Best Practices\n  description: Click Tracking & HTML Best Practices\n  keywords: a href, /wf/, cname, <a>, http, https, click, html, click_tracking\ntitle: Click Tracking & HTML Best Practices\ngroup: click-tracking\nweight: 0\nlayout: page\nzendesk_id: 200181448\nnavigation:\n  show: true\n---\n\nIf you are experiencing issues with the click tracking setting not replacing your original links, please take a look at your link formatting. Links must be in the proper format in order for our click tracking setting to find and replace them: \nLinks must be within an HTML `<a>` tag with the `href` argument within the tag. There must not be spaces around the `=` in the `href` attribute, the URI must be quoted, and must be preceded by **`\"http://`** or **`\"https://`**. \nHere are some example links that will be properly replaced by our click tracking app:\n\n`<a href=\"http://www.sendgrid.com\">SendGrid</a>`\n\n`<a href=\"https://sendgrid.com\">SendGrid</a>`\n\n`<a target=\"_blank\" href=\"https://sendgrid.com\">SendGrid</a>`\n\nNote that a link shouldn’t be a custom field or buried within a custom field. For example: \n\n`<a href=\"{{ birthday_url }}\"></a>` will not work. Instead you should format your link like this: `<a href=\"http://yoursite.com/{{ birthday_url }}\"></a>`\n{{ user_profile_blurb }} resolves to The quick brown <a href=\"http://google.com\">fox</a> jumps over the lazy dog will also not work.\n\n\nThe following links, even though they may still resolve, will not be captured or replaced by our click tracking system:\n\n`<a href=\"sendgrid.com\">SendGrid</a>`\n\n`<a href=\"www.sendgrid.com\">SendGrid</a>`\n\n`<a href= http://www.sendgrid.com>SendGrid</a>`\n\n`<a href = \"https://sendgrid.com\">SendGrid</a>`\n\n<call-out>\n\nIf you are in the habit of BASE64 encoding your email content, we will be unable to detect the encoded `<a>` tags and overwrite them, so clicks will not be tracked in this case.\n\n</call-out>\n\nClick tracking can be turned off for individual links by including the `clicktracking=off` attribute inside the anchor of an HTML link *before* the `href`. For example, `<a clicktracking=off href=\"http://example.com\">link text</a>` would not be tracked.\n\n\nIf you have a Pro 100K package or higher and you have [authenticated]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/) your sending IP address, the replaced click tracking links lie under the authenticated subdomain. Pro 100K and higher packages that have not authenticated, Essentials packages, and Free packages have click tracking links that resolve through one of SendGrid's domains (sendgrid.net, sendgrid.info, sendgrid.me, etc.).\n\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/click-tracking-ssl.md",
    "content": "---\nseo:\n  title: Setting up SSL for click tracking\ntitle: Setting up SSL for click tracking\ngroup: click-tracking\nlayout: page\nweight: 0\nnavigation:\n  show: true\n---\n\n## \tOverview\n\nSendGrid supports SSL enabled click and open tracking. This feature is enabled automatically if you are using a shared IP address or have a non-authenticated domain. To enable SSL click and open tracking for an authenticated domain, additional configuration for SSL keys is required.\n\n## \tConfiguring SSL Certificates and Keys\n\nIn order for click and open tracking to work over SSL, SendGrid needs to present a valid certificate that will be trusted by the email recipient's browser. For authenticated domains, SendGrid is not able to request and/or manage certificates, as it is not the record owner for the domain.\n\nTo work around this restriction, you may use a CDN service, such as\n[CloudFlare]({{root_url}}/ui/sending-email/content-delivery-networks/#using-cloudflare),\n[Fastly]({{root_url}}/ui/sending-email/content-delivery-networks/#using-fastly), or\n[KeyCDN]({{root_url}}/ui/sending-email/content-delivery-networks/#using-keycdn) to manage certificates and keys for your domain. You can also setup [custom SSL configuration]({{root_url}}/ui/account-and-settings/custom-ssl-configurations/). These services can then forward traffic onwards to SendGrid so that click and open tracking can be performed.\n\nOnce you have followed the configuration guide for either of these\nservices, please [contact support](https://support.sendgrid.com/hc/en-us) and they will enable SSL click and\nopening tracking for you.\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/device.md",
    "content": "---\nseo:\n  title: Device Statistics\n  description: View and filter your device specific email statistics.\n  keywords: Device statistics, SendGrid device statistics\ntitle: Device Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\nThe clients report breaks down which devices and clients are most frequently used to open the mail you send. The devices and types that SendGrid tracks are:\n\n<table class=\"table table-striped\">\n  <tr>\n    <th>Device</th>\n    <th>Description</th>\n  </tr>\n  <tr>\n    <td>Desktop</td>\n    <td>Email software on desktop computer I.E. Outlook, Sparrow, or\n      Apple Mail.</td>\n  </tr>\n  <tr>\n    <td>Webmail</td>\n    <td>A web-based email client (Yahoo, Google, AOL, Outlook.com, etc.).</td>\n  </tr>\n  <tr>\n    <td>Phone</td>\n    <td>A smart phone (iPhone, Android, Blackberry, etc.).</td>\n  </tr>\n  <tr>\n    <td>Tablet</td>\n    <td>A tablet computer (iPad, android based tablet, etc.).</td>\n  </tr>\n  <tr>\n    <td>Other</td>\n    <td>An unrecognized device.</td>\n  </tr>\n</table>\n\n\n\n## \tTop 5\n\nThe top 5 section will show you the most engaged email clients and devices based on the selected metric. By default, clicks are selected, but you can change that by choosing a metric from the button at the top of this section. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tIndividual Metrics Activity\n\nBased on the selected devices and metric at the top of this page, this graph will refresh. You can see how your recipients engage with your emails by device type over time.\n\nYou can remove individual device types from the list at the top of the page. This will affect all the data on this page.\n\nTo change this graph to see another metric for your recipient’s devices, choose the metric from the button at the top of this page.\n\n## \tIndividual Metrics Figures\n\nWhen you initially choose the devices to compare, this graph will show you the actual open numbers over time for each of the compared devices.\n\nYou can remove individual devices from the list of devices at the top of this page. The graph will refresh, showing only the selected subusers.\n\nYou can also choose to show actual counts or percentages by clicking the corresponding button above and to the right of the table.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## \tAdditional Resources\n\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Subusers]({{root_url}}/ui/account-and-settings/subusers/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/email-activity-feed.md",
    "content": "---\nlayout: page\nweight:\ntitle: Email Activity Feed\ngroup: email-activity\nnavigation:\n  show: true\nseo:\n  title: Email Activity Feed\n  override: true\n  description:\n---\n<call-out>\n\nHigher volume users may not have access to the new Email Activity Feed yet. For information about the legacy Email Activity Feed, see [Legacy Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity/).\n\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/259928139\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\nThe Email Activity Feed allows you to view a snapshot of recent email-related activity events associated with your account and any subusers. It makes the delivery flow of each message visible, which expedites troubleshooting. The additional Email Activity history add-on extends event access up to 30 days.\n\nWith the Email Activity feed you can:\n\n* Troubleshoot email delivery issues faster with comprehensive and sequential event data by email message.\n* Pinpoint specific emails easily with advanced search and filter options--including subject line and email metadata.\n* Customize your data independently with the CSV download/export option.\n* View up to 30 days of history when you purchase an upgrade.\n* Call all events by an email message from the API when you purchase additional storage.\n\n<call-out>\n\nReseller accounts and extra high volume accounts do not have access to the new Email Activity Feed. For information about the legacy Email Activity Feed, see [Legacy Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity/)\n\n</call-out>\n\n## \tTypes of email activity data\n\nThe Email Activity Feed allows you to view specific information about messages sent from your account.\n\n<table class=\"table\" style=\"table-layout:fixed\">\n  <tr>\n  <th  >Event</th>\n    <th  >Description</th>\n    </tr>\n    <tr>\n    <td>Processed</td>\n    <td>Requests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed.</td>\n  </tr>\n  <tr>\n    <td>Clicks</td>\n    <td>Whenever a recipient clicks one of the Click Tracked links in your email. In the Email History, SendGrid displays the date, time, and the URL for the link that was clicked.</td>\n  </tr>\n  <tr>\n    <td>Delivered</td>\n    <td>The accepted response generated by the recipients' mail server.</td>\n  </tr>\n  <tr>\n    <td>Opens</td>\n    <td>The response generated by a recipient opening an email.</td>\n  </tr>\n  <tr>\n    <td>Unsubscribes</td>\n    <td>Whenever a recipient unsubscribes from your emails. </td>\n  </tr>\n  <tr>\n    <td>Group Unsubscribes</td>\n    <td>Whenever a recipient unsubscribes from a suppression group.</td>\n  </tr>\n  <tr>\n    <td>Group Resubscribes</td>\n    <td>When a recipient resubscribes themselves to a suppression group.</td>\n  </tr>\n  <tr>\n    <td>Deferred</td>\n    <td>The recipient mail server asked SendGrid to stop sending emails so fast.</td>\n  </tr>\n  <tr>\n    <td>Drops</td>\n    <td>SendGrid will drop an email when the contact on that email is in one of your suppression groups, the recipient email previously bounced, or that recipient has marked your email as spam.</td>\n  </tr>\n  <tr>\n    <td>Bounces </td>\n    <td>The receiving server could not or would not accept the message. If a recipient has previously unsubscribed from your emails, your attempt to send to them is bounced.</td>\n  </tr>\n  <tr>\n    <td>Blocks</td>\n    <td>When your IP address has been blocked by an ISP or messaging organization. Blocks are less severe than bounces and do not result in permanent suppressions: subsequent sends to blocked email addresses are not automatically suppressed.</td>\n  </tr>\n  <tr>\n    <td>Spam Reports</td>\n    <td>Whenever a recipient marks your email as spam and their mail server tells us about it.</td>\n  </tr>\n</table>\n\n<call-out type=\"warning\">\n\nParse events are not available within the Activity Feed. Please utilize your parse endpoint to determine whether or not these events are posting properly.\n\n</call-out>\n\n## \tFiltering email activity\n\nThe Email Activity Feed lists each email sent. Click on each email to view the current list of triggered events for that email. Use our basic or advanced search to filter by email subject, recipients, or event types.\n\n## \tBasic search\n\nThe email address field filters with an approximate, or fuzzy, search. The date field filters events within the specified date range.\n\n<call-out>\n\nTo filter by event type, like in the legacy Email Activity Feed, use [Advanced search](#advanced-search), select Event Type, and choose an event type to filter by.\n\n</call-out>\n\n## \tAdvanced Search\n\nIn addition to viewing the email activity associated with your account by recipient email address, domain, or event date, you can also use the following filters to sort your data:\n\n* API Key ID\n* API Key Name\n* Campaign ID\n* Campaign Name\n* Categories\n* Date Processed\n* Event Type (Bounced, Clicked, etc.)\n* From Email Address\n* Message ID\n* Number of Clicks\n* Number of Opens\n* Requesting IP Address\n* Sending IP Address\n* Status (Delivered, Not Delivered, Processing)\n* Subject Line\n* Teammate\n* To Email Address\n* Transactional Template ID\n* Transactional Template Name\n* Unsubscribe Group ID\n* Unsubscribe Group Name\n\n*To use advanced search:*\n\n1. At the top of the Activity Feed page, click **Advanced** search.\n1. In the field on the far left, select the criteria to filter your event data.\n1. Once you have filled in all of the fields associated with that filter, click **Search**.\n   To add additional search criteria, click **Add a Filter**.\n\n   ![]({{root_url}}/img/EASE_advanced_search_filter.gif \"Email Activity Advanced Search\")\n\n*To further narrow your search results:*\n\n* Search emails by **any** of the following - This search will return more results and will pull in all events that meet *one or more* of the criterion specified by the selected filters.\n* Search emails by **all** of the following - This search will return fewer results and will pull in events that meet *every* criteria specified by the selected filters.\n\n## \tViewing event history\n\n*To view event history:*\n\n1. Navigate to the event you wish to view, and click on the entry.\n   Once the entry loads, you can click into each of the sections to view more details of each email message.\n1. When you have finished reviewing the data, click **Close**.\n\n![]({{root_url}}/img/EASE_email_information.gif \"Email Activity information panel\")\n\n## \tExporting a CSV\n\n*To export a CSV:*\n\n1. In the top right corner of the activity feed, click **Export CSV**.\n   This triggers an email to the email address associated with your SendGrid account.\n1. Open the email and then click **Download**.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## \tAdditional Resources\n\n- [Email Activity API](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages)\n- [Legacy Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity/)\n- [Getting Started with the Email Activity API]({{root_url}}/for-developers/sending-email/getting-started-email-activity-api/)\n- [Building compound Email Activity queries]({{root_url}}/for-developers/sending-email/getting-started-email-activity-api/#creating-compound-queries)\n\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/email-activity.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Legacy Email Activity\ngroup: email-activity\nseo:\n  title: SendGrid Legacy Email Activity\n  description: Email activity allows you to see and search the email events on your account.\n  keywords: email activity, account events, email events, old email activity\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nIf you are looking for the new Email Activity documentation, please go [here]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/).\n\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/130900679\" width=\"500\" height=\"312\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\nThe Email Activity feed allows you to view a snapshot of email-related activity associated with your account. These logs display all of your email events - filter by event type or search by email address.\n\n<call-out>\n\nEmail activity shows the most recent 500 events. To access data in real time, implement our Event Webhook.\n\n</call-out>\n\n## \tFiltering the Activity Feed\n\n*To filter by event type:*\n\n1. On the [Email Activity page](https://app.sendgrid.com/email_activity), in the filter drop down, click the checkbox next to “All Filters”.\n1. Select individual event types to filter.\n    </br>The activity feed refreshes with the event types you selected.\n\n## \tSearching the Activity Feed\n\n*To search the Activity feed by email, mailbox name or domain name:*\n\n- To search by email, enter the recipient’s entire email address into the search field and click enter.\n- To search by mailbox name (the part of an email before the @ symbol), enter the mailbox name into the search field and click enter.\n- To search by domain name (the part of an email after the @ symbol), enter the domain into the search field and click enter.\n\n## \tSubuser email activity\n\nTo see a subuser’s email activity, log in as that subuser or [impersonate]({{root_url}}/ui/account-and-settings/subusers/#impersonating-a-subuser) the subuser account.\n\nYou cannot see a parent accounts email activity from a subuser account.\n\n## \tEmail Events\n\nThe Email Activity feed allows you to view specific information about messages sent from your account.\n\n<table class=\"table\" style=\"table-layout:fixed\">\n  <tr>\n  <th>Event</th>\n    <th>Description</th>\n    </tr>\n    <tr>\n    <td>Processed</td>\n    <td>Requests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed.</td>\n  </tr>\n  <tr>\n    <td>Clicks</td>\n    <td>Whenever a recipient clicks one of the Click Tracked links in your email.</td>\n  </tr>\n  <tr>\n    <td>Delivered</td>\n    <td>The accepted response generated by the recipients' mail server.</td>\n  </tr>\n  <tr>\n    <td>Opens</td>\n    <td>The response generated by a recipient opening an email.</td>\n  </tr>\n  <tr>\n    <td>Unsubscribes</td>\n    <td>Whenever a recipient unsubscribes from your emails. </td>\n  </tr>\n  <tr>\n    <td>Group Unsubscribes</td>\n    <td>Whenever a recipient unsubscribes from a suppression group.</td>\n  </tr>\n  <tr>\n    <td>Group Resubscribes</td>\n    <td>When a recipient resubscribes themselves to a suppression group.</td>\n  </tr>\n  <tr>\n    <td>Deferred</td>\n    <td>The recipient mail server asked SendGrid to stop sending emails so fast.</td>\n  </tr>\n  <tr>\n    <td>Drops</td>\n    <td>SendGrid will drop an email when the contact on that email is in one of your suppression groups, the recipient email previously bounced, or that recipient has marked your email as spam.</td>\n  </tr>\n  <tr>\n    <td>Bounces </td>\n    <td>The receiving server could not or would not accept the message. If a recipient has previously unsubscribed from your emails, your attempt to send to them is bounced.</td>\n  </tr>\n  <tr>\n    <td>Blocks</td>\n    <td>When your IP address has been blocked by an ISP or messaging organization. Blocks are less severe than bounces and do not result in permanent suppressions: subsequent sends to blocked email addresses are not automatically suppressed.</td>\n  </tr>\n  <tr>\n    <td>Spam Reports</td>\n    <td>Whenever a recipient marks your email as spam and their mail server tells us about it.</td>\n  </tr>\n  <tr>\n    <td>Parse</td>\n    <td>Triggered if you're using the Inbound Parse Webhook.</td>\n  </tr>\n</table>\n\n## \tTroubleshooting\n\n ### \tChecking delivery status of a  specific email\n\nYou can check email delivery status by using the Email Activity page, or by using the Event Webhook.\n\n- For a successful delivery, the Email Activity page, or the Event Webhook shows a delivered event - expanding it shows a reason code of 250 OK. This means the receiving server has accepted the message. You can also check bounced, deferred, and processed messages.\n\n- If you can't find an email on the Email Activity page, check your suppression lists; [bounces]({{root_url}}/ui/sending-email/bounces/), [blocks]({{root_url}}/ui/sending-email/blocks/), [spam reports]({{root_url}}/ui/analytics-and-reporting/spam-reports/), [invalid email]({{root_url}}/ui/sending-email/invalid-emails/).\n\n- Have the recipient check their spam folder.\n\n ### \tDeferrals\n\nIn your logs, you may see the following error message accompanying a deferral event:\n\n`Email was deferred due to the following reason(s): [\"IPs reached ISP-suggested hourly limits\" http://send.gd/1uKnEBh]`\n\nThis deferral means you've been going over IP warmup limits on a new IP. For more information about IP Warmup, see [Warming up an IP Address]({{root_url}}/ui/sending-email/warming-up-an-ip-address/).\n\nIn your logs, you may see the following error message accompanying a deferral event:\n\n`Email was deferred due to the following reason(s): [\"IPs reached ISP-suggested max connection limits: http://send.gd/1uKnEBh\"]`\n\nThis deferral is created by SendGrid to control the rate of delivery by ISP to help prevent throttling and spam folder delivery. Sending too much mail too fast can cause different mail providers to be suspicious of the mail, and that impacts deliverability. This automatic deferral was put in place to allow senders to send as much mail as you want at once, without impacting your deliverability.\n\n ### \tDrops\n\nA drop occurs when you try to send a message to an email address listed on one of the suppression lists: Bounces, Unsubscribes, Spam reports and Invalid Emails. If an email is already on one of the lists, our systems automatically drop the email to protect your Sender Reputation.\n\nA dropped message cannot be resent automatically. To resend a message, first [remove the email from the suppression list](#removing-an-email-from-a-suppression-list), and then recreate and resend the email.\n\n ### \tBounces\n\nA bounce is a Drop event that occurs when a message to an address has previously Bounced.\n\nYou can visit the [Bounces list](https://app.sendgrid.com/suppressions/bounces) under the Suppressions tab, and search the address to find the details of the original attempt, such as the date and full error reason code. Once an address is on this list, we do not attempt to deliver further messages to it; we drop the message to protect your external reputation.\n\nA bounced message cannot be resent automatically. To resend a message, first [remove the email from the suppression list](#removing-an-email-from-a-suppression-list), and then recreate and resend the email.\n\n<call-out>\n\nA delayed bounce occurs when a recipient server accepts a message (Delivered) and then is promptly declined (Bounced). This is an infrequent occurrence, and SendGrid treats these messages as a bounce, and any future sends to this address are dropped, unless you remove the email from your bounce suppression list.\n\n</call-out>\n\n ### \tRemoving an email from a suppression list\n\nSendGrid automatically drops emails sent to addresses on suppression lists. If you want to retry sending an email to an address that is on a suppressions list, you need to remove it from the list first.\n\n<call-out type=\"warning\">\n\nOnly remove emails from these lists if you're sure the recipients want to receive the email. Otherwise, continuously sending to recipients who don't want your emails can negatively impact your sender reputation.\n\n</call-out>\n\n*To remove an email from a suppression list:*\n\n1. In the UI, under [Suppressions](https://app.sendgrid.com/suppressions/global_unsubscribes), navigate to the suppression list that you want to remove a recipient from: [Global Unsubscribes](https://app.sendgrid.com/suppressions/global_unsubscribes), [Group Unsubscribes](https://app.sendgrid.com/suppressions/group_unsubscribes), [Bounces](https://app.sendgrid.com/suppressions/bounces), [Spam Reports](https://app.sendgrid.com/suppressions/spam_reports?), [Blocks](https://app.sendgrid.com/suppressions/blocks?), or [Invalid](https://app.sendgrid.com/suppressions/invalid_emails?).\n1. Select the email you want to remove.\n1. In the drop-down menu on the top right of the screen, select **Remove selected emails**.\n\n ### \tSetting up bounce forwarding\n\nYou can receive bounce notifications to a specific address by enabling the \"Forward Bounces\" feature in your account and defining the forwarding address. However, you can also set it to send any bounces back to the originating FROM address.\n\n**To receive a bounce notification report to the FROM address on the email that bounced:**\n\n1. Navigate to **[Mail Settings](https://app.sendgrid.com/settings/mail_settings)** and select **Forward Bounce**.\n1. Toggle the slider to **on**\n1. Leave the \"Use the from address\" box ticked.\n1. Leave the **email address** entry field blank.\n\n<call-out>\n\nIf you are sending bounce messages to a Gmail account, you need to set up an email filter in your inbox to tell Gmail not to send these messages to your spam folder.\n\nWhen Gmail doesn’t see a corresponding message in the sent folder connecting the bounce message, it may decide that the bounce message isn’t valid and send it to spam.\n\nOne way to do this is in the filter, set up **From** `daemon` and **Has the words** `daemon`, and check the box **Never send it to Spam**.\n\n</call-out>\n\nThese are some common issues people see with reading their email activity feed.\n\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/geographic.md",
    "content": "---\nseo:\n  title: Geographic Statistics\n  description: View and compare your geographic location specific email statistics.\n  keywords: Geographic statistics, SendGrid geographic statistics\ntitle: Geographic Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\nThe geographical report shows a map of where your emails are being opened and clicked around the world. It is based purely on where your users live. For example, if you don’t have any recipients engaging with your emails in France, you will not see statistics for France in your stats.\n\n## Top 5\n\nThe top 5 section will show you the most engaged geographical areas based on the selected metric. By default, clicks are selected, but you can change that by choosing a metric from the button at the top of this section. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## Activity Map\n\nThe activity map gives you a visualization of your metric based statistics on an actual map. From the world view, you can click a country to see more specific geographic locations.\n\n## Figures by Location\n\nThe figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your statistics (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April in California, this is a great place to check.\n\nThis table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\nTo see only the figures from a specific geographic area, change the Activity Map to be either the world view or a specific country, then select the countries or states you want to see in the figures table using the buttons just above and to the right of the figures data.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Expert Insights]({{root_url}}/ui/analytics-and-reporting/subscribing-to-expert-insights/), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## Additional Resources\n\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Global Stats](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics)\n- [Timezones]({{root_url}}/glossary/timezone/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/global.md",
    "content": "---\nseo:\n  title: Global Statistics\n  description: View and filter your global SendGrid statistics for your entire account.\n  keywords: Global SendGrid Statistics, SendGrid Global Statistics\ntitle: Global Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nGlobal statistics shown are not an aggregate total for parent accounts and subusers. The statistics outlined will only contain data for whichever account you are currently accessing. Subuser statistics can, however, be accessed from the Parent account's Stats menu either on an individual basis or by comparing multiple subusers.\n\n</call-out>\n\nYour Global Statistics page is where you can really dig into your email statistics. From here you will be able to filter through your statistics by type, and you will also be able to look at the actual numbers for each stat by date. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## Figures\n\nThe figures table gives you all of the specific counts or percentages of each event according to how you’ve grouped your statistics (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the 2nd week of April, this is a great place to check.\n\nThis table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages by clicking the corresponding button above and to the right of the table.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Expert Insights Reports]({{root_url}}/ui/analytics-and-reporting/subscribing-to-expert-insights), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## Additional Resources\n\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Global Statistics](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics)\n- [Timezones]({{root_url}}/glossary/timezone/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/google-analytics.md",
    "content": "---\nseo:\n  title: Google Analytics and SendGrid Statistics\n  description: Google Analytics Demystified&#58; GA Statistics vs SG Statistics\n  keywords: statistics, page, tracking, URL, google, analytics, GA, stats, events, view, UTM\ntitle: Google Analytics and SendGrid Statistics\ngroup: statistics\nweight: 0\nlayout: page\nzendesk_id: 200181468\nnavigation:\n  show: true\n---\n\nSendGrid's [Google Analytics Tracking ](https://app.sendgrid.com/settings/tracking)appends links to integrate with Google Analytics.\n\n[Google Analytics](http://support.google.com/analytics/?hl=en) is a great tool for tracking how people get to your site and what they do there.\n\nThis article describes differences in the results and terminology of both. In general what they track and what terms they use are different than what we do, so we thought it would be helpful to provide the following equivalencies.\n\nGoogle Analytics has Clicks, Visits, Visitors, Pageviews, and Unique Pageviews. SendGrid has Clicks and Opens, as well as all of our [Statistics]({{root_url}}/ui/analytics-and-reporting/stats-overview/).\n\nThe key here is that Google Analytics Clicks **are in no way related**  to SendGrid Clicks.\n\nGoogle Analytics **Visits** should generally correlate to SendGrid **Unique Clicks**. However:\n\n- If you link to a non-GA tracked site, there will be more Clicks than Visits.\n- If a user clicks a link in an email multiple times within the 30 minute Analytics \"session\" window, there will be a Click for every time they clicked, but only one Unique Click and one Visit.\n- If have links to multiple GA-tracked sites in a single email, you'll have a Visit logged in each, but only one Unique Click. Unique Clicks are tracked per message, not per link in the message.\n- If a recipient forwards a message, or revisits your site after 30 minutes, you'll have more Visits than Unique Clicks, though there will be a Click for each. Currently, we cannot differentiate when a message has been forwarded, so there's only one Unique Click.\n\nA few scenarios:\n\n- You link to your Facebook profile in your email. A recipient clicks the link, which will result in 1 SG **Click** , but no GA **Visits**.\n- A recipient clicks a link in your message, forwards it to their friend who also clicks a link, or they re-open it in a new browser/device. This will log 1 **Unique Click** , 2 **Clicks** , 2 **Visitors** , and 2 **Visits**.\n- A recipient clicks a link in your message, comes back an hour later, and clicks the same or a different link in the message to get back to your site. This will log 1 **Unique Click** , 2 **Clicks** , 1 **Visitor** , and 2 **Visits**.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/interpreting-expert-insights.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Interpreting Expert Insights\ngroup: expert-insights\nseo:\n  title: Interpreting Expert Insights\n  description: Learn how to interpret your Expert Insights report\n  keywords:\nnavigation:\n  show: true\n\n---\n\nThe Expert Insights report contains delivery and engagement metrics from email sent through SendGrid. The report is divided into four sections:\n* At a Glance\n* Sent\n* Delivered\n* Opened and Clicked\n\n<call-out>\n\nWhen you subscribe to Expert Insights, you get access to email strategies and best practices curated by our experts, including step-by-step instructions for how to resolve issues highlighted in the report.\n\n</call-out>\n\n## What data is being used to generate the Expert Insights Report\n\nIn the Expert Insights report, we primarily use unique rates instead of raw numbers. We report the percentage of unique messages that were clicked or opened instead of dividing the number of opens or clicks by the number of messages. This is done to avoid double counting multiple opens or clicks of the same message. For example, if someone takes a link you included in your email and posts it on Twitter where it is clicked thousands of times, it will look like your open or click rate is much higher than 100% and it will skew your understanding of your actual open and click rate.\n\nYou might notice that the data in these reports differ from data that you see in SendGrid’s user interface (UI). That’s because, in these reports, we look at what was sent during the reporting period and what happened to those specific campaigns. Our UI displays activity statistics by date and not by message so that senders have a snapshot of the performance of all campaigns in a given time frame.\n\n<call-out>\n\nFor privacy reasons, your first Expert Insights report will cover 37 days of data, or as much time as you’ve been a SendGrid customer. Areas of the report that look back past 37 days will be populated over time.\n\n</call-out>\n\n## What does the color coding mean\n\nIn order to make the report as digestible as possible, we have coded your data using the following grading scale:\n\n<table>\n  <tr>\n    <th>Color </th>\n    <th>Description</th>\n  </tr>\n  <tr>\n    <td>Green</td>\n    <td>Indicates that a metric has stayed approximately the same or improved slightly since the last report and no changes are needed.</td>\n  </tr>\n  <tr>\n    <td>Yellow</td>\n    <td>Indicates that a metric has decreased slightly since the last report so you should monitor its performance and make suggested changes.</td>\n  </tr>\n  <tr>\n    <td>Red</td>\n    <td>Indicates that a metric has decreased significantly enough since the last report to warrant your attention and changes are strongly recommended.</td>\n  </tr>\n  <tr>\n    <td>Gray</td>\n    <td>Neutral.</td>\n  </tr>\n</table>\n\nEach segment of your report has its own thresholds. See table below for specific thresholds.\n\n**Threshold per segment in report**\n\n<table>\n  <tr>\n    <th>Element of Report </th>\n    <th>Green</th>\n    <th>Yellow</th>\n    <th>Red</th>\n    <th>Neutral</th>\n  </tr>\n  <tr>\n    <td>Email Funnel - Sent</td>\n    <td>---</td>\n    <td>---</td>\n    <td>---</td>\n    <td>Always Neutral</td>\n  </tr>\n  <tr>\n    <td>Email Funnel - Delivered</td>\n    <td>&gt;,= 98%</td>\n    <td>95% - 98%</td>\n    <td>&lt;,= 95%</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Email Funnel - Delivered % Change</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Email Funnel - Opened</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Email Funnel - Clicked</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>MSP Performance</td>\n    <td>---</td>\n    <td>95% - 98% [98 Not inclusive]</td>\n    <td>&lt;,= 95%</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>MSP Variance - Delivered % Change</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>MSP Variance - Opened</td>\n    <td>&gt;0%</td>\n    <td>0% - 50% Decrease</td>\n    <td>&gt;,= 50% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>MSP Variance - Clicked</td>\n    <td>&gt;0%</td>\n    <td>0% - 70% Decrease</td>\n    <td>&gt;,= 70% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Category - Sent (30 Days)</td>\n    <td>---</td>\n    <td>---</td>\n    <td>---</td>\n    <td>Always Neutral</td>\n  </tr>\n  <tr>\n    <td>Category - Delivered (30 Days)</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Category - Opened (30 Days)</td>\n    <td>&gt;0%</td>\n    <td>0% - 50% Decrease</td>\n    <td>&gt;,= 50% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Category - Clicked (30 Days)</td>\n    <td>&gt;0%</td>\n    <td>0% - 70% Decrease</td>\n    <td>&gt;,= 70% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Category - Sent (90 Days)</td>\n    <td>---</td>\n    <td>---</td>\n    <td>---</td>\n    <td>Always Neutral</td>\n  </tr>\n  <tr>\n    <td>Category - Delivered (90 Days)</td>\n    <td>&gt;,= 98%</td>\n    <td>95% - 98%</td>\n    <td>&lt;,= 95%</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Category - Opened (90 Days)</td>\n    <td>---</td>\n    <td>---</td>\n    <td>---</td>\n    <td>Always Neutral</td>\n  </tr>\n  <tr>\n    <td>Category - Clicked (90 Days)</td>\n    <td>---</td>\n    <td>---</td>\n    <td>---</td>\n    <td>Always Neutral</td>\n  </tr>\n  <tr>\n    <td>Emails Not Reaching the Inbox</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>ISP - Blocks (change from last period)</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Bounces</td>\n    <td>&lt;,= 1%</td>\n    <td>1% - 3%</td>\n    <td>&gt;,= 3%</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Spam Traps - Pristine</td>\n    <td>Neg Infinity to 0% [inclusive]</td>\n    <td>0% - 20% Increase</td>\n    <td>&gt;,= 20% Increase</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Spam Traps - Pristine</td>\n    <td>Neg Infinity to 0% [inclusive]</td>\n    <td>0% - 20% Increase</td>\n    <td>&gt;,= 20% Increase</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Spam Traps - Recycled</td>\n    <td>Neg Infinity to 0% [inclusive]</td>\n    <td>0% - 20% Increase</td>\n    <td>&gt;,= 20% Increase</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Spam Traps - Typo</td>\n    <td>Neg Infinity to 0% [inclusive]</td>\n    <td>0% - 20% Increase</td>\n    <td>&gt;,= 20% Increase</td>\n    <td>---</td>\n  </tr>\n  <tr>\n    <td>Unsubscribes - Category (change from last period)</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Spam Complaints - Category (change from last period)</td>\n    <td>&gt;0%</td>\n    <td>0% - 20% Decrease</td>\n    <td>&gt;,= 20% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Open Rate - 30 Days</td>\n    <td>&gt;0%</td>\n    <td>0% - 50% Decrease</td>\n    <td>&gt;,= 50% Decrease</td>\n    <td>0%</td>\n  </tr>\n  <tr>\n    <td>Click Rate - 30 Days</td>\n    <td>&gt;0%</td>\n    <td>0% - 70% Decrease</td>\n    <td>&gt;,= 70% Decrease</td>\n    <td>0%</td>\n  </tr>\n</table>\n\n## How data from mailbox providers or ISP (inbox service provider) is shown\n\nThroughout the report, we provide data on how your email is performing at top mailbox providers. A mailbox provider or ISP (inbox service provider) is an organization that provides services for recipients to receive mail and send one-to-one communication. In this report, we include:\n* Gmail (gmail.com)\n* Microsoft (hotmail.com, outlook.com, live.com, msn.com)\n* Yahoo (yahoo.com, ymail.com)\n* AOL (aol.com, aim.com)\n* ‘Other’ (all remaining domains, including business and international domains)\n* ‘All’ (all domains combined) – we’ll assess the performance of your mailbox providers by comparing them to the ‘All’ category as your baseline.\n\n##  At a Glance\n\nIn this section of the report, you’ll see a snapshot of your overall deliverability health and email marketing performance. You’ll see:\n\n<table>\n  <tr>\n    <th>Term</th>\n    <th>Definition</th>\n  </tr>\n  <tr>\n    <td>Total Sent</td>\n    <td>This refers to the total messages we attempt to deliver to mailbox providers after we remove the addresses listed in your suppression list.</td>\n  </tr>\n  <tr>\n    <td>Total Delivered</td>\n    <td>This is calculated by dividing the total volume of emails delivered by the total volume of emails sent. Note: “delivered” doesn’t necessarily mean your email hit the inbox—just that it was accepted by the receiving server and wasn’t bounced or rejected. Mailbox providers can accept “delivery” of a message and place it in the spam folder or other destinations outside of your main/primary inbox.</td>\n  </tr>\n  <tr>\n    <td>Total Unique Opened</td>\n    <td>This is the total unique opens percentage is the number of unique individuals that have opened your emails. The unique open rate is that number divided by the total number of delivered messages.</td>\n  </tr>\n  <tr>\n    <td>Total Unique Clicked</td>\n    <td>This is the total unique clicks percentage is the number of unique individuals that have clicked the links in your emails. The unique click rate is that number divided by the total number of delivered messages.</td>\n  </tr>\n</table>\n\n##  Sent Section\n\nThis section analyzes the volume of emails sent during this reporting period. The volume of email sent on any given day influences deliverability metrics and can give insight into why certain deliverability metrics may be higher or lower than in previous periods.\n\nIn the **Is your Email Volume Impacting Deliverability** chart, we show you how your sending volume might be impacting leakage. We calculate leakage by combining your bounced and blocked emails. Senders who are experiencing an issue with leakage will see a thicker purple line, as in the chart below.\n\n![]({{root_url}}/img/emailvolumechart-expertinsights.png)\n##  Delivered Section\n\nThis section analyzes the factors that contribute to your sender reputation. Typically, an email is not delivered to a recipient’s inbox because it is either bounced or blocked by the mailbox service provider. High bounce rates are commonly caused by misspelled or nonexistent email addresses. High block rates occur when the recipient email address is valid but something else about this message caused the message to be undeliverable, which can be as simple as a mailbox being full or more urgent like being added to a deny list.\n\nIn the **IP Health by Delivered Rate** chart, we determine your IP health based on numerous backend metrics and health indicators.\n\n##  Open and Clicked Section\n\nIn the **Top and Bottom Performing Subject Lines by Category** charts, we highlight your top and bottom performing campaigns so that you can identify the best practices for your audience and apply them throughout your email program. We’ve made these calculations by weighing your higher volume campaigns more on engagement than lower volume campaigns and scoring your lower volume campaigns towards the median, thus removing your 1:1 transactional or smaller marketing campaigns.\n\nIn the **Unique Opens by Device** chart, we define the categories as follows:\n\n<table class=\"table table-striped\">\n  <tr>\n    <th>Device</th>\n    <th>Description</th>\n  </tr>\n  <tr>\n    <td>Desktop</td>\n    <td>Email software on desktop computer I.E. Outlook, Sparrow, or\n      Apple Mail.</td>\n  </tr>\n  <tr>\n    <td>Webmail</td>\n    <td>A web-based email client (Yahoo, Google, AOL, Outlook.com, etc.).</td>\n  </tr>\n  <tr>\n    <td>Phone</td>\n    <td>A smart phone (iPhone, Android, Blackberry, etc.).</td>\n  </tr>\n  <tr>\n    <td>Tablet</td>\n    <td>A tablet computer (iPad, android based tablet, etc.).</td>\n  </tr>\n  <tr>\n    <td>Other</td>\n    <td>An unrecognized device.</td>\n  </tr>\n</table>\n\n\n  <call-out>\n\nNeed additional help? SendGrid's team of Email Consultants have over 95 years of combined email experience. If you're having any email issues or would like advice on how to optimize engagement, [talk to one of our consultants](https://sendgrid.com/contact-expert-services/) today!\n\n  </call-out>\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/mailbox-provider-comparison.md",
    "content": "---\nseo:\n  title: Mailbox Provider Comparison Statistics\n  description: Compare your Mailbox Provider specific email statistics.\n  keywords: Mailbox Provider comparison statistics, Compare SendGrid Mailbox Provider statistics\ntitle: Mailbox Provider Comparison\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n\n<call-out>\n\nParent accounts will see aggregated statistics for their account and all subuser accounts. Subuser accounts will only see their own statistics.\n\n</call-out>\n\nMailbox provider information can help optimize your email sending by showing you how different mailbox providers affect how your recipients interact with your email. As a result, you may want to compare one mailbox provider to another to see differences or to see if a recent change has made an improvement. The mailbox provider comparison tool allows you to do this. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tComparison Overview\n\nYour top most graph will show you how each selected mailbox provider has fared for the selected individual metric in the donut graph (mmm donuts).\n\n## \tIndividual Metrics Comparison\n\nThis graph will show you the mailbox provider statistics for the selected metric. To change the metric, select it from the button at the top of the page.\n\nYou can remove individual providers from the graph by clicking the button above and to the right of this chart and unchecking the boxes next to the provider name. The graph will refresh, showing only the statistics for the selected mailbox providers.\n\n## \tIndividual Metrics Figures\n\nThis table will be titled “Figures for Delivered” and will show you the actual delivery numbers over time for each of the compared providers.\n\nYou can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## \tAdditional Resources\n\n- [Mailbox Provider Stats](https://app.sendgrid.com/statistics/mailbox_provider)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n- [Account Settings]({{root_url}}/ui/account-and-settings/account/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/marketing-campaigns-stats-overview.md",
    "content": "---\nseo:\n  title: Marketing Campaigns Statistics Overview\n  description: Understand each statistic available for Twilio SendGrid Marketing Campaigns.\n  keywords: analytics-and-reporting, SendGrid analytics-and-reporting, analytics-and-reporting Overview, analytics-and-reporting UI, marketing campaigns\ntitle: Marketing Campaigns Statistics Overview\ngroup: statistics\nlayout: page\nnavigation:\n  show: true\n---\n\nAs a Marketing Campaigns customer, you can export statistics about your Single Sends and Automations. The following statistics are available for export in comma separated values (CSV) format.\n\nStats marked with an asterisk, \\*, are also displayed within the SendGrid App's user interface (UI). Stats that are displayed in the UI for A/B Testing only are marked with a double asterisk, \\*\\*.\n\n## Statistics\n\n### Requests\\*\n\nThe number of emails you asked Marketing Campaigns to deliver. Each attempt to send email to your customers via SendGrid is considered a [request]({{root_url}}/glossary/request/).\n\n### Delivered\\*\n\nThe number of emails that were accepted by the receiving inbox server. Delivered is calculated as the number of emails requested minus the number of emails that were [suppressed]({{root_url}}/ui/sending-email/index-suppressions/), [bounced]({{root_url}}/glossary/bounces/), or [blocked]({{root_url}}/glossary/blocks/). See our [delivery]({{root_url}}/glossary/deliveries/) glossary entry for more about email delivery and deliverability.\n\n- Please note that delivered doesn’t necessarily mean your email hit the inbox, just that it was accepted by the receiving server and wasn’t bounced or rejected. Mailbox providers can accept “delivery” of a message and place it in the spam folder or other destinations outside of recipients’ main/primary inboxes.\n- To view the cumulative Delivered Rate (Delivered/Requests) in the SendGrid App as a cumulative percentage to-date, click the action menu and choose “View stats as percentages.”\n\n### Total Opens\\*\\*\n\nThe number of times that your email was opened, including multiple opens by the same recipient. See our [Total Opens]({{root_url}}/glossary/opens/) glossary entry for more about total opens and unique opens.\n\n- In legacy Marketing Campaigns, this is called “Opens.”\n\n### Daily Total Open Rate\n\nCalculated by dividing the Total Opens by Delivered for each day in your CSV export.\n\n- In legacy Marketing Campaigns, this is called “Daily Open Rate.”\n\n### Cumulative Total Open Rate\n\nCalculated by aggregating the number of Total Opens on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- In legacy Marketing Campaigns, this is called “Cumulative Open Rate.”\n\n### Unique Opens\\*\n\nThe number of unique recipients that opened your email, regardless of how many times an individual may have opened the email. Learn more about opens and unique opens in our [Unique Opens]({{root_url}}/glossary/opens/) glossary entry.\n\n### Daily Unique Open Rate\n\nCalculated by dividing the Unique Opens by Delivered for each day in your CSV export.\n\n### Cumulative Unique Open Rate\\*\n\nCalculated by aggregating the number of Unique Opens on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- To view in the UI as a cumulative percentage to-date, click the action menu and choose “View stats as percentages”\n\n### Total Clicks\\*\\*\n\nThe number of times that recipients clicked within your email, including multiple clicks by the same recipient on the same links.\n\n- In legacy Marketing Campaigns, this is called “Clicks.”\n\n### Daily Total Click Rate\n\nCalculated by dividing the Total Clicks by Delivered for each day in your CSV export. This is also commonly referred to as the Click Through Rate.\n\n- In the email marketing industry, Unique Click Rate is commonly referred to as Total Click Through Rate.\n- In legacy Marketing Campaigns, this is called “Daily Click Rate.”\n\n### Cumulative Total Click Rate\n\nCalculated by aggregating the number of Total Clicks on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- In the email marketing industry, Unique Click Rate is commonly referred to as Total Click Through Rate.\n- In legacy Marketing Campaigns, this is called “Cumulative Click Rate.”\n\n### Unique Clicks\\*\n\nThe number of unique recipients that clicked your email, regardless of how many times an individual may have clicked within the email.\n\n### Daily Unique Click Rate\n\nCalculated by dividing the Unique Clicks by Delivered for each day in your CSV export.\n\n- In the email marketing industry, Unique Click Rate is commonly referred to as Click Through Rate.\n\n### Cumulative Unique Click Rate\\*\n\nCalculated by aggregating the number of Unique Clicks on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- In the email marketing industry, Unique Click Rate is commonly referred to as Click Through Rate.\n- To view in the UI as a cumulative percentage to-date, click the action menu and choose “View stats as percentages”\n\n### Daily Unique Click-to-Open Rate\\*\\*\n\nCalculated by dividing the Unique Clicks by Unique Opens for each day in your CSV export.\n\n- In legacy Marketing Campaigns, this is called “CTR” or “Click Through Rate”\n\n### Daily Total Click-to-Open Rate\\*\\*\n\nCalculated by dividing the Total Clicks by Total Opens for each day in your CSV export.\n\n- In legacy Marketing Campaigns, this is called “TCTR” or “Total Click Through Rate”\n\n### Bounces\\*\n\nThe number of emails that bounced instead of being delivered. Learn more about bounces in our [Bounces]({{root_url}}/glossary/bounces/) glossary entry.\n\n### Daily Bounce Rate\n\nCalculated by dividing the Bounces by Delivered for each day in your CSV export.\n\n### Cumulative Bounce Rate\\*\n\nCalculated by aggregating the number of Bounces on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- To view in the UI as a cumulative percentage to-date, click the action menu and choose “View stats as percentages”\n\n### Bounce Drops\n\nThe number of emails that Marketing Campaigns [dropped]({{root_url}}/glossary/drops/) or did not send to because the recipient is on your Bounced list.\n\n### Spam Reports\\*\n\nThe number of recipients who marked your email as spam.\n\n### Daily Spam Reports Rate\n\nCalculated by dividing the Spam Reports by Delivered for each day in your CSV export.\n\n### Cumulative Spam Reports Rate\\*\n\nCalculated by aggregating the number of Bounces on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- To view in the UI as a cumulative percentage to-date, click the action menu and choose “View stats as percentages”\n\n### Spam Report Drops\n\nThe number of emails that Marketing Campaigns [dropped]({{root_url}}/glossary/drops/) or did not send because the recipient is on your Spam Report list.\n\n### Unsubscribes\\*\n\nThe number of recipients who chose to unsubscribe from within the specific email.\n\n### Daily Unsubscribe Rate\n\nCalculated by dividing the Unsubscribes by Delivered for each day in your CSV export.\n\n### Cumulative Unsubscribe Rate\\*\n\nCalculated by aggregating the number of Unsubscribes on a given day with the preceding days, and dividing that by the aggregate of Delivered emails for that day and preceding days.\n\n- To view in the UI as a cumulative percentage to-date, click the action menu and choose “View stats as percentages.”\n\n### Invalid Emails\n\nThe number of recipient email addresses you attempted to send to that were not formatted correctly. Learn more in our [Invalid Emails]({{root_url}}/glossary/invalid-email/) glossary entry.\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/marketing-campaigns-stats.md",
    "content": "---\nlayout: page\nweight: 40\ntitle: Marketing Campaigns Statistics\ngroup: statistics\nnavigation:\n  show: true\nseo:\n  title: Marketing Campaigns Statistics\n  override: true\n  description:\n---\n\n​\n<call-out>\n​\nThis page refers to the new Marketing Campaigns product. If you’re using legacy Marketing Campaigns, your workflow will be a little different and your screen won’t look the same as the screenshots.\n​\n</call-out>\n​\nWith Marketing Campaigns email statistics, you can unlock the full potential with the right data at your fingertips. Use your data to guide you to the right strategy. Get insights about both marketing and transactional email for a 360-degree understand of your audience’s experience. Finally, use your data to brings results to life and share your performance with teammates and stakeholders.\n​\n\n## Viewing Single Send or Automation Statistics\n\nOnce you send a Single Send or set an Automation live, you can view related statistics.\n​\n\n1. Navigate to the Single Send or Automation you want to view the statistics for.\n1. Click the name of the Single Send or Automation to view the statistics.\n   ​\n   From the statistics page, you will be able to see your bounces, clicks, opens, etc.\n   ​\n   <call-out>\n   ​\n   Want deeper data and insights? With [SendGrid Email Insights Reports](https://go.sendgrid.com/Email-Insights-Reports.html?utm_source=docs), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n   ​\n   </call-out>\n\n​\n\n## Click Tracking\n\nWith click tracking, you can see how many clicks each individual link in your Single Sends and Automation emails received. Marketing Campaigns lists each link separately, including links that appear multiple times. For example, links that appear at both the top and bottom of an email.\n​\nMarketing Campaigns will provide the \"URL location\" for each link, ordered top left to bottom right. You can use this to identify the link if multiple URLs are the same, and to understand which link locations are more or less engaging.\n\n<call-out>\n\nClick tracking was released on 7/16/2020. To enable click tracking for automations set live prior to 7/16/2020, pause the automation and set it to live once again. Click tracking will populate data from 7/16/2020 onward regardless of when it is set live.\n\nClick tracking is not available for Single Sends sent prior to 7/16/20.\n\n</call-out>\n\n### Click Tracking for A/B tests\n\n​\nA/B tests are a special case for link click tracking.\n​\n![Link tracking results]({{root_url}}/img/link-tracking-tne.png 'Link tracking results')\n​\nEach tab shows all-time clicks for each of the variants sent as part of a test sample size, as opposed to clicks just earned during the testing period. For example, if the sample size for a Single Send was 100 emails for each variant, you would see the engagement with those 100 emails inclusive of and beyond the test period. In other words, if the test period is 24 hours, but someone who received the test email opened it 48 hours later, that click would be included in the variant tab.\n​\nThis means that if the winner were selected by clicks, there's a chance that in a test period, Version B could win, but over time, Version A could end up earning more clicks.\n​\n\n## Additional Resources\n\n- [Sending a Campaign]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n- [A/B Testing Your Campaign]({{root_url}}/ui/sending-email/a-b-testing/)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/migrating-from-the-new-relic-plugin.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Migrating from The SendGrid for New Relic Plugin\ngroup: partners\nnavigation:\n  show: true\nseo:\n  title:  Migrating from the SendGrid for New Relic Plugin\n---\n\n<call-out type=\"warning\">\n\nStarting Wednesday June 16, 2021, New Relic will [no longer support or maintain plugins](https://discuss.newrelic.com/t/new-relic-plugin-eol-wednesday-june-16th-2021/127267).\n\nAfter June 16, 2021, you will no longer be able to access visualizations of your email statistics without changes to your New Relic dashboard. To make these changes, follow the guide on this page.\n\n**If you do not utilize New Relic to see email statistics, then there is no action needed from you.**\n\n</call-out>\n\n<call-out type=\"warning\">\n\nThe following guide will not work for customers using New Relic’s [High Security Mode](https://docs.newrelic.com/docs/agents/manage-apm-agents/configuration/high-security-mode/). If you are, or believe you may be, using New Relic's High Security Mode, please contact the [New Relic support team](https://support.newrelic.com/) for assistance.\n\n</call-out>\n\nThe legacy SendGrid for New Relic plugin provided the following four charts.\n* **Deliveries**: This shows Average aggregations for Requests, Drops, Deferrals, Delivered\n* **Engagement**: This shows Average aggregations for Unsubscribes, Clicks, Unique Opens and Opens\n* **Compliance**: This shows Average aggregations for Bounces, Spamreports and Blocked\n* **Percentage**: Shows percentages for various stats\n\nYou can follow the instructions in this document to build each chart without relying on the plugin. The quickest way to construct your dashboards is by importing them using our prebuilt queries, which you'll find in the [\"Import prebuilt dashboards\"](#import-prebuilt-dashboards) section. You can also build your dashboards manually by following the steps in the [\"Build your dashboards manually\"](#build-your-dashboards-manually) section.\n\nBecause we make it possible to view stats for Subusers, there are separate prebuilt dashboards and instructions to create dashboards with or without Subuser support.\n\n**Legacy plugin view**\n\n![A legacy New Relic dashboard built with the SendGrid for New Relic Plugin]({{root_url}}/img/NR_OldPluginView.jpg 'Legacy New Relic plugin dashboard')\n\n## Import prebuilt dashboards\n\nYou can import one of the Twilio SendGrid prebuilt dashboards after specifying your New Relic AccountID in the template. For more information about working with dashboards, please see the [New Relic Dashboards documentation](https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/introduction-dashboards/).\n\n*To retrieve your New Relic Account ID*\n\n1. Navigate to **Manage your plan** in your New Relic account settings as shown below.\n\n![The New Relic account settings page]({{root_url}}/img/NR_FindAccountNumber.jpg 'Manage your plan')\n\n<call-out>\n\nDepending on your organization structure in New Relic, you may find your AccountID in different ways. See the [New Relic documentation](https://docs.newrelic.com/docs/accounts/accounts-billing/account-setup/account-id/) if you are unable to locate your ID.\n\n</call-out>\n\n## Importing dashboards\n\nThe two prebuilt JSON files below allow you to import a dashboard with or without support for Subuser statistics. The process for importing a dashboard is the same when using either file.\n\n* [TwilioSendGrid\\_Sample\\_Dashboard\\_NoSubusers.json]({{root_url}}/assets/TwilioSendGrid_Sample_Dashboard_NoSubusers.json)\n* [TwilioSendGrid\\_Sample\\_Dashboard\\_WithSubusers.json]({{root_url}}/assets/TwilioSendGrid_Sample_Dashboard_WithSubusers.json)\n\n*To import the prebuilt dashboard*\n\n1. Locate the `\"accountId\"` field in the JSON file you selected and replace its value with your AccountID.\n2. From your New Relic dashboards page, select **Import a dashboard**.\n3. Paste the dashboard JSON from the linked file above, and the dashboard will be created.\n\n![Import a dashboard]({{root_url}}/img/NR_ImportDashboard.jpg 'Import a dashboard')\n\nOnce imported, a dashboard without Subusers will look like the following screenshot. Make sure you select a date range for which  you know statistics will be available.\n\n![Example imported dashboard]({{root_url}}/img/NR_StandardDashboardViewWithoutSubusers.jpg 'Example imported dashboard')\n\nA dashboard with support for Subusers will provide multiple views. The main, or parent, account for a dashboard with Subusers will look like the following screenshot.\n\n*To view the main dashboard*\n\n1. Click on **TwilioSendgrid**.\n2. Select a date range for which you know statistics will be available.\n\n![Example imported dashboard with Subusers on the main user]({{root_url}}/img/NR_SubuserDashboard_SelectMainUser.jpg 'Example imported dashboard with Subusers')\n\nTo view a specific Subuser's stats\n\n1. Click on the Subuser.\n2. Select a date range for which you know statistics will be available.\n\n![Example imported dashboard for a specific Subusers]({{root_url}}/img/NR_SubuserDashboard_SelectSubuser.jpg 'Example imported dashboard for a specific Subusers')\n\n## Build your dashboards manually\n\nIf the prebuilt templates don't work as you expect, you can build your dashboards from scratch.\n\n### Add data to a dashboard\n\nThe following sections of this guide assumes you have already created a New Relic dashboard. For help creating a dashboard, see the [New Relic dashboard documentation](https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/introduction-dashboards/#:~:text=You%20can%20easily%20create%20a,corner%20of%20the%20dashboards%20index.).\n\n*To add data to your dashboard*\n\n1. Click the **Add to your Dashboard** (**+**) button.\n\n![Add to your dashboard]({{root_url}}/img/NR_AddToDashboard.jpg 'Add to your dashboard')\n\n2. A page menu will load with options to add to your dashboard. Select **Add a chart**. This option will allow you to add a query.\n\n![Add to your dashboard menu]({{root_url}}/img/NR_AddAChart.jpg 'Add to your dashboard menu')\n\n3. Select [NRQL](https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/introduction-nrql-new-relics-query-language/#what-is-nrql).\n\n![Add NRQL query]({{root_url}}/img/NR_SelectNRQL.jpg 'Add NRQL query')\n\n4. You will now be able to add an NRQL query to visualize your SendGrid statistics. The following query displays all stats for Deliveries using an average aggregate function.\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Deliveries/{Stat}'\n  TIMESERIES FACET Stat\n```\n\n<call-out>\n\nYou can use any of the [NRQL aggregate functions](https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#aggregator-functions) you like.  The legacy SendGrid for New Relic plugin showed Average.\n\n</call-out>\n\n5. Click **Run**. This will run the query and retrieve the specified statistics.\n6. Name the chart \"Deliveries.\"\n7. Click **Save**.\n\n![Save added query]({{root_url}}/img/NR_CreateChartWithNRQLAndSave.jpg 'Save added query')\n\nYou can now select a timeline to view your stats.\n\n![Select a timeline]({{root_url}}/img/NR_SelectTimeline.jpg 'Select a timeline')\n\nNow that we know how to add a chart with a query, most of the charts are similar except a few that are covered in the next section.\n\n### Add charts without Subusers\n\nThe following queries will allow you to visualize your Deliveries, Engagement, Compliance, and Percentage data. For more information about working with the Twilio SendGrid Stats API, see our [API reference](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics).\n\nTo add these queries to your dashboard, follow the process outlined in the previous [\"Add data to a dashboard\"](#add-data-to-a-dashboard) section.\n\n#### Deliveries\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Deliveries/{Stat}'\n  TIMESERIES FACET Stat\n```\n\n#### Engagement\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Engagement/{Stat}'\n  TIMESERIES FACET Stat\n```\n\n#### Compliance\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Compliance/{Stat}'\n  TIMESERIES FACET Stat\n```\n\n#### Percentage\n\nA percentage is not a TIMESERIES and must be viewed as a table or bar. Be sure to set up your percentage appropriately when selecting a **Chart type**.\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND StatPercent LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/{Categories}/{StatPercent}'\n   FACET Categories, StatPercent\n```\n\n![Select a Chart type for your percentage query]({{root_url}}/img/NR_PercentageChartForNonSubuser.jpg 'Select a Chart type')\n\n### Add charts with Subuser support\n\nThe following queries allow you to build charts with Subuser support. Before using these queries, you must first add a User Widget. This Users Widget is needed to view statistics for either the main account (under **TwilioSendgrid**) or one of the Subusers. The widget queries and pulls all Users.\n\n**To add the Users Widget**\n\n1. Add the following NRQL query to your dashboard.\n\n```SQL\nFROM Metric SELECT MIN(newrelic.timeslice.value) as MIN\n  WHERE appName = 'Twilio SendGrid'\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/{Categories}'\n  FACET AllUsers\n```\n\n2. Set the **Chart type** to **Table**.\n\n![Set up the Users Widget]({{root_url}}/img/NR_AllUsersWidgetAsTable.jpg 'Set up the Users Widget')\n\nWith the Users Widget in place, you can add the following queries to visualize your Deliveries, Engagement, Compliance, and Percentage data for your main account and any Subuser. For more information about working with the Twilio SendGrid Stats API, see our [API reference](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics).\n\nTo add these queries to your dashboard, follow the process outlined in the previous [\"Add data to a dashboard\"](#add-data-to-a-dashboard) section.\n\n#### Deliveries with Subusers\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Deliveries/{Stat}'\n  TIMESERIES FACET AllUsers, Stat\n```\n\n#### Engagement with Subusers\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Engagement/{Stat}'\n  TIMESERIES FACET AllUsers, Stat\n```\n\n#### Compliance with Subusers\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Compliance/{Stat}'\n  TIMESERIES FACET AllUsers, Stat\n```\n\n#### Percentage with Subusers\n\nA percentage is not a TIMESERIES and must be viewed as a table or bar. Be sure to set up your percentage appropriately when selecting a **Chart type**.\n\n```SQL\nFROM Metric SELECT average(newrelic.timeslice.value)\n  WHERE appName = 'Twilio SendGrid' AND StatPercent LIKE '%Percent'\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/{Categories}/{StatPercent}'\n   FACET AllUsers, StatPercent\n```\n\n![Select a Chart type for your percentage query with Subusers]({{root_url}}/img/NR_PercentageChartWithSubuser.jpg 'Select a Chart type')\n\n### View all custom metrics\n\nIt is also possible to view all custom metrics using New Relic.\n\n*To view all custom metrics available*\n\n1. Click **New Relic One** at the top left corner and navigate to **APM**.\n2. Click **Twilio SendGrid** to load the \"Explorer view.\"\n\n![Load the Explorer view]({{root_url}}/img/NR_ViewCustomMetrics_Step1.jpg 'Load the explorer view')\n\n3. From the left navigation, scroll down all the way and expand **More views**.\n4. Click on **Metrics Explorer** and select the appropriate timeline to view the custom metrics. You can now search and browse specific custom metrics.\n\n![A list of all custom metrics]({{root_url}}/img/NR_ViewCustomMetrics_Step2.jpg 'A list of all custom metrics')\n\n## Troubleshooting\n\n* Make sure you select a time range containing some expected stats, or else nothing will populate.\n* Sometimes New Relic dashboards error. Refreshing the dashboard usually fixes the problem.\n* Stats captured from the legacy SendGrid for New Relic plugin will not be visible when using the new integration.\n\n## Additional resources\n\n* [How to query APM metric timeslice data](https://docs.newrelic.com/docs/telemetry-data-platform/understand-data/metric-data/query-apm-metric-timeslice-data-nrql/).\n* [Introduction to NRQL](https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/introduction-nrql-new-relics-query-language/#what-is-nrql).\n* [Introdution to New Relic Dashboards](https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/introduction-dashboards/#:~:text=You%20can%20easily%20create%20a,corner%20of%20the%20dashboards%20index).\n* [NRQL aggregate functions](https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#aggregator-functions).\n\n## FAQ\n\n**What is the purpose of the Min column in the Users widget?**\n\nYou can ignore the Min column. When creating a query to retrieve all Subusers along with the main parent user, we used an aggregate function, which is required to build the dashboard. However, the value of this function is not needed, and it is not possible to delete the aggregate function. For this reason, you can safely ignore the Min column.\n\n**Can I view my Twilio Sendgrid stats without using the New Relic integration?**\n\nYou can use Twilio Sendgrid APIs to retrieve the raw stats numbers. For more information about working with the Twilio SendGrid Stats API, see our [API reference](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics).\n\n**Why don't I see any Stats on my dashboard?**\n\nMake sure you have selected an appropriate time range in which you expect some Stats.\n\n**Who do I contact for help related to NRQL or building a dashboard?**\n\nThough we have provided guidelines here, for any questions or issues related to NRQL or building Dashboards, please refer to the linked [New Relic documentation]() or [contact their support team](https://support.newrelic.com/).\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/spam-reports.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Spam Reports\ngroup: tracking\nseo:\n  title: Spam Reports\n  description: When a recipient marks your email as spam, their mail provider will let SendGrid know. We will help to prevent you from sending email to this recipient again.\n  keywords: spam reports, recipient spam report, recipient marked as spam, spam email report\nnavigation:\n  show: true\n---\n\n[Spam reports]({{root_url}}/glossary/spam-reports/) happen when a recipient indicates that they think your email is [spam]({{root_url}}/glossary/spam/) and then their email provider tells SendGrid. The list provided here can be filtered by email address or date.\n\n## Searching Spam Reports by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the spam report dates you would like to search between. Your recipient list will refresh, showing the recipients who marked your email as spam between these dates.\n\n## Removing Recipients From The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list.\n\n## Download Spam Reports as CSV\n\nYou can download your Global Unsubscribe list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away.\n\n## Additional Resources\n\n- [Spam Reports API]({{root_url}}/api-reference/)\n- [Invalid Emails API]({{root_url}}/api-reference/)\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n### Looking for more visibility into your email performance?\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/stats-overview.md",
    "content": "---\nseo:\n  title: Statistics Overview\n  description: View and filter all of your SendGrid account email statistics.\n  keywords: analytics-and-reporting, SendGrid analytics-and-reporting, analytics-and-reporting Overview, analytics-and-reporting UI\ntitle: Statistics Overview\ngroup: statistics\nweight: 100\nlayout: page\nnavigation:\n  show: true\n---\n\nTracking your emails is an important part of being a good sender and learning about how your users interact with your email. This includes everything from basics of clicks and opens to looking at which browsers and mailbox providers your customers use.\n\nWe have broken up statistics in specific ways so that you can get at-a-glance data, as well as allowing you to get into the details of how your email is being used.\n\n## Available Email Reports\n\n<call-out>\n\nThe timezone for statistics pages is set in your [account settings]({{root_url}}/ui/account-and-settings/account/).\n\n</call-out>\n\n**Overview** - The overview is your at-a-glance statistics. We give you the highlight reel so that you can keep an eye out for any issues and make sure you’re on the right track.\n\n**[Global Statistics]({{root_url}}/ui/analytics-and-reporting/global/)** - All of your statistics, aggregated in one place so you can see the high level view of everything.\n\n**[Category Statistics]({{root_url}}/ui/analytics-and-reporting/categories/)** -You can define your categories when you send, so that you can view your email performance by category later.\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n<call-out>\n\nCategory statistics are available for the previous thirteen months only.\n\n</call-out>\n\n**[Category Comparison]({{root_url}}/ui/analytics-and-reporting/category-comparison/)** - Compare the performance of emails from up to 10 categories against each other.\n\n**[Subuser Statistics]({{root_url}}/ui/analytics-and-reporting/subuser/)** - You can segment your email to be sent by different subusers, which allows you to compare how each type or subset of your email is performing.\n\n**[Subuser Comparison]({{root_url}}/ui/analytics-and-reporting/subuser-comparison/)** - Compare the performance of emails from up to 10 subusers against each other.\n\n**[Geographical]({{root_url}}/ui/analytics-and-reporting/geographic/)** - See where you get the best engagement and compare engagement by geographical region.\n\n**[Email Clients and Devices]({{root_url}}/ui/analytics-and-reporting/device/)** - Find out which applications and devices your recipients use to view your mail and see the statistics for each.\n\n**Mailbox Provider Statistics** - See all the statistics for the mailbox providers your recipients use.\n\n**[Mailbox Provider Comparison]({{root_url}}/ui/analytics-and-reporting/mailbox-provider-comparison/)** - Compare the performance of emails by statistic and provider.\n\n**[Browser Statistics]({{root_url}}/ui/analytics-and-reporting/browser/)** - See all the statistics for the web browsers your users view your emails from.\n\n**[Browser Comparison]({{root_url}}/ui/analytics-and-reporting/browser-comparison/)** - Compare the performance of your emails by statistic and browser.\n\n**[Parse Webhook]({{root_url}}/for-developers/parsing-email/inbound-email/)** - View the number of requests you have received via the Parse Webhook.\n\n## Metrics\n\n \t<p>\nOn the available statistics reports, you will find that your deliverability is broken down by the following metrics. Each one gives you a different piece of information about how SendGrid or your recipients interact with your email.\n</p>\n<p>\n\n**[Blocks]({{root_url}}/glossary/blocks/)** - The number of emails that were not allowed to be delivered by ISPs.\n\n**[Bounces]({{root_url}}/glossary/bounces/)** - The number of emails that bounced instead of being delivered.\n\n**[Clicks]({{root_url}}/glossary/clicks/)** - The number of links that were clicked in your emails.\n\n**[Delivered]({{root_url}}/glossary/deliveries/)** - The number of emails SendGrid was able to confirm were actually delivered to a recipient.\n\n**Invalid Emails** - The number of recipients that you sent emails to, who had malformed email addresses or whose mail provider reported the address as invalid.\n\n**[Opens]({{root_url}}/glossary/opens/)** - The total number of times your emails were opened by recipients.\n\n**[Requests]({{root_url}}/glossary/request/)** - The number of emails you requested to send via SendGrid.\n\n**[Spam Reports]({{root_url}}/glossary/spam-reports/)** - The number of recipients who marked your email as spam.\n\n**[Unique Opens]({{root_url}}/glossary/opens/)** - The number of unique recipients who opened your emails.\n\n**[Unique Clicks]({{root_url}}/glossary/clicks/)** - The number of unique recipients who clicked links in your emails.\n\n**Unsubscribes** - The number of recipients who unsubscribed from your emails.\n\n**Unsubscribe Drops** - The number of emails dropped by SendGrid because the recipient unsubscribed from your emails.\n\n## Filters\n\nThese filters are available on most of the statistics pages. They will help you see your statistics in more or less details, depending on your needs.\n\n**Metric Filters** - You can select all of the metrics or only some of them.\n\n**Date Filters** - To display statistics between specific dates, choose your date range.\n\n**Grouping Filter** - Display statistics grouped by day, week, or month.\n\n## Top 5 Categories\n\nThe Top 5 Categories report allows you to see your top 5 most used categories by number of requests. Switch your view by actual number of emails or percentage using the toggle at the top right of this section.\n\n<call-out>\n\nWant deeper data and insights? With [SendGrid Email Insights Reports]({{root_url}}/ui/analytics-and-reporting/subscribing-to-expert-insights/), you’ll get access to more data about your email performance plus customized insights from a deliverability consultant.\n\n</call-out>\n\n## Additional Resources\n\n- [API Statistics Overview](https://sendgrid.api-docs.io/v3.0/stats/retrieve-global-email-statistics)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/subscribing-to-expert-insights.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Subscribing to Expert Insights\ngroup: expert-insights\nseo:\n  title: Subscribe to Expert Insights\n  description: Learn how subscribing to the Expert Insights Report can enhance your email performance\n  keywords:\nnavigation:\n  show: true\n---\n\nExpert Insights is a monthly report that will give you deeper visibility into the health and performance of your email program. This report equips you with the data and insights you need to reach the inbox and increase your email ROI. **See an example of [Expert Insights report.](https://sendgrid.com/wp-content/uploads/pdf/Expert-Insights-Sample.pdf)**\n\nExpert Insights is designed to help you:\n\n- Understand your performance trends in an easy-to-understand, shareable format.\n- Identify areas of improvement with in-depth data on the factors that impact deliverability.\n- Know exactly what to do if you run into an issue with step-by-step instructions from our experts.\n\n## How Expert Insights Works\n\nExpert Insights analyzes your email funnel, providing visibility into how your email is performing as it is sent, delivered, opened, and clicked by your recipients. The report highlights any potential leakage points (for example, blocked emails) and opportunities to improve deliverability and engagement based on our deep expertise in email. This report spans a calendar month. Throughout the report, we compare data period-to-period (30-days to the previous 30-days).\n\nTo get the most out of Expert Insights, we recommend that customers have [click- and open-tracking enabled]({{root_url}}/ui/account-and-settings/tracking/) and that customers use categories to separate their email data.\n\n<call-out>\n\nFor privacy reasons, your first Expert Insights report will cover 37 days of data or as much time as you’ve been a SendGrid customer. If you're a new customer, SendGrid will populate areas of the report that look back past 37 days over time.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n[Categories](https://sendgrid.com/docs/ui/analytics-and-reporting/categories/) help organize your email analytics by enabling you to tag emails you send by topics you define. We recommend using 3-5 categories so we can provide more detailed email analytics in your Expert Insights report.\n\nReports are generated per [subuser.](https://sendgrid.com/docs/ui/account-and-settings/subusers/) Please reach out to our [Sales team](https://sendgrid.com/contact-us-form/) to purchase reports for multiple subusers.\n\n## How to Subscribe to Expert Insights\n\n1. Before you purchase Expert Insights, you will need to determine the subusers that you want to us to run a report on and where we should email the reports. We can send your reports to up to 3 email addresses.\n1. Pro customers can purchase Expert Insights directly on their [Billing page.](https://app.sendgrid.com/account/billing) If you’re a Premier customer, please [contact sales](https://sendgrid.com/expert-services-questions/) or speak to your Customer Success Manager to purchase Expert Insights.\n1. After you complete your purchase, you will receive your first report at the email addresses you’ve provided us as well as at your account administration email address within 1-2 business days. Moving forward, Expert Insights will appear on your regular monthly [invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/). If you purchase the report before the first of the month, prorated charges for your report will appear on your next invoice, as well as the full charge for next month’s report.\n1. We will send your monthly report to the emails you’ve provided us at the beginning of each month.\n\n<call-out>\n\nCurrently, only Pro and Premier accounts can purchase Expert Insights.\n\n</call-out>\n\n<call-out>\n\nNeed additional help? SendGrid's team of Email Consultants have over 95 years of combined email experience. If you're having any email issues or would like advice on how to optimize engagement, [talk to one of our consultants](https://sendgrid.com/contact-expert-services/) today.\n\n</call-out>\n\n## Managing Your Expert Insights Subscription\n\nPlease reach out to our [Support team](https://support.sendgrid.com/hc/en-us) at any time to change the email recipients of your monthly reports or the subuser that the report pertains to.\n\n- Pro customers can cancel their Expert Insights directly on their [Billing page.](https://app.sendgrid.com/account/billing)\n- Premier customers should reach out to their Customer Success Manager to cancel their subscription.\n- If you cancel your Expert Insights subscription, you will no longer receive monthly reports. This change is reflected on your invoice in the following month.\n- If you have would like to cancel your subscription for a specific user or users, please contact our [Support team.](https://support.sendgrid.com/hc/en-us)\n\nYou will still receive a report if you have paid for a report this month but have not yet received it. This will be your final report. We will immediately stop collecting your data after your last report. While you can always re-purchase Expert Insights through our [Sales Team,](https://sendgrid.com/expert-services-questions/) note that you will see a gap in your report data if you do so.\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/subuser-comparison.md",
    "content": "---\nseo:\n  title: Subuser Statistics Comparison\n  description: View and compare your subuser specific email statistics.\n  keywords: compare subuser statistics, SendGrid compare subuser statistics, subuser statistic comparison\ntitle: Subuser Statistics Comparison\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out>\n\nThis page refers to our beta UI functionality. To find these features, please click the “Beta” button at the top of the SendGrid UI.\n\n</call-out>\n\n<call-out>\n\nOn all other statistics pages, your subuser statistics are “rolled up” into the parent account’s statistics. From this page, you can see how each subuser affects your overall statistics.\n\n</call-out>\n\nSubusers can help organize your email sending an analytics by enabling you to segment by a different sender and IP address. As a result, you may want to compare one subuser to another. The category comparison tool allows you to do this. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tSelect Your Subusers\n\nYou can compare up to 10 subusers at a time. To select them, click the “+” sign next to each subuser name in the left-side list. Then, click the “Compare” button.\n\n## \tComparison Overview\n\nOnce you have selected the subusers, your top most graph will show you how each selected subuser has fared for each individual metric in a single graph. Each subuser will be assigned a color in this bar chart.\n\nYou can remove individual subusers from the list of subusers you selected initially, by clicking the “Subusers” button and unchecking subusers. The graph will refresh, showing only the selected subusers.\n\n## \tIndividual Metrics Comparison\n\nWhen you initially choose the subusers to compare, this graph will be titled “Comparison for Deliveries” and will show you the delivery rates over time for each of the compared subusers.\n\nYou can remove individual subusers from the list of categories you selected initially, by clicking the “Subusers” button and unchecking subusers. The graph will refresh, showing only the selected subusers.\n\nTo change this graph to see another metric for your subusers, click the button next to the “Subusers” button and choose another metric.\n\n## \tIndividual Metrics Figures\n\nWhen you initially choose the subusers to compare, this table will be titled “Figures for Delivered” and will show you the actual delivery numbers over time for each of the compared subusers.\n\nYou can remove individual subusers from the list of categories you selected initially, by clicking the “Subusers” button and unchecking subusers. The graph will refresh, showing only the selected subusers.\n\nTo change this graph to see another metric, click the button inline with the graph title and choose another metric.\n\nYou can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\n## \tAdditional Resources\n\n- [Subuser Statistics]({{root_url}}/ui/analytics-and-reporting/subuser/)\n- [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/subuser.md",
    "content": "---\nseo:\n  title: Subuser Statistics\n  description: View and filter your subuser specific SendGrid email statistics.\n  keywords: Subuser statistics, SendGrid subuser statistics\ntitle: Subuser Statistics\ngroup: statistics\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nSubusers can help organize your email sending and analytics by enabling you to segment by a different sender and IP address. Just as you can view the statistics on all your [email activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/), you can go a step further and view the statistics broken down to a particular subuser.\n\nThe actual statistics included vary depending upon your [account settings]({{root_url}}/ui/account-and-settings/account/). Emails sent, bounces, and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled.\n\nIn order to see statistics for a subuser, select the subuser and the page will show you both a graph and a table of email statistics.\n\nYou can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters).\n\n## \tFigures\n\nThe figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your statistics (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April, this is a great place to check.\n\nThis table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table.\n\n## \tAdditional Resources\n\n- [Subuser Statistics Comparison]({{root_url}}/ui/analytics-and-reporting/subuser-comparison/)\n- [Email Activity]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)\n- [Statistics Filters]({{root_url}}/ui/analytics-and-reporting/stats-overview/#statistics-filters)\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/tracking-data-with-keen-io.md",
    "content": "---\nlayout: page\nweight: 90\ngroup: partners\ntitle: Email Event Data with Keen\nnavigation:\n  show: true\nseo:\n  title:  Email Event Data with Keen\n---\n\nThe SendGrid [Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) lets you stream all [email events]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/) directly to [Keen](https://keen.io/users/signup?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs) for real-time analysis and long term raw storage.\n\nIt only takes a couple of minutes to start streaming email event data from SendGrid to Keen, and once you do, you’ll get tools to create flexible email analytics and stunning email marketing dashboards.\n\n ## \tSend your SendGrid Data to Keen\n \n To get started, the first thing you'll need to do is create create a Keen and SendGrid account. \n\n 1. Create a [Keen account](https://keen.io/users/signup?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs). \n 1. Add a new project in the Keen UI for your SendGrid Email Event Data.\n 1. Copy your Project ID and API Write Key from the Access tab.\n 1. Create a [SendGrid account](https://sendgrid.com/user/signup). \n\n### Activate SendGrid's Event Notification App\n\n 1. Log into your SendGrid account.\n 1. Navigate to **Settings** from the left menu. \n 1.Select [**Mail Settings**](http://app.sendgrid.com/settings/mail_settings) and then click **Event Webhook**.\n\n ![SendGrid- Mail Settings - Event Webhook]({{root_url}}/images/keen/sendgrid_mailsettings_eventwebhook.png)\n\n### Set the HTTP POST URL\n\nThe HTTP Post URL is the endpoint where SendGrid will stream all of your email data.\n ```\n https://api.keen.io/3.0/projects/YOUR_KEEN_PROJECT_ID/email/sendgrid/1.0?api_key=YOUR_KEEN_API_WRITE_KEY\n ```\n1. Copy and paste the above URL into the HTTP POST URL field. Make sure to replace `YOUR_KEEN_PROJECT_ID` and `YOUR_KEEN_API_WRITE_KEY` with your Project ID and API Write Key available in the Access tab. Set Authorization Method to **None**.\n2. In the settings, select the events you want to post to Keen (why not all of them?). To do this, check **Select All** under **Events to be POSTed to your URL**. You can refer to SendGrid’s [event documentation]({{root_url}}/for-developers/tracking-events/event/) for more information on these events.\n\nThat’s it! Now, as your emails make their way through SendGrid, all of the event information will be posted to Keen. A new Event Collection, aptly named for each type of email event, will be created within your Keen Project.\n\n\n ## Testing Your Integration\n\nTo test that everything is working, navigate to **Event Webhook Settings** in the SendGrid app and then click **\"Test Your Integration\"**. This will send sample email data from SendGrid into your Keen Project. In the Keen UI, navigate to the **Streams** tab to check for sample SendGrid data. After you've confirmed the data was sent, enable the Event Webhook and your SendGrid email data will now be sent to Keen in real-time.\n\n\n ## Your Data: SendGrid Data Models\n\nIn the SendGrid app, navigate to **Mail Settings** and then select  **Event Webhook**. Each email event type that is selected will be recorded as a separate Event Collection in your Keen project. We recommended checking **Select All** to access full functionality of the Keen app’s reporting.\n\n The email events that are recorded are:\n\n- `email_bounce`\n- `email_click`\n- `email_deferred`\n- `email_delivered`\n- `email_dropped`\n- `email_group_resubscribe`\n- `email_group_unsubscribe`\n- `email_open`\n- `email_processed`\n- `email_spamreport`\n- `email_unsubscribe`\n\nAs SendGrid email data streams to Keen, it will be enhanced using Keen's [Data Enrichment](https://keen.io/docs/streams/data-enrichment-overview/) capabilities. Keen’s data enrichments turn IP addresses into geographic locations and break out timestamps, URLs, and user agent strings into more easy-to-use data such as `device type`, `day_of_the_week`, and URL `path`.\n\nTo explore all of the email data you have at your fingertips, log into your Keen account, select your Project with SendGrid data and open the **Streams** tab. In the search bar type in “email” to check out your data collections associated with SendGrid email data. You can click into an email event like `email_open` to view all of the different data you have to work with.\n\n<call-out>\n\nUse the property `message_id` or `singlesend_name` contained in each event to track a particular email across all of these possible actions. Similarly, you can follow a particular user's behavior via the `email` property.\n\n</call-out> \n\n## \tHow to Use the Data Explorer\n\n![Keen Open Rate Query]({{root_url}}/images/keen/sendgrid_open_rate_query.png)\n\nKeen’s Data Explorer enables you to create powerful email marketing metrics by running queries on your Sendgrid event data. You can also use filters, timeframes and groupings to view different cuts of the data. After you’ve created your email metrics, you can present them all in one place using Keen’s Dashboard Creator.\n\nCheck out Keen’s tutorial on [how to build a SendGrid email analytics dashboard](https://www.keen.io/blog/how-to-build-sendgrid-email-marketing-dashboard-with-keenio?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs) to learn more!\n\n## Embedding SendGrid Analytics Into Your App\n\nWith Keen, you will have access to all of your raw data for as long as you need it. An archive of all of your email data is created, which means you will have access to your historical data and can query for past user behavior.\n\nJust like SendGrid, Keen is 100% powered by APIs. This means you can embed rich analytics anywhere you can write code.\n\nMany SendGrid users find it useful to embed these email analytics into a report if they need to share the results with a client. Here’s a link to our [Customer Facing Analytics Guide](https://keen.io/docs/visualize/customer-facing-analytics/) that will give you step-by-step instructions on how to embed your SendGrid analytics into your product. You can also grab a shareable link in the Dashboard Creator. Some users also take advantage of Keen's [S3 Streaming](https://keen.io/docs/streams/extended-functionality/amazon-s3/) capabilities to write a copy of all their data to AWS.\n\n\n ## \tAdditional Resources:\n\n - Check out Keen's tutorial on [How to Build a SendGrid Email Marketing Dashboard](https://www.keen.io/blog/how-to-build-sendgrid-email-marketing-dashboard-with-keenio?utm_campaign=SendGrid%202020&utm_source=SendGrid&utm_medium=SendGrid%20Hosted%20Docs) for a step-by-step guide on creating additional queries.\n - Keen  offers a [3-part video series](https://www.youtube.com/playlist?list=PL6E4U2hk0KgOqdPkaDVqKGHLfUEJsRBW3) which covers setting up the integration, creating email metrics, and building an email marketing dashboard.\n - SendGrid's complete [Event Webhook Documentation]({{root_url}}/for-developers/tracking-events/event/) is a great resource on SendGrid email events. As you start to do more analysis, it's worth a read. You can even skip a lot of the sections because we've done much of the work for you.\n"
  },
  {
    "path": "content/docs/ui/analytics-and-reporting/tracking-stats-using-new-relic.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: SendGrid for New Relic\ngroup: partners\nnavigation:\n  show: true\nseo:\n  title:  SendGrid for New Relic\n---\n<call-out type=\"warning\">\n\nStarting Wednesday June 16, 2021, New Relic will [no longer support or maintain plugins](https://discuss.newrelic.com/t/new-relic-plugin-eol-wednesday-june-16th-2021/127267). \n  \nAfter June 16, 2021, you will no longer be able to access visualizations of your email statistics without changes to your New Relic dashboard. To make these changes, follow [this guide]({{root_url}}/ui/analytics-and-reporting/migrating-from-the-new-relic-plugin/) \n  \n**If you do not utilize New Relic to see email statistics, then there is no action needed from you.**\n\n</call-out>\n\n\nAccess your email statistics via the New Relic Dashboard.\n\n![]({{root_url}}/images/new_relic.png)\n\nIn less than 5 minutes your statistics should be sent to your New Relic Dashboard. We send statistics to New Relic every 5 minutes for users with the setting enabled.\n\n* * * * *\n\n## \tSettings\n \t\nSettings may be changed through:\n\n-   [SendGrid UI](https://app.sendgrid.com/settings/partners) (on an account wide basis)\n\nIf you would like get your statistics in the New Relic Dashboard, you need to provide us your New Relic license key.\n\nThis can be found by accessing the SendGrid's Plugin page on New Relic or from the Account Settings Page.\n\n![]({{root_url}}/images/newrelic-settings.png)\n\nIn the New Relic settings you can enable the statistics for your subusers.\n\n<call-out type=\"warning\">\n\nYou will receive statistics only for 100 subusers\n\n</call-out>\n\nAfter you have entered your settings and saved them, enable the app.\n\n* * * * *\n\n## \tNew Relic Dashboard\n \t\nGo on New Relic site and there you will find the SendGrid extension on the left menu. After clicking on 'SendGrid' extension, a SendGrid instance will be displayed and if you activated the subuser options beneath the statistics of the primary account will be the statistics for subusers.\n\n![]({{root_url}}/images/newrelic-dashboard1.png)\n\nClick on one of the instances and there you will see the statistics in 3 categories: Deliveries, Engagement, and Compliance. Also on the right side you can see metrics in percentages.\n\n![]({{root_url}}/images/newrelic-dashboard2.png)\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/building-your-contact-list.md",
    "content": "---\nlayout: page\nweight: 100\ntitle: Building your Contact list\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Building your Contact list\n  keywords: Marketing Campaigns, Contacts, Contact lists, opt-in email\n  override: true\n  description: Directions on how to effectively build your Marketing Campaigns Contact list.\n---\n\nThe best way to protect your sending reputation and get more messages in the inbox is by building your contact list organically. Here are a few ways SendGrid recommends building your contact list.\n\n## \tOpt-in email\n\nOpt-in email refers to one-to-many emails, such as a newsletter or advertisements, that is sent out to a mailing list where every member of that list has actively requested email from the sender. Without obtaining this permission, your email is likely unwanted or unsolicited and is liable to be marked as spam by the recipient or the receiving mailbox provider.\n\n ### \tEmail opt-in types\n\n- **Single Opt-in** refers to the practice of requesting permission to send a recipient email during, and only during, registration.\n- **Double Opt-in** refers to the practice of requesting permission twice from a recipient. For example, you could ask them if they want to receive email at registration, and then send another email asking them to verify their confirmation.\n- **Confirmed Opt-in** refers to the practice of sending emails to your recipients asking them to confirm their continued interest in receiving your future emails.\n\n<call-out>\n\nTo avoid blocked emails, double check the spelling of the email addresses on your list. SendGrid recommends having the recipient input their address twice to ensure it is correct during the registration/sign-up process.\n\n</call-out>\n\n## \tPeer-initiated email invitation requirements\n\nA peer-initiated invitation system can help your subscribers spread the word about your service and grow your user base—if done well. An aggressive invitation system can backfire, and your invitations will be filtered or blocked. SendGrid customers who implement a peer-initiated invitation system must abide by the following requirements:\n\n* Never allow your subscribers to send invitations to their entire address book. Address books contain old, stale addresses that ISPs use as spam traps. To prevent this, design your invitation system so that your subscriber must deliberately select each invitee.\n* Limit the number of invitations each customer can send to encourage selective, quality invitations. When your customers are careful to invite only those who they think will appreciate your service, you reduce the risk of recipients reporting the invitations as spam. If enough people mark your invites as spam, they will be blocked or filtered.\n* Clearly display the inviter’s name or email address, so the invitee knows who sent the invitation. (Peer-initiated invitations are most effective when the invitee knows and trusts the inviter.)\n* Use the inviter’s email address for the invitation emails From address.\n* Clearly express the purpose of the invitation. Recipients must understand what they are being invited to.\n*  After the initial invitation, don’t send more than one follow-up (reminder) email to invitees that didn’t respond to the first invitation.\n\nSendGrid strongly recommends:\n\n* Ensuring your invitation is relevant and valued by the recipient.\n* Allowing inviters to add a personal text-only message to their invitation. (No URLs, as they may be used to exploit or infect the invitee.)\n* Including a visible, functioning opt-out link to allow the recipient to remove themselves from future mailings instead of reporting your message as spam.\n* Being aware of offering invitation incentives to your subscribers. Incentives may encourage them to invite people who aren’t likely to want your service, and this could backfire.\n* Monitoring your spam complaints. Some inviters will trigger spam complaints by sending invitations to people who don’t want them. If your system correlates spam complaints with the troublesome inviter, you can limit their invitation quota to minimize the adverse effect on your email sending reputation.\n* Pre-screening the email addresses you collect before you send the invitation. Ensure addresses are syntactically correct and that the domain part of the address has a DNS MX record (which indicates that the domain accepts mail).\n\n\n<call-out-link linktext=\"EXPERT SERVICES\" img=\"/img/expert-insights-promo3.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n\n### Need a helping hand?\n\n\nGetting into the inbox just so you can have the chance to engage with your customers often isn’t as easy as pressing “send.” Get customized advice from our team of email experts on how to optimize your email strategy.\n\n\n</call-out-link>\n\n\n ### \tAdditional Resources\n\n- [Lists and Segmentation]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\n- [Unsubscribe Groups]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/) \n- [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/)\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/create-and-manage-contacts.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Create and Manage Contacts\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Create and Manage Contacts\n  keywords:\n  override: true\n  description:\n---\n\n<call-out>\n\nThe content on this page describes the experience in the latest version of Marketing Campaigns. If you’re using the legacy version of Marketing Campaigns, your experience may be different. To explore Marketing Campaigns plans and upgrade, click [here](https://sendgrid.com/pricing).\n\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/381663627\" width=\"640\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n## Add Contacts\n\nYou can add contacts to Marketing Campaigns by uploading a CSV, manually via the UI, using a Signup Form, or by integrating with the Contacts API.\n\n<call-out>\n  \nNote that automations will only trigger to contacts who are added to an entry criteria list *after* the automation is set live. Contacts who you add to a list before the automation is set live will not receive any emails in the series.\n\n</call-out>\n\n### Upload a CSV\n\nA common way to add contacts is to upload a CSV and map your data to custom fields.\n\n<call-out>\n\nYou can upload a CSV containing up to 1M contacts or 5GB of data, whichever is less.\n\n</call-out>\n\n1. Use [this CSV template]({{root_url}}/assets/example.csv) to make sure your CSV is formatted correctly.\n1. Click **Add Contacts** and then select **Upload CSV**.\n1. Choose whether to add your contacts to All Contacts, to an existing list, or to a new list you create.\n1. Upload your file by dragging it into or clicking the CSV upload area and selecting a file from your computer.\n1. Click **Next: Review CSV Upload**.\n1. On this page, all fields are listed and you can see which fields don't have a corresponding reserved or system field.\n1. For each unmapped field, select a custom field from the drop-down or to create a new custom field, click **Create New Custom Field**.\n1. When you're done mapping the fields, click **Next: Add Contacts**.\n\nOnce the CSV has processed, you will receive a [notification]({{root_url}}/ui/account-and-settings/notifications/) email.\n\n### Add Manually\n\nYou can add your contacts manually including alternate email addresses, addresses and names from the Contacts page.\n\n1. Navigate to **Marketing** and then click **Contacts**.\n1. Select **Add Contacts** and then click on **Manual Add** in the drop down menu.\n1. Choose whether to add your contacts to All Contacts, to an existing list, or to a new list you create.\n1. Add your contact's email, and then any other information you may have.\n1. When you're done, click **Add Contacts**.\n\n### Create a signup form\n\nYou can use [Signup Forms](https://mc.sendgrid.com/forms/signup) to capture new contacts and add them directly to Marketing Campaigns. You can embed your forms directly into webpages using an [\\<iframe\\>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe). Forms can also be shared using a Twilio SendGrid-hosted link, making them a great way to grow your lists by engaging customers wherever they are. You can create as many as 15 Signup Forms, allowing you to deploy lists and segment contacts in the ways that best suite your business needs.\n\n<call-out>\n\nIf you add contacts using a list that's acting as the entry criteria for a live automation, the new contacts will automatically receive any emails you’ve created as part of that automation.\n\n</call-out>\n\n_To create a new signup form:_\n\n1. Navigate to Marketing and select **Signup Forms**.\n2. Click **Create a Signup Form**.\n\n![The Signup Forms page with a \"Create a Signup Form\" button]({{root_url}}/img/signup_form_create.png 'Create a Signup Form')\n\n3. A page will load with configuration tabs and a preview of the form. On the **Settings** tab, add a **Form Name**.\n4. You can populate the **Add contacts to** field with any of your contacts lists, including **All Contacts**.\n5. Next, add a **Confirmation Message**. This field contains the text that contacts will see once they’ve submitted the form.\n\n![The Signup Forms page with the Settings tab open]({{root_url}}/img/signup_form_settings.png 'Signup form settings')\n\n6. Navigate to the **Build** tab to add fields to the form itself.\n\n   - The **Build** tab allows you to label your form by setting a **Header**. You can also add any **Intro Copy** that might help customers understand the purpose of your form.\n   - The **Build** tab also provides the opportunity to add [Reserved Fields]({{root_url}}/ui/managing-contacts/custom-fields/#reserved-fields) and [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/) to the form. This means you can collect helpful information about new contacts at the time of signup. Expand the **Reserved Fields** and **Custom Fields** menus, and select any fields you want to include — they will appear in the form preview beside the **Build** tab.\n\n![The Signup Forms page with the Build tab open. Two custom fields are selected and showing in the form preview.]({{root_url}}/img/signup_form_build.png 'Signup form build')\n\n<call-out>\n\nIf a contact (defined by a unique email address) already exists in your contact database, any new or updated data will be reflected on that existing contact.\n\n</call-out>\n\n7. You can change the look of your form using the **Styles** tab. In addition to modifying fonts and colors, you can change the button styles and the width of the form.\n8. Once you are happy with the form, select **Save & Apply**.\n\n### Share Code to make your form accessible\n\nOnce your form has been created, you can share it by embedding it into your own webpages or by providing customers with a direct link to the form. The link is hosted by Twilio SendGrid. If you choose to embed your form, it will be hosted in an `<iframe>`.\n\n_To share the code for your signup form:_\n\n1. Navigate to the signup form you want to share or embed.\n2. Click the action menu and select **Share Code**.\n\n![The action menu (three dots) open with the \"Share Code\" menu item highlighted]({{root_url}}/img/signup_form_share_code_action_menu.png 'Action menu Share Code')\n\n3. A modal will open where you can copy either the direct link to the Twilio SendGrid-hosted form — titled, **Landing Page** — or the embeddable `<iframe>` code — titled, **Direct Embed**.\n\n   - The Landing Page link can be pasted anywhere, including in an email or on a social media site.\n   - The Direct Embed code can be pasted into the HTML of your website wherever you want to display the form.\n\n![The signup form's share modal]({{root_url}}/img/signup_form_share_code_options.png 'Form share options')\n\nYou can also find the options to share the signup form in the form editor by clicking **Share Code** in the top right corner of the editor.\n\n### Manage signup forms\n\nUsing the action menu on the Signup Forms page you can edit, duplicate, or delete existing signup forms.\n\n![]({{root_url}}/img/action-menu-signup-form.png 'Action menu for signup forms')\n\n<call-out>\n\nBecause of the `<iframe>` technology used to create the signup form, the form dynamically updates on the page or pages where you have the form embedded anytime you edit a form and click **Save & Apply**.\n\n</call-out>\n\n## Manage Contacts\n\nManaging contacts is an integral part of your Marketing Campaigns lifecycle. You can create lists for contacts, as well as view and edit each individual contact within your contact database.\n\n### Viewing a contact\n\nTo view a specific contact profile, find the contact in one of your lists by searching your contact database. Then, click the contact’s email address. You will then be able to view the email, engagement data, profile information, custom fields, and list associations for this contact.\n\n<call-out>\n\nSearches are case agnostic but must be done using a whole email address that includes an \"@\" and any top-level domain like \".com\" or \".io\".\n\n</call-out>\n\nTo view any custom fields you have assigned to this contact, or to view any lists that you have added this contact to, you may flip through the tabs beneath the Contact Details. You may either view all custom fields at once, or you can filter them by the following types: “Text”, “Date”, and “Number”.\n\n### Editing a contact\n\nWhen you are viewing a contact, click any of the Edit buttons in the Contact Fields tab to edit the contact's information within that section. This includes the Twilio SendGrid provided reserved fields, except email, any custom fields you’ve added for this contact, and any lists the contact is associated with.\n\n_To edit the associated lists for your contact:_\n\n1. Select the **Associated Lists** tab.\n2. Enter or select the list you would like to use.\n3. Click **Add**.\n\n### Managing your list\n\nSending to a well-managed address list can drastically improve your delivery. We have put together some simple steps and guidelines that will improve any senders list.\n\n- [Suppressions](#identifying-suppressions)\n- [Delete unusable contacts](#delete-unusable-contacts)\n- [Delete a specific contact](#delete-a-specific-contact)\n- [Delete all contacts](#delete-all-contacts)\n\n### Identifying Suppressions\n\nIn your Twilio SendGrid Account are different [Suppressions]({{root_url}}/ui/sending-email/index-suppressions/) lists.\n\n**Global Unsubscribes** - Addresses on this list are opted out of all mail.\n\n**Bounces** - Addresses that have failed to deliver to the recipient's inbox. Once an address has been added to this list, we do not attempt to deliver further messages to it. We will instead Drop them to protect your external reputation.\n\n**Spam Reports** - Addresses that have marked your mail as spam.\n\n**Blocks** - Addresses that have blocked your mail temporarily, usually due to factors like a denied IP address. You can attempt to resend to these addresses.\n\n**Invalid** - Addresses on this list are malformed and do not have a valid email address structure. (Ex. info.sendgrid.com, info@sendgridcom, info @ sendgrid.com)\n\nEmails sent to addresses listed in the Bounce, invalid, Spam, and Unsubscribe list are automatically dropped by Twilio SendGrid. Feel free to remove these addresses from your lists to save money and time.\n\n### Delete unusable contacts\n\nIt is common to have contacts that result in a group unsubscribe, block, bounce, invalid email address, or spam report. Attempting to send email to these contacts can negatively impact your reputation since these contacts do not want to (and will not) receive your marketing emails.\n\n_To remove all of your unusable Marketing Campaigns contacts:_\n\n1. When viewing your dashboard, navigate to the left-hand menu and click **Suppressions**.\n1. Open a specific group, such as Bounces or Spam Reports, click the action menu in the upper right corner, then select **Download as CSV**.\n1. Repeat step 2 for each of the groups that you want to remove (unsubscribes, spam reports, etc.) and merge each of those lists into a single CSV file.\n1. Return to your dashboard, navigate to the left-hand menu and select **Marketing**, then **Contacts**.\n1. In the upper right corner click **Add Contacts** and select **Upload CSV**.\n1. Select **Create New List** and name it something obvious, like \"Remove Invalid Emails.\"\n1. Once uploaded, click the action menu to the right of that new list and select **Delete**.\n1. Check the box indicating to delete \"all contacts associated with this list.\"\n\n### Delete a specific contact\n\n<call-out type=\"warning\">\n\nThere are two methods to delete contacts; one in which only a specific list or segment will be deleted and the contacts will _remain_ in All Contacts, and the second in which you can delete a list or segment and ALL associated contacts.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nWhen you delete a contact, all stats related to that contact will also be removed.\n\n</call-out>\n\n_To remove a list or segment, but keep the contacts in All Contacts:_\n\n1. Navigate to your list or segment.\n2. Click the checkbox to the left of your list or segment.\n3. Click # selected dropdown and delete.\n\n_To remove a list or segment, and ALL associated contacts:_\n\n1. Navigate to your list or segment.\n2. Hover over the Action menu to the right of the list or segment.\n3. Click on the trash icon.\n4. Check the box \"Delete all contacts associated with this list from my account.\"\n5. Select delete.\n\n_To remove one or more contacts from a list:_\n\n1. Navigate to the [All Contacts list](https://sendgrid.com/marketing_campaigns/ui/all_contacts).\n1. Search for the contact you want to delete.\n1. Click **delete** to remove the contact permanently.\n\n<call-out type=\"warning\">\n\nUse this to permanently delete your recipients from all of your contact lists and all segments if required by applicable law.\n\n</call-out>\n\n### Delete all contacts\n\n_To delete all of your contacts at once:_\n\n1.  Navigate to your Contacts page and hover over the Action Menu next to All Contacts.\n1.  Click the trash can icon.\n1.  Select the checkbox to confirm that you want to delete all contacts and then click **Delete**.\n\n### Edit or Remove Contacts from a list\n\nTo manage your contact lists more efficiently, you can edit and remove contact lists from the Contacts page.\n\n_To edit a contact:_\n\n1. Navigate to the Contacts page and search for the contact you want to edit.\n1. Click the contact you wish to edit. This takes you to the contact details page.\n1. To edit any of the profile fields, click on the _Edit_ icon to the right of the field.\n1. Once you have finished making all of your changes, click **Save**.\n\n_To delete a contact from your account:_\n\n1. Navigate to the Contacts page and search for the contact you want to edit.\n1. To delete a contact from the contact list, you can click the delete icon in the action menu. To delete a contact from the contact details page, click the delete icon at the top-right of the page.\n1. If you are deleting the contact from a specific list, and not All Contacts, click **Remove Contact**. If you are deleting the contact from the account, select **Permanently delete this contact from my account**.\n\n_To remove a contact from a list:_\n\n1. Navigate to the Contacts page and search for the contact you want to edit.\n1. Click the email of the contact to view contact details.\n1. Click the Associated Lists tab from the contact details page.\n1. Find the list you want to remove the contact from and click the delete icon.\n1. When you see \"Are you sure you want to remove this contact?\" click **Remove Contact**.\n\n<call-out>\n\nContacts that are deleted from your SendGrid account are removed compliantly, according to GDPR. [Click here](https://sendgrid.com/resource/general-data-protection-regulation-2/) for more information on GDPR.\n\n</call-out>\n\n## Export contacts\n\nTo view the contents of a contact list, you can export the list to a CSV and download it to your computer.\n\n_To export contacts:_\n\n1. Navigate to the Contacts page within the Automation Beta experience.\n1. Locate the contact list you want to export and click the action menu.\n1. Select **Export**. The Export page appears with a list of all current and previous exports.\n1. From here you can find the exported contact list and select the action menu.\n1. Select the **Download CSV** icon next to the list to download the contact list to your computer.\n\n<call-out type=\"warning\">\n\nExported CSV files are only available for download for 72 hours after the export is initialized.\n\n</call-out>\n\n## Contact Management APIs\n\nYou can integrate with the Contact Management APIs to create and update lists, add contacts, manage reserved field data, export contact lists, and pull data about your contacts and lists. Learn more through the documentation for the [Marketing Campaigns Contact APIs](https://sendgrid.api-docs.io/v3.0/contacts/).\n\n## Additional Resources\n\n- [Custom Fields]({{root_url}}/ui/sending-email/editor/)\n- [Formatting a CSV]({{root_url}}/ui/managing-contacts/formatting-a-csv/)\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/custom-fields.md",
    "content": "---\nlayout: page\nweight: 55\ntitle: Using Custom Fields\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Using Custom Fields\n  keywords: Custom Fields, Personalization, customized email\n  override: true\n  description: Custom fields help you segment your lists dynamically based on your user information.\n---\n\n<call-out>\n\nThis page is describing the functionality of the new Marketing Campaigns experience, if you're using legacy Marketing Campaigns, your workflow and screens may be a little different. For more information on the new Marketing Campaigns experience click [here](https://sendgrid.com/pricing).\n\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/375994906\" width=\"640\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\nCustom Fields allow you to add extra information about a contact within your contact database when you upload a CSV. You can use custom fields to create dynamic [segments]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/) or to personalize the subject lines or content of Marketing Campaigns emails you send. Your custom fields are completely customizable to the use cases and user information that you need.\n\n<call-out>\n\nYou can create up to 120 custom fields.\n\n</call-out>\n\n## Creating Custom Fields\n\n_To add a custom field:_\n\nThe most common way to add custom fields is by including each custom field you’d like to add as a column in your CSV [upload]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#uploading-a-csv). If you’d like to add custom fields programmatically, see our [API documentation](https://sendgrid.api-docs.io/v3.0/custom-fields/create-custom-field-definition)\n\nYou can also add custom fields manually from the Custom Fields page.\n\n1. Navigate to the Custom Fields page and click **New Custom Field**.\n1. Add a _Field Name_ and select a _Field Type_.\n1. Click **Create Field**.\n\nThe field name should be created using only alphanumeric characters (A-Z and 0-9) and underscores (\\_). Custom fields should only begin with letters A-Z or underscores (\\_). The field type can be `date`, `text`, or `number` fields. The field type is important for creating segments from your contact database. **Note:** If you have created a custom field that begins with a number, you will need to recreate it with a name that begins with letters A-Z or an underscore (\\_).\n\n<call-out type=\"warning\">\n\nCustom fields that begin with a number will cause issues when sending with Marketing Campaigns.\n\n</call-out>\n\nYou can create three different types of custom fields, based on the data type. Each data type will allow you to use different queries for segmentation:\n\n- **Date** - allows you to select contacts before, after, or on a specific date. _Example: 1/1/2014_\n- **Text** - allows you to select contacts who match the specific text. _Example: Pet field that says \"Dog\"_\n- **Number** - allows you to do things like “greater than,” “less than,” or “equals” a specific number. Both decimal and integer values are accepted. _Example: The age of your recipient: 27_\n\n<call-out type=\"warning\">\n\nText custom fields are limited to 1,000 characters.\n\n</call-out>\n\n### Reserved Fields\n\nYour account comes preloaded with unremovable reserved fields. The following field names are all reserved:\n\n<table class=\"table\">\n  <tr><th>Field Name</th><th>Field Type</th></tr>\n  <tr><td>first_name</td><td>text</td></tr>\n  <tr><td>last_name</td><td>text</td></tr>\n  <tr><td>email</td><td>text</td></tr>\n  <tr><td>alternate_emails</td><td>text</td></tr>\n  <tr><td>address_line_1</td><td>text</td></tr>\n  <tr><td>address_line_2</td><td>text</td></tr>\n  <tr><td>city</td><td>text</td></tr>\n  <tr><td>state_province_region</td><td>text</td></tr>\n  <tr><td>postal_code</td><td>text</td></tr>\n  <tr><td>country</td><td>text</td></tr>\n  <tr><td>phone_number</td><td>text</td></tr>\n  <tr><td>whatsapp</td><td>text</td></tr>\n  <tr><td>line</td><td>text</td></tr>\n  <tr><td>facebook</td><td>text</td></tr>\n  <tr><td>unique_name</td><td>text</td></tr>\n</table>\n\nSendGrid auto-populates 6 reserved fields:\n\n`lists`\n\n`created_at`\n\n`updated_at`\n\n`last_emailed`\n\n`last_clicked`\n\n`last_opened`\n\nReserved fields are used by default to track useful metrics for your contacts.\n\n## Deleting a Custom Field\n\n_To delete a custom field:_\n\n1. Navigate to **Marketing** and select **Custom Fields**.\n1. Locate the field you wish to remove.\n1. Hover over the action menu to the right of the field name entry.\n1. Select the delete icon.\n1. Click **Delete Field**.\n\nThis deletion process may take several minutes; you will continue to see the custom field on this page until the process completes.\n\n<call-out type=\"warning\">\n\nDeleting a custom field deletes all values for that field across your contact database. It will also break Single Sends or Automation emails using the custom field as a tag or segments using the field as a condition. See below for details. \n</call-out>\n\nIf a deleted custom field is **used as a tag within a Single Send or Automation email**  as part of the subject line or body copy, the email will send with the default value you've designated or the fall back \"default\". If you have deleted the fallback, the email will not display anything at all in place of the deleted custom field. \n\nIf a deleted custom field is **used as criteria within a segment** the segment will fail to load. Neither Single Sends nor Automation emails will be able to be sent to the segment using the deleted custom field. \n\n## Troubleshooting\n\nIf a custom field value does not appear in the corresponding [Substitution Tag]({{root_url}}/ui/sending-email/editor/#using-substitution-tags), make sure that there is a value for that custom field associated with the contact in your contact database. If there is no value for a particular custom field, a space will be substituted instead.\n\nIf you do find that the custom field has an associated value on the contact’s profile page, check the spelling of the substitution tag in the content of your campaign.\n\n## Additional Resources\n\n- [Substitution Tags]({{root_url}}/ui/sending-email/editor/#using-substitution-tags)\n- [Contacts]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/)\n- [Segmenting your Contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/email-address-validation.md",
    "content": "---\nlayout: page\nweight: 55\ntitle: Email Address Validation\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Email Address Validation\n  keywords: email, validation, signup\n  override: true\n  description: Twilio SendGrid's real-time Email Address Validation provides you detailed information on the validity of your users' email addresses, as well as allows you to integrate this validation process into your signup process. \n\n---\nEmail Address Validation provides real-time detailed information on the validity of email addresses. You can integrate this validation process into your platform's signup form and customize the best use of email address validation for your use case: - Identify a validation threshold from which you feel comfortable sending a follow up email\n- Display to your form visitors that their email addresses are likely invalid within your form\n- Decide if you want to drop invalid email addresses from your database.\n\nValidating email addresses allows you to to suppress invalid email addresses from your sending, decreasing your bounce rate, cleaning your subscriber list, ultimately improving your sender reputation.\n\n## Generating your Email Validation API Key\n\nBefore you can call the Email Address Validation Real Time API endpoint, you’ll need an API key with Email Address Validation permissions.\n \n<call-out>\n\nYou are required to create a brand new API key that will only be used for Email Address Validation. The Email Validation dashboard will appear in the SendGrid UI for the user that creates the Email Validation API Key. \n\n</call-out>\n\n1. Navigate to **Settings**, and then select **API Keys**. Click **Create API Key** in the upper right-hand corner.\n1. Name your new key and select the **Email Address Validation Access** permission.\n1. Select **Full Access** to the left of **Validation**.\n\n![]({{root_url}}/img/create-api-key.png \"API Key Access Permissions List\")\n\n<call-out>\n\n“Email Address Validation Access” will be visible to Email API Pro and Premier plans only.\n\n</call-out>\n\n4. Click **Create & View**.\n5. Copy your new API key somewhere safe. **This will be the only time you will be able to see it in its entirety due to security reasons.**\n\nYou’re now ready to start using the [Real Time API endpoint!](https://sendgrid.api-docs.io/v3.0/email-address-validation/validate-an-email)  \n\n## Recommendations Before Integrating\n\nThe Email Address Validation Real Time API Endpoint takes a single email address in a POST request, and returns a verdict with detailed data in a JSON response. Complete documentation of the endpoint, including details of the response, are available [here](https://sendgrid.api-docs.io/v3.0/email-address-validation/validate-an-email).\n\nWhen integrating with the Email Validation API endpoint, please keep the following things in mind:\n\n- Do not call the API endpoint from client side code such as Javascript. Doing so would allow anyone to find your API key and use it to validate their own email addresses on your account. You should instead call the API from backend code, for instance, after the user submits a form.\n- The API currently accepts one email address at a time. If for some reason you have multiple addresses you need to validate, please call the API once per email address. We do not currently have a batch API.\n- If you choose to integrate into a signup form we recommend ensuring the Email Validation API is not a blocker for your form submissions. \n- The API endpoint is rate limited to 7 requests per second.\n\nThe \"Source\" gets passed through the API call as an optional field to identify the source if you choose to integrate with multiple email address captures and want to be able to compare their results. You pass it as a string, only using alphanumeric characters and spaces. For example:\n\n```\n{\n  \"email\": \"email@example.com\",\n  \"source\": \"Newsletter Signup\"\n}\n```\n\nThe API response should look something like this, using the example email \"cedric.fogowl@gmail.com\":\n\n\n```\n{\"result\":{\"email\":\"cedric.fogowl@gmail.com\",\n\"verdict\":\"Valid\",\"score\":0.98015,\n\"local\":\"cedric.fogowl\",\"host\":\"gmail.com\",\n\"checks\":{\"domain\":{\"has_valid_address_syntax\":true,\n\"has_mx_or_a_record\":true,\"is_suspected_disposable_address\":false},\n\"local_part\":{\"is_suspected_role_address\":false},\n\"additional\":{\"has_known_bounces\":false,\n\"has_suspected_bounces\":false}},\"ip_address\":\"65.101.243.157\"}}\n```\n\nThere is a limit of 50 sources. Sources are automatically deleted once the last validation to use that source falls off the 30 day window. You can continue to make validations without a source if you’ve hit the limit.\n\n### Options for Integration\n\nThe Email Validation API allows flexibility for integrating in multiple ways, but for simplicity we'll focus on validating emails in a signup form. A signup form is anywhere you are capturing email addresses. This could be a lead capture signup form like requesting a content piece or an account signup. \n\nOnce you identify the signup form you want to integrate with the Email Validation API, next you need to decide if you want to use validation results to surface possible typos to form visitors while they're still in the form or capture the results after the form submission to inform sending decisions. \n\nThe first option is to provide user feedback by returning to the sign up form and showing an inline error, letting the user know that they need to check the email address. For instance, you might realize the user made a typo as described in the previous section and decide to show an error like, “Did you mean john.doe@gmail.com?”\n\n<call-out type=\"warning\">\n\nBe careful not to create a block in your sign up form if you provide user feedback. It’s possible that a user’s actual email address doesn’t meet your criteria for a good address, and will never be able to successfully submit your form. You should consider alerting the user only once, and then allowing the same address if they submit it again a second time.\n\n</call-out>\n\nThe second option is to validate the email address after submission and not provide any user feedback. You can then use the Email Validation results to decide what email addresses you feel comfortable sending email to.\n\nDepending on your business needs and how you prefer to integrate, both of these approaches are great options. The upside of providing user feedback in the signup form is that you’ll catch visitor typos before they leave the form, however the downside is that you’ll still have some friction points in the signup form in the event that the address they provide doesn’t meet your criteria. The upside of dropping bad addresses in the backend is that you have a frictionless signup form, while the downside is you lose the opportunity to save contact with visitors who may have accidentally mistyped their email address.\n\n### Email Validation Results\n\nThe API response you receive after calling the API contains a lot of useful information that you can use to determine whether or not you want to accept or send to an email address. Below is a summary of the three most important fields you’ll want to look at:\n\n- **Verdict**: This field will contain one of three categories: `“Valid”`, `“Risky”`, or `“Invalid”`. These are generic classifications based off of the detailed results. You could filter off of this field if you want to go off of our suggestion, but you could also look at more detailed information like the next 2 listed.\n\n- **Score**: This number from 0 to 1 represents the likelihood the email address is valid, expressed as a percentage. So for instance, a score of 0.96 could be interpreted as a 96% likelihood the email is valid. If you want finer grained control than the generic categories of the `“result”` field, you could set a threshold based off this score.\n\n- **Checks**: This field will contain a list of all the checks that ran on the email address. You could use these results to determine if you want to take a calculated risk in sending to an address. For instance, an email address that is a role address (e.g. admin@examplecompany.com) will come back with a `“Risky”` result and a score of 50%. A disposable email address from mailinator.com would also come back with a `“Risky”` result and a score of 50%. You might decide that you only want to send to email addresses with a score of 80% or higher, but are also OK with sending to addresses that are disposable (and therefore have a score of 50%). You could use this field to gain the info you need to filter at that level. Here are a list of all the checks and what they mean:\n\n    - ``has_valid_address_syntax`` - If true, then the address is a properly formatted email address (e.g. it has an @ sign and a top level domain). If false, then it’s a malformed address.\n    - ``has_mx_or_a_record`` - If true, the domain on the address has all the necessary DNS records to deliver a message somewhere. If false, the domain is missing the required DNS records and will result in a bounce if delivered to.\n    - ``is_suspected_disposable_address`` - If true, the domain part of the email address appears to be from a disposable email address service, in which the addresses are only good for a short period of time.\n    - ``is_suspected_role_address`` - If true, the local part of the email address (before the @ sign) appears to be a group email address such as “hr” or “admin”.\n    - ``has_known_bounces`` - If true, the email address has previously been sent to through your SendGrid account and has resulted in a bounce.\n    - ``has_suspected_bounces`` - If true, our machine learning model suspects that the email address might bounce.\n\nYou can use any combination of these fields to filter down to what you consider a good address.\n\n## Suggestions for domain typos\n\nThe Email Validation Real Time API will check for typos in an email address in addition to evaluating its validity. If we detect a possible typo, you will find a `“suggestion”` field in the API response containing what we believe to be the correct domain. For instance, if you call the API with “john.doe@gmial.com”, the API response might look something like this:\n\n``` \n{\n  \"result\": {\n    \"email\": \"john.doe@gmial.com\",\n    \"verdict\": \"Invalid\",\n    \"score\": 0.00089,\n    \"local\": \"john.doe\",\n    \"host\": \"gmial.com\",\n    \"suggestion\": \"gmail.com\",\n    \"checks\": {\n      \"domain\": {\n        \"has_valid_address_syntax\": true,\n        \"has_mx_or_a_record\": true,\n        \"is_suspected_disposable_address\": false\n      },\n      \"local_part\": {\n        \"is_suspected_role_address\": false\n      },\n      \"additional\": {\n        \"has_known_bounces\": false,\n        \"has_suspected_bounces\": true\n      } \n    },\n    \"ip_address\": \"123.45.67.89\"\n  }\n}\n```\n\nIn this response, the `“suggestion”` field is recommending “gmail.com” instead of “gmial.com.” With this info, you can combine the value in the “local” field with the value in the `“suggestion”` field to create the intended email address of “john.doe@gmail.com.”\n\n## Email Validation API Dashboard\n\n<call-out>\n\nThe Email Validation dashboard will only appear in the SendGrid UI for the user that creates the Email Validation API Key. \n\n</call-out>\n\nThe last way you can evaluate your validation results is in the [Email Validation API dashboard](https://app.sendgrid.com/email_validation) within the SendGrid UI. This Validation dashboard gives you access to all the validation results you’ve done in the past 30 days, and allows you to filter down to what you consider a good address. You can filter by the verdict result, the source the validation was performed at, as well as the score. \n\n![]({{root_url}}/img/email-address-validation-stats.png \"Email Address Validation Statistics\")\n\n### Detailed validation results\n\nYou can select a specific email address within the Email Validation API dashboard in order to view the detailed validation results for that email address. \n\n![]({{root_url}}/img/validation-details.png \"Validation Details\")\n\n### Exporting your results\n\nOnce you’ve filtered down to your desired list of results, you can click the **Export CSV** button to get a CSV list of your results. This can then be used to upload your good contacts and validation results to Marketing Campaigns, or your database or CRM of choice.\n\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/formatting-a-csv.md",
    "content": "---\nlayout: page\nweight: 80\ntitle: Formatting a CSV\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Formatting a CSV\n  keywords: Marketing Campaigns Contacts, CSV, Contact Information, Contacts\n  override: true\n  description: Directions on how to format a CSV for upload using SendGrid Marketing Campaigns\n---\n\n<call-out>\n\nThe content on this page describes the experience in the latest version of Marketing Campaigns. If you’re using the legacy version of Marketing Campaigns, your experience may be different. To explore Marketing Campaigns plans and upgrade, click [here](https://sendgrid.com/pricing).\n\n</call-out>\n\nYou can add contacts to your contact database by uploading a CSV into Marketing Campaigns. If you have your contacts in a spreadsheet, save that sheet as a CSV file using a spreadsheet application like Microsoft Excel or Google Sheets. You can also export your contacts from most database systems as a CSV file.\n\n## General Formatting Rules\n\nFollow the rules below when formatting a CSV to upload into Marketing Campaigns. Click [here]({{root_url}}/assets/example.csv) to download a sample CSV like the one shown below: \n\n![]({{root_url}}/img/example-csv.png \"Example of a CSV with proper formatting\")\n\n### Contact Info\n\nYour CSV should contain the following information about each contact:\n\n* email (required)\n* first_name\n* last_name\n\nIn addition to `email`, `first_name`, and `last_name`, there are also several other [reserved fields]({{root_url}}/ui/managing-contacts/custom-fields/#reserved-fields) such as `city` and `zipcode`. You can also include [custom fields]({{root_url}}/ui/managing-contacts/custom-fields/) with additional identifying information for each contact in the CSV. For example, you could specify `birthday`, `occupation`, and `age` as the custom fields. The data in the custom fields are critical for both segmentation and content personalization.\n\n### Header Row\n\nThe first row of your CSV must be a header row containing labels identifying each column. Headers should only use letters, numbers, and underscores. Header fields can be blank in your CSV, but must be named and have their type defined later during the upload process.\n\n<call-out>\n\nYou cannot use spaces, dashes, or other special characters, except for underscores in a CSV. \n\n</call-out>\n\nIf you add custom field data to your CSV, you can save some time when uploading by naming the columns the same as the custom fields you have previously defined.\n\nSendGrid identifies individual contacts by their email address, so one of the CSV headers must be `email`. If you do not include the email column, SendGrid will not add any information to your contact database or list. Rows in your CSV without an email address in the email column will automatically fail to add to your contact list, but they will not cause the entire upload to fail.\n\n ### Character Encoding\n\nIf your contacts list has non-English characters, please make sure that you are UTF-8 encoding your CSV file.\n\n###  Removing invalid and duplicate addresses\n\nSendGrid removes duplicate and invalid email addresses including email addresses with any special characters except for underscores from your list during upload, so the number of contacts can potentially change between your CSV and your Marketing Campaigns list.\n\n###  Numbers and Text\n\nFormat your text fields so that there are no strings of numbers that appear like phone numbers, zip codes, and so on. They should not contain punctuation characters like a dash, underscore, parenthesis, or multiple dots.\n\n```\n- US Zip Code: 80202-1713\n- Phone numbers: \"(555) 555-5555\" or \"555.555.5555\"\n- Monetary Values with the currency indicator such as $3.50 or €5.73\n```\n\n### Date Formatting\n\nProperly format any dates in your CSV. If you create your CSV with Excel and it is not displaying correctly, change the date format to display appropriately before exporting to CSV. Use one of the following date formats: `MM/DD/YYYY, MM/D/YYYY, M/D/YYYY, or M/DD/YYYY`.\n\n### Troubleshooting\n\nBelow are a few errors you may encounter when uploading a CSV to Marketing Campaigns, along with tips to correct the root issue.\n\n**We were unable to detect an email column in the CSV file headers. The email column must always have a header of \"email\"**.\n\n- If there is a header labeled \"email\" try moving it to column A, so it is the first header in your list.\n- Your CSV _must_ include an email header.\n\n![Move email header to column A]({{root_url}}/img/listupload_1.png)\n\n**Some of your custom fields have not been selected**.\n\n- Look for hidden characters in your CSV file if you have worked with the file multiple times and made some adjustments to the data.\n- A common fix for this error would be to select all and copy your data to a new CSV spreadsheet. This should remove any hidden characters.\n\n![]({{root_url}}/img/listupload_2.png)\n\n**Each custom field can only be applied to a column once. Please check your columns and try again**.\n\n- Check your CSV for duplicate fields, especially fields that have matching information as your `email`, `first_name` and `last_name` fields. You cannot edit these field names as they are reserved.\n- For example, if you have a \"Name\" field, it may conflict with your `first_name` reserved field.\n\n![]({{root_url}}/img/listupload_3.png)\n\n**We were unable to detect any headers in your CSV file**.\n\n- Include headers at the top of each column. All CSV uploads must contain the \"email\" header. Header fields can be blank in your CSV but must be defined later during the upload process.\n\n![]({{root_url}}/img/listupload_4.png)\n\n**Float type conversion error**.\n\n- Categorize dashes or decimal places that are past the hundredth place as text_fields (-100, 123.123 are text fields, 100, 12.12 can be number fields).\n- Number fields can include monetary values without the currency symbols. For example, 19.95 would be a number field, and $19.95, including the ($), would be a text field.\n- As you are uploading your CSV, make sure you select the correct fields for your Field type.\n\n![]({{root_url}}/img/listupload_table.png)\n\n ##     Additional Resources\n\n- [Contacts API](https://sendgrid.api-docs.io/v3.0/contacts/)\n- [Segmenting your Contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\n- [Building your Contact list]({{root_url}}/ui/managing-contacts/building-your-contact-list/)\n"
  },
  {
    "path": "content/docs/ui/managing-contacts/segmenting-your-contacts.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Segmenting your Contacts\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Segmenting your Contacts\n  keywords: Segmentation, email segmentation, targeted marketing, email, marketing campaigns\n  override: true\n  description:\n---\n\n<iframe src=\"https://player.vimeo.com/video/385360784\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n<call-out type=\"warning\">\n\nThe content on this page describes the experience in the latest version of Marketing Campaigns. If you’re using the legacy version of Marketing Campaigns, your experience may be different. To explore Marketing Campaigns plans and upgrade, click [here](https://sendgrid.com/pricing).\n\n</call-out>\n\n[Segments]({{root_url}}/glossary/segmentation/) are similar to contact lists, except they update dynamically over time as information stored about your contacts or the criteria used to define your segments changes. When you segment your audience, you are able to create personalized Automation emails and Single Sends that directly address the wants and needs of your particular audience.\n\n<call-out>\n\nMarketing Campaigns supports up to 200 segments per user.\n\n</call-out>\n\n[Custom fields]({{root_url}}/ui/managing-contacts/custom-fields/), [reserved fields]({{root_url}}/glossary/reserved-fields/), and engagement data like opens and clicks, provide unique information you can use to identify contacts for different segments. As your contacts' traits change or you add more contacts that meet the criteria of your segment, your segments will update to reflect these changes. For example, a segment populated using the criteria, “lives in Denver” or, “is under 30 years old” will change as your contacts age or their addresses change.\n\nSegments can pull from _All Contacts_ or any of your more narrowly defined lists.\n\n## How segments work\n\nSegments are created by comparing your contacts against criteria you define. If a contact matches the specified criteria, they will be included in your segment. Engagement data such as \"opened\" or \"clicked\" will add contacts who have _engaged_ in this behavior with one of your messages. Whether or not a contact meets your defined criteria is evaluated using the combination of conditions you create. Each condition consists of three parts: fields, operators, and values.\n\nThe first part of the condition, the field, is the data _field_ you want to filter your contacts by. Fields include traits such as \"First Name,\" \"Email,\" or \"City\" and engagement data such as \"Last Clicked.\" For a full list of available fields, see the [Segmentation fields and types tables](#segmentation-fields-and-types).\n\nOperators are the second part of the expression, and they define how your contacts should be evaluated. All fields have a data type assigned to them (text, number, date, Single Send); this type will determine which operators are available. For example, \"Last Clicked\" is a date field, and it has date operators such as \"is after\" and \"is before\" available. For a full list of operators available by field type, see the [Operators available by field type section](#operators-available-by-field-type).\n\nThe last part of the expression is a value. The value is compared to the field using the operator. For example, you may select the field, \"City.\" City is a text-type field, so you can then choose \"is\" from the available operators for that field type. You can then add the value, \"Denver.\" This expression will check your contacts for entries who live in Denver and include all who do in your segment.\n\nYou can build precisely targeted segments by using multiple conditions to filter your contacts. The previous example is among the simplest segments possible using Marketing Campaigns.\n\n## Creating a segment with Marketing Campaigns\n\nTo create a segment, login to the Twilio SendGrid App and complete the following steps.\n\n1. Navigate to [**Marketing** and then select **Contacts**](https://mc.sendgrid.com/contacts).\n2. Click on the **Create** dropdown button, and then the **New Segment** option.\n\n![The SendGrid App with the Create dropdown extended and \"New Segment\" highlighted in the dropdown.]({{root_url}}/img/new_segment_dropdown.png 'Create dropdown')\n\n3. Enter a _Segment Name_.\n4. Choose **Segment all contacts** or **Segment an existing list**.\n\n![The contacts menu inside the SendGrid App, displaying the segment name field and list from which a the segment should be built.]({{root_url}}/img/create_new_segment.png 'Create a new segment')\n\n<call-out>\n\nIf you're segmenting an existing list, you can click the action menu to the right of the list name from the [Contacts page](https://mc.sendgrid.com/contacts) and select \"Create Segment\" directly.\n\n</call-out>\n\n5. To segment an existing list, select a list from the **Existing List** drop-down.\n6. In the **Who are you targeting?** section, start building your first condition by choosing a _field_ from the drop-down.\n7. Choose from the list of available _operators_.\n8. Enter the desired _value_ you want to segment by.\n9. You can [add multiple conditions](#adding-multiple-conditions-with-a-segment) and choose to join them with **AND** or **OR**. **AND** will require both conditions to be true; **OR** will qualify a contact for whom _either_ condition is true. This functionality allows you to further refine your segments to target your audience with precision.\n\n<call-out type=\"warning\">\n\nSegments can have one Email Activity, Single Send, or Automation condition field each. These can be combined with custom field and reserved field conditions.\n\n</call-out>\n\n10. Once you are finished adding conditions, click **Save Segment**.\n\n![The segment builder inside Marketing Campaigns, displaying a new segment with a City condition set to \"Denver\" and a State, Province, Region condition set to \"Colorado\".]({{root_url}}/img/create_new_segment_two_fields.png 'Create a new segment with two fields')\n\nOnce your segment is processed, you will see a count of all contacts who meet your segment conditions, as well as a sample of these 50 contacts. To see all contacts included in your segment, click **Export CSV** to download a complete file.\n\n<call-out type=\"warning\">\n\nSegments built using engagement data such as \"was sent\" or \"clicked\" will take approximately 30 minutes to begin populating.\n\n</call-out>\n\n## Segment refresh cadence\n\nContacts will be added to or removed from your segment as they meet or no longer meet the conditions of your segment. This can be driven by:\n\n- New contacts being added to or updated within Marketing Campaigns, whether via CSV upload, API integration, Signup Forms, or manual changes.\n- Contact engagement behavior, such as opening or clicking an email in a way that’s relevant to your segment conditions.\n- A change you make to the conditions that define your segment.\n\nTypically, existing contacts who meet your criteria will begin to appear in your segment searches within 15 minutes. You can see all contacts who are included in the segment at any given time by clicking **Export CSV**. Segments are pulled at the time of an export; this means that an exported CSV will reflect a near-real-time segment population. To check for a specific contact, you can search by the contact’s email address.\n\n<call-out>\n\nTwilio SendGrid checks for newly added or modified contacts who meet a segment's criteria on an hourly schedule. Only existing contacts who meet a segment's criteria will be included in the segment **searches** within 15 minutes.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nSegments built using engagement data such as \"was sent\" or \"clicked\" will take approximately 30 minutes to begin populating.\n\n</call-out>\n\nSegment **samples** and **counts** are refreshed approximately once per hour; they do not update immediately. If no contacts are added to or removed from a segment since the last refresh, the sample and UI count displayed will be refreshed at increasing time intervals with a maximum sample and count refresh delay of 24 hours.\n\nYou can see an estimate of the next scheduled segment refresh on the [**Contacts**](https://mc.sendgrid.com/contacts) page as well as on the detail page of your segment.\n\n![The Contacts landing page in the Marketing Campaigns App]({{root_url}}/img/mc-contacts-segments.png 'Marketing Campaigns Contacts Page')\n\n![A segment detail page with a tool tip indicating the next estimated refresh time]({{root_url}}/img/mc-segment-refresh.png 'Marketing Campaigns segment detail page refresh estimate')\n\nAutomations with entry criteria of a contact entering a segment will be triggered according to the same schedule as the segment sample refresh cadence described above.\n\nHowever, when you send a Single Send to a segment, Marketing Campaigns will pull the segment at the time of send, reflecting the near-real-time segment population.\n\n<call-out>\n\nMarketing Campaigns will pull a segment at the time of send, reflecting the near-real-time segment population.\n\n</call-out>\n\n## Segmentation fields and types\n\nThe following tables list the available reserved fields and the fields' data types. Reserved fields are present in your account by default. Your account will also include any Custom Fields you add. The operators available for each type are included in the [section following these field tables](#operators-available-for-contact-profile-and-custom-fields).\n\n### Contact Profile fields\n\n<table class=\"table auto\">\n  <tr>\n    <th>Field Name</th>\n    <th>Field Type</th>\n  </tr>\n  <tr>\n    <td>First Name</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Last Name</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Email</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Address Line 1</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Address Line 2</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>City</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>State Province Region</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Postal Code</td>\n    <td>Text</td>\n  </tr>\n  <tr>\n    <td>Country</td>\n    <td>Text</td>\n  </tr>\n <tr>\n    <td>Date Added</td>\n    <td>Date</td>\n  </tr>\n  <tr>\n    <td>Last Updated</td>\n    <td>Date</td>\n  </tr>\n</table>\n\n### Email Activity fields\n\n<table>\n  <tr>\n    <th>Field Name</a></th>\n    <th>Field Type</a></th>\n  </tr>\n  <tr>\n    <td>Last Clicked</td>\n    <td>Email Activity*</td>\n  </tr>\n <tr>\n    <td>Last Opened</td>\n    <td>Email Activity*</td>\n  </tr>\n  <tr>\n    <td>Last Emailed</td>\n    <td>Email Activity*</td>\n  </tr>\n</table>\n\n### Single Send fields\n\n<table>\n  <tr>\n    <th>Field Name</a></th>\n    <th>Field Type</a></th>\n  </tr>\n  <tr>\n    <td>Single Send Activity</td>\n    <td>Single Send**</td>\n  </tr>\n</table>\n\n### Automations fields\n\n<table>\n  <tr>\n    <th>Field Name</a></th>\n    <th>Field Type</a></th>\n  </tr>\n  <tr>\n    <td>Automation Activity</td>\n    <td>Automation**</td>\n  </tr>\n</table>\n\n\\* Email Activity fields have their own Email Activity type. After selecting one of [the operators available for this type](#operators-available-for-email-activity-fields), you'll define the time period in which the engagement occurred.\n\n\\*\\* Single Send Activity and Automation Activity fields have their own Single Send and Automation types. After selecting one of [the operators available for these types](#operators-available-for-single-send-fields), you'll choose whether the operator applies to any Single Send or Automation or to a specific Single Send or Automation. You will then define the time period in which the engagement occurred.\n\n### Operators available for Contact Profile and Custom Fields\n\nThe operators available on a field depend on the field type (Text, Date, Number).\n\n#### Date Field Operators\n\nConditions using Date field operators will filter contacts based on the contact field compared with the datetime value provided in the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>is</td>\n    <td>Matches contacts that have the datetime value for the field</td>\n  </tr>\n  <tr>\n    <td>is not</td>\n    <td>Matches contacts that do not have the datetime value for the field</td>\n  </tr>\n  <tr>\n    <td>is blank</td>\n    <td>No value is set for the field</td>\n  </tr>\n  <tr>\n    <td>is not blank</td>\n    <td>Any value is set for the field</td>\n  </tr>\n  <tr>\n    <td>is after</td>\n    <td>Matches the datetime value that occurs after the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is at or after</td>\n    <td>Matches the datetime value that matches or is after the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is before</td>\n    <td>Matches the datetime value that occurs before the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is at or before</td>\n    <td>Matches the datetime value that matches or is before the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>between</td>\n    <td>Matches the datetime value that occurs on or after the start date and on or before the end date for the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>not between</td>\n    <td>Matches the datetime value that occurs before the start date and after the end date for the provided value of that field</td>\n  </tr>\n  <tr>\n    <td>is within</td>\n    <td>Matches the datetime value that occurs between the date and time in the past based on the duration  and the current datetime</td>\n  </tr>\n  <tr>\n    <td>is not within</td>\n    <td>Matches the datetime value that occurs before the date and time in the past based on the duration  and the current datetime</td>\n  </tr>\n  <tr>\n    <td>on</td>\n    <td>Matches the datetime value that occurs at any time on the date provided</td>\n  </tr>\n  <tr>\n    <td>not on</td>\n    <td>Matches the datetime value that does not fall at any time on the date provided</td>\n  </tr>\n</table>\n\n#### Number Field Operators\n\nConditions using Number Field operators will filter contacts based on the contact field compared with the numeric value provided in the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>is</td>\n    <td>Matches contacts that have the numeric value for the field</td>\n  </tr>\n  <tr>\n    <td>is not</td>\n    <td>Matches contacts that do not have the numeric value for the field</td>\n  </tr>\n  <tr>\n    <td>is blank</td>\n    <td>No value is set for the field</td>\n  </tr>\n  <tr>\n    <td>is not blank</td>\n    <td>Any value is set for the field</td>\n  </tr>\n  <tr>\n    <td>is greater than</td>\n    <td>Matches any numeric value that is greater than the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is less than</td>\n    <td>Matches any numeric value that is less than the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is equal or greater than</td>\n    <td>Matches any numeric value that matches or is greater than the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is equal or less than</td>\n    <td>Matches any numeric value that matches or is less than the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is between</td>\n    <td>Matches any numeric value that matches or is greater than the minimum value and matches or is less than the maximum value for the field</td>\n  </tr>\n  <tr>\n    <td>is not between</td>\n    <td>Matches any numeric value that is less than the minimum value and is greater than the maximum value for the field</td>\n  </tr>\n</table>\n\n#### Text Field Operators\n\nConditions using Text Field operators will filter contacts based on the contact field compared with the string value provided in the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>is</td>\n    <td>Matches contacts that have the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is not</td>\n    <td>Matches contacts that do not have the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is blank</td>\n    <td>No value is set for the field</td>\n  </tr>\n  <tr>\n    <td>is not blank</td>\n    <td>Any value is set for the field</td>\n  </tr>\n  <tr>\n    <td>contains</td>\n    <td>Matches any value that may include other text as part of the value</td>\n  </tr>\n  <tr>\n    <td>does not contain</td>\n    <td>Matches any value that does not include the provided value</td>\n  </tr>\n  <tr>\n    <td>starts with</td>\n    <td>Matches any value that begins with the provided value</td>\n  </tr>\n  <tr>\n    <td>does not start with</td>\n    <td>Matches any value that does not begin with the provided value</td>\n  </tr>\n  <tr>\n    <td>ends with</td>\n    <td>Matches any value that ends with the provided value</td>\n  </tr>\n  <tr>\n    <td>does not end with</td>\n    <td>Matches any value that does not end with the provided value</td>\n  </tr>\n</table>\n\n### Operators available for Email Activity Fields\n\nOperators available on an Email Activity field are similar to Date fields with some exceptions—\"is blank\" and \"is not blank\" are not included on Email Activity fields. Email Activity conditions will filter contacts who have engaged with a Single Send or Automation based on the constraints of the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>is</td>\n    <td>Matches contacts that have the datetime value for the field</td>\n  </tr>\n  <tr>\n    <td>is not</td>\n    <td>Matches contacts that do not have the datetime value for the field</td>\n  </tr>\n  <tr>\n    <td>is after</td>\n    <td>Matches the datetime value that occurs after the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is at or after</td>\n    <td>Matches the datetime value that matches or is after the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is before</td>\n    <td>Matches the datetime value that occurs before the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>is at or before</td>\n    <td>Matches the datetime value that matches or is before the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>between</td>\n    <td>Matches the datetime value that occurs on or after the start date and on or before the end date for the provided value for the field</td>\n  </tr>\n  <tr>\n    <td>not between</td>\n    <td>Matches the datetime value that occurs before the start date and after the end date for the provided value of that field</td>\n  </tr>\n  <tr>\n    <td>is within</td>\n    <td>Matches the datetime value that occurs between the date and time in the past based on the duration  and the current datetime</td>\n  </tr>\n  <tr>\n    <td>is not within</td>\n    <td>Matches the datetime value that occurs before the date and time in the past based on the duration  and the current datetime</td>\n  </tr>\n  <tr>\n    <td>on</td>\n    <td>Matches the datetime value that occurs at any time on the date provided</td>\n  </tr>\n  <tr>\n    <td>not on</td>\n    <td>Matches the datetime value that does not fall at any time on the date provided</td>\n  </tr>\n</table>\n\n### Operators available for Single Send Fields\n\nSingle Send conditions will filter contacts who have engaged with a particular Single Send or any Single Send based on the constraints of the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>was sent</td>\n    <td>Any contacts who were sent any Single Send or a specific Single Send in the specified time range</td>\n  </tr>\n  <tr>\n    <td>has clicked</td>\n    <td>Any contact who has clicked any Single Send or a specific Single Send in the specified time range</td>\n  </tr>\n  <tr>\n    <td>has opened</td>\n    <td>Any contact who has opened any Single Send or a specific Single Send in the specified time range</td>\n  </tr>\n</table>\n\n### Operators available for Automation Fields\n\nAutomation conditions will filter contacts who have engaged with a particular Automation or any Automation based on the constraints of the condition.\n\n<table>\n  <tr>\n    <th>Operator Name</a></th>\n    <th>Description</a></th>\n  </tr>\n  <tr>\n    <td>was sent</td>\n    <td>Any contacts who were sent any Automation or a specific Automation in the specified time range</td>\n  </tr>\n    <td>has opened</td>\n    <td>Any contacts who has opened any Automation or a specific Automation in the specified time range</td>\n  </tr>\n  <tr>\n    <td>has clicked</td>\n    <td>Any contacts who has clicked any Automation or a specific Automation in the specified time range</td>\n  </tr>\n</table>\n\n## Adding Multiple Conditions with a Segment\n\nWhen using more than one condition to segment your contacts, you can select `AND` or `OR` as options, where `AND` requires both conditions to be true and `OR` requires either condition to be true. Once you’ve selected the field, operator, and value, you can layer additional conditions in the segment to narrow the results to a more targeted audience.\n\n<call-out type=\"warning\">\n\nAt this time only one Email Activity, Single Send, or Automation condition may exist within a segment if combined using `AND`. Segments can combine more than one engagement activity condition using `OR.`\n\n</call-out>\n\n## Duplicating a Segment\n\nDuplicating a segment eliminates the time and effort needed to recreate a complex segment from scratch in order to make a few changes or tweaks to reach a different audience. Follow these steps to create a copy of an existing segment.\n\n_To duplicate a segment:_\n\n1. From the Contact Lists page, click the Action Menu next to the name of the segment you wish to duplicate.\n1. Select **Duplicate**.\n\n## Exporting a Segment\n\n_To export a segment from the Contact List Page:_\n\n1. Click the Action Menu next to the name of the segment you wish to export.\n1. Select **Export**.\n\n![]({{root_url}}/img/duplicate-segment-contact-list-page.png 'Duplicate a segment from the contact list page')\n\n_To export a segment from the segment details page:_\n\n1. Click **Segment Options** to open the drop-down menu.\n1. Select **Duplicate**.\n\n![]({{root_url}}/img/duplicate-segment-details-page.png 'Duplicate a segment from the segment detail page')\n\nThis triggers SendGrid to send an email to the primary email address on the account. The email includes a link to download the CSV of all the contacts in the list and their associated custom field values.\n\n<call-out>\n\nThe download link for your CSV export will be valid for 24 hours.\n\n</call-out>\n\n## Additional Resources\n\n- [Contacts]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#add-contacts)\n- [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/)\n- [Tips on Segmenting Your Active Subscribers](https://sendgrid.com/blog/tips-on-segmenting-your-active-subscribers/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/a-b-testing.md",
    "content": "---\nlayout: page\nweight: 50\ntitle: A/B Testing Your Single Send\ngroup: marketing-campaigns\nnavigation:\n  show: true\nseo:\n  title: A/B Testing Your Single Send\n  override: true\n  description: Optimize engagement of your campaigns with A/B testing, by sending different versions of your emails to a small subset of your contacts and measuring the engagement results.\n---\n\n<call-out>\nA/B Testing is available for Single Sends only. It is not currently available for emails included as part of an Automation.\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/385360745\" width=\"640\" height=\"400\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\nOptimize the engagement of your Marketing Campaigns with A/B testing. A/B testing (sometimes also referred to by marketers as 'split testing') allows you to send different versions of your Single Sends to an initial subset of your contacts.\n\n## Set up an A/B test\n\n_To set up an A/B test on an existing Single Send:_\n\n1. From the left-hand navigation, select **Marketing**, and then click **Single Sends**.\n2. Locate the Single Send you want to A/B test and click on the Single Send to open it in the editor it was created in.\n3. Depending on the editor used to create the Single Send, A/B testing is located on either the **Settings** tab or the **A/B Testing** tab.\n4. Once you have located the A/B Testing settings, toggle the **Activate A/B Testing** switch to **ON**.\n\n## Choose the Type of A/B Test To Run\n\nWhen you are A/B testing your emails, you want to optimize for a specific metric. Determine whether you want to optimize your **Open Rates** by testing the **Subject Line**, **Click Rates** by testing the **Email Content**, or if you want to manually select the winner of an A/B test based on your analysis of the data.\n\n<call-out>\n\nYou can test up to 6 different variations for each A/B test.\n\n</call-out>\n\n- **Subject Line - Optimize Open Rates**\n\nSelect the Subject Line A/B test to optimize the [Open Rate]({{root_url}}/glossary/open-rate/) of your Single Send, since the subject usually is all the recipient sees until they open your email.\n\nHigh open rates show the strength of a subject line. Once you find a subject line that works well, you will potentially see other engagement metrics improve as well.\n\n- **Email Content - Optimize Click Rates**\n\nSelect the Email Content A/B test to optimize the Click Rate of your Single Send, since the recipient will not see this content unless they open your email.\n\nHigh click rates mean that you have compelling content and calls to action (CTAs).\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n### Looking for more visibility into your email performance?\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n</call-out-link>\n\n## Adding Your Email Variations\n\nEnter the different variations of your email where you would normally edit that piece of content in your Single Send.\n\n- **Subject Line Testing**\n\n  For subject line testing, you will find multiple input boxes in the sidebar where you would normally find your subject line, one for each subject line variation.\n\n- **Email Content Testing**\n\n  For email content testing, you will see additional tabs at the top of the content area, one for each email content variation. The number of tabs you see will depend on how many versions you have decided to test.\n\n  Make edits to each of your email content variations by selecting one of the tabs.\n\nIf you'd like to create a new variation based on any of the existing variations, select the variation you wish to clone and then click **Manage Variations** and then **Duplicate Variation**. From there, you can make any modifications to the duplicate. If you already have 6 variations, you will need to delete one before duplicating.\n\nTo delete a variation you no longer wish to keep, select the variation, click **Manage Variations** and then **Delete Variation.** When you do so, any remaining variations to the right of the deleted variation will be re-labeled and shift left. For example, if you have 3 variations and delete variation \"B,\" variation \"C\" will become \"B\".\n\n<call-out>\n\n**A/B Testing Tip - Adding Variations**\n\nTo know the direct cause for the best performing variation, we recommend only making one change per variation rather than many changes. This way, you can point to a direct cause for the differences in your stats.\n\n</call-out>\n\n## Select the A/B Test Single Send Sample Size\n\nChoose a percentage of your contact list that will participate in the A/B test. Each variation of the email will be sent to the same number of contacts within the participating portion of your list.\n\n<call-out>\n\nThe size of your sample can be up to 100% of your contact list. This may be helpful in the event that you would like to run two tests, send each test to a portion of your list, and manually select a winner.\n\n</call-out>\n\n## Determine the Winning Criteria for the A/B Test\n\nTwilio SendGrid can automatically select the winner of a test based on either the open rate or click rate. You can also manually select a winner when neither of the automatic selections suits your needs.\n\n- **Unique Open Rate**\n\n  Twilio SendGrid automatically selects the winning variation based on how many recipients [open]({{root_url}}/glossary/opens/) your email.\n\n- **Unique Click Rate**\n\n  Twilio SendGrid automatically selects the winning version based on how many recipients [click]({{root_url}}/glossary/clicks/) links and engage with the content in your email.\n\n- **Manual**\n\n  You can evaluate the performance of all variants and manually choose a winner based on each variant's performance across multiple metrics.\n\n## Set the A/B Test Duration\n\nYou can set your A/B test duration between 30 minutes and 24 hours.\n\nWhile you can test your email variations for up to 24 hours, emails will only be sent to the subset of contacts you've chosen to participate in the A/B test during the test duration you set. The remainder of your contacts will only be sent the winning variation of your A/B test email after the test duration has completed.\n\n<call-out>\n\n**A/B Testing Tip - Setting the Test Duration**\n\nYou should be mindful of your test duration, with respect to the timeliness of your Single Send content.\n\nFor example, if you have a one-day sale that happens the day of your Single Send, you should set the A/B test duration to less than 24 hours so that your remaining contacts still have time to get the final email and participate in your one-day sale.\n\n</call-out>\n\n## Sending the winning A/B test variation\n\n### Automatically selected winners\n\nWhen a variation wins based on unique click rate or unique open rate, you will be notified that a winner was chosen and which variation won. SendGrid will automatically send the winning email variation to the rest of your list.\n\n![]({{root_url}}/images/ab_testing_4.png 'A/B test winner')\n\n### Manually selecting a winner\n\nThere are likely times when neither the open rate nor the click rate alone best measures the success of a message. If, for example, version A had an open rate of 48% while version B had an open rate of 49%, version B would win an automatic selection based on open rate. However, if those two versions also had click rates of 45% for version A and 10% for version B, your winner based on a narrow margin in open rate would be significantly underperforming the alternative version in click rate. This is one scenario in which you could select a manual winner or re-evaluate your criteria for success.\n\nYou may also want to optimize for alternative metrics, including those that aren't tracked by Marketing Campaigns, such as conversions. Manually selecting a winner allows you to prioritize the metrics that are most important to you, including unsubscribes, spam reports, conversions, and more.\n\nAt the end of the A/B test duration, you will receive an email asking you to select the winner of your test.\n\n_To manually select the winner_\n\n1. Navigate to the [**Marketing Campaigns** > **Single Sends**](https://mc.sendgrid.com/single-sends) page.\n2. Select the Single Send associated with the completed A/B test.\n3. You will see the performance of each test variant across the following metrics\n   - **Delivered**\n   - **Opens**\n   - **Clicks**\n   - **Unique Opens**\n   - **Click Through Rate**\n   - **Total Click Through Rate**\n   - **Unsubscribes**\n   - **Spam Reports**\n\n![The stats or performance overview page for a Single Send A/B test]({{root_url}}/img/single_send_stats_overview_manualAB.png 'Single Send A/B test stats')\n\n4. Click the radio button beside a test variant to select it as the winner.\n5. Click **Pick Winner**.\n6. You will be presented with a modal asking you to confirm your selection. Click **Confirm** to proceed or **Cancel** to close the modal without selecting a winner.\n7. After clicking **Confirm**, the winner will be sent to the remaining contacts in your list. The winner will also be labeled on the Single Sends Dashboard and the Single Sends statistics overview page.\n\n#### Test expiration\n\nYou must select the winner of a manual A/B test within 7 days of the test completing.\n\nYou will receive an email one day before and one day after a test expires to keep you up to date about the test's status. The last date to select a test winner is also displayed on both the Single Sends index page and a Single Send's statistics summary page.\n\n![The Single Sends overview page with expired and soon to expire dates highlighted]({{root_url}}/img/select_winnerAB_single_send_index.png 'Single Sends Overiew Page')\n\n![A Single Send's stats overview page with the expiration date highlighted]({{root_url}}/img/select_winner_byAB_stats_page.png 'Single Send A/B test stats page')\n\n## Additional Resources\n\n- [Campaign Statistics]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats/)\n- [Design Editor]({{root_url}}/ui/sending-email/editor/#the-design-editor)\n- [Code Editor]({{root_url}}/ui/sending-email/editor/#the-code-editor)\n"
  },
  {
    "path": "content/docs/ui/sending-email/adding-dynamic-content-with-handlebars-in-marketing-campaigns.md",
    "content": "---\nlayout: page\nweight: 100\ntitle: Adding Dynamic Content with Handlebars in Marketing Campaigns\ngroup: marketing-campaigns\nseo:\n  title: Adding Dynamic Content with Handlebars in Marketing Campaigns\n  description: The use cases on this page will help you utilize Handlebars helpers to deliver dynamic content targeted to your customers.\n  keywords: Handlebars, formatDate, equals, greaterThan, lessThan, conditionals, dynamic, template, design, content\nnavigation:\n  show: true\n---\n\nMarketing Campaigns allows you to [insert substitution tags]({{root_url}}/ui/sending-email/editor/#using-substitution-tags) into your email content or subject lines. The tags you insert will dynamically populate the custom field data for that field on a per-recipient basis.\n\nYou can go beyond simple custom field replacement, using dynamic content and Handlebars to meet your goals.\n\nTo understand how to add tags to your Marketing Campaigns designs, see our [Editor documentation]({{root_url}}/ui/sending-email/editor/). The Editor documentation also explains how to preview your message with sample data.\n\nThis page provides several example use cases to show you how to modify the dynamic content in your designs with Handlebars. For a full reference of all available helpers, see [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/). First, we’ll outline how to handle default values when using handlebars in Marketing Campaigns.\n\n## Understand default values and Handlebars\n\nWhen you copy a tag from the **Tags** tab in the Marketing Campaigns editors, pasting the tag into your design will add a “default” automatically. The tag will look like the following example — the tag name followed by a pipe character and the word \"default.\" You can think of the pipe as the word \"or.\" This means the tag will be your recipient's `first_name` _or_ the word \"default.\"\n\n```handlebars\n{{ first_name | default }}\n```\n\nThe default is meant to provide a fallback value for the tag in the event that it cannot be populated with real data. For example, if you replace the word “default” with “Valued Customer,” your message will be delivered with the recipient's `first_name` _or_ the phrase “Valued Customer” when data for `first_name` is not available. This is usually preferable to a failing tag, which will display no text.\n\n```handlebars\n{{first_name | Valued Customer}}\n```\n\n### Syntax changes for saved tags\n\nDefault values are compatible only with the `insert` keyword. When you save your design, the tag’s syntax will change to become compatible with the `insert` keyword automatically. If you see the syntax change, don’t be concerned.\n\n**The tag when pasted**\n\n```handlebars\n{{first_name | Valued Customer}}\n```\n\n**The tag when saved**\n\n```handlebars\n{{insert first_name 'default=Valued Customer'}}\n```\n\n### Defaults without the insert keyword\n\nThe `insert` keyword and default values cannot be added to a tag when using another Handlebars helper to achieve more complex functionality. For example, you cannot [format a date](#use-the-formatdate-helper) with the formatDate helper and provide a fallback or default value for that formatted date in a single tag. The following example will break.\n\n**Broken example**\n\n```handlebars\n{{insert formatDate due_date \"MM/DD/YYYY\" 'default=30 days after signup'}}\n```\n\nBecause tags copied from the **Tags** tab are pasted with a default placeholder automatically, you must delete the `| default` portion of the tag when using other Handlebars helpers. If your helper is not working as expected, be sure that the tag did not save with `insert` and `'default=default'` inside.\n\nTo achieve fallback behavior when using other helpers, you can use conditional statements. For example, to a create a fallback for formatDate, you could wrap the tag in `{{#if}} {{else}}` tags as shown in the following example.\n\n**Working example**\n\n```handlebars\n{{#if due_date}}\n{{formatDate due_date \"MM/DD/YYYY\"}}\n{{else}}\n30 days after signup\n{{/if}}\n```\n\nFor more on conditional statements, see our [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/) page.\n\n## Use the formatDate helper\n\nTwilio SendGrid stores dates in [ISO 8601 date format](https://www.iso.org/iso-8601-date-and-time-format.html). This standard date format helps ensure that we handle dates and times correctly. However, ISO 8601 date format isn’t what recipients usually expect in the text of an email. For this reason, we provide the formatDate Handlebars helper to convert dates from ISO 8601 to a friendlier date format such as MM/DD/YYYY.\n\nIn Marketing Campaigns, you can use this helper to change how a date tag displays within your subject line or email content. For context, the tag options you see within the Marketing Campaigns editor are automatically created based on your custom fields.\n\nThe following example assumes you have a custom date tag called `offer_expiration`. You want to use this date tag to display the end of a promotion, prompting customers to take action before they miss out.\n\nWithin the Marketing Campaigns editor, your email copy looks like this (after removing the default value for your date field):\n\n```handlebars\nHappy Cake or Pie Anniversary {{ first_name | to you }}!\n\nIt’s hard to believe, but you joined the Cake or Pie Delicious Delivery service a year ago. We appreciate loyal customers like you, which is why we’re sending you a little anniversary gift offer.\n\nYou’ll receive 15% off all orders placed during your anniversary month. That’s 15% off all orders placed before {{ offer_expiration }}!\n\nThanks for being a customer,\n\nThe Cake or Pie Team\n```\n\nAs is, this email copy would display the `offer_expiration` in the ISO 8601 format (for example, `2020-05-08T17:06:24Z`). To change how this displays, you’ll use the formatDate helper.\n\nInside the Handlebars, `{{ }}`, add the name of the helper, formatDate, before the name of your tag. This tells Twilio SendGrid that you want to format the date for the `offer_expiration` tag. Keep a space before and after formatDate.\n\n```handlebars\n{{ formatDate offer_expiration }}\n```\n\nYou must then place the format you want to display in your email following the name of the tag. The formatting should be placed in quotation marks. Keep a space before and after your quotation marks.\n\n```handlebars\n{{ formatDate offer_expiration \"MM/DD/YYYY\" }}\n```\n\nTo change the displayed format for any date tag, you will always follow this pattern:\n\n```handlebars\n{{ formatDate <date tag> \"<desired format>\" }}.\n```\n\n<call-out>\n\nTo see which format tokens (eg. YYYY, dddd, MM) are available to display different date formats, see the full reference for the [formatDate helper]({{root_url}}/for-developers/sending-email/using-handlebars/#formatdate) in our Handlebars documentation.\n\n</call-out>\n\n## Conditional checks based on customer attributes\n\nHandlebars makes it possible to change the content of a message based on customer attributes that may not lend themselves to a segment. For example, you may want to deliver different messages based on customers’ ZIP codes or spoken languages.\n\n### Conditional check with equals\n\nIn this example, you will see how to conditionally change a message based on a recipient’s proximity to a store location, allowing you to deliver the sales most relevant to them.\n\nTo achieve this, you can maintain a custom field called `nearest_zip_code` that holds the store nearest each customer. You will automatically have this custom field available to you on the Tag tab in the Marketing Campaigns editors.\n\nTo change your message using this tag, your Handlebars code might look like the following example.\n\n```handlebars\n{{#equals nearest_zip_code 1234}}\n20% off all paperback books!\n{{else}}\nAmazing savings!\n{{/equals}}\n```\n\nThis example uses the `equals` helper to check the value of `nearest_zip_code` for each recipient. If the recipient’s nearest ZIP code equals 1234, they will see “20% off all paperback books.” If they are anywhere _else_, they will see “Amazing savings!”\n\nThis type of conditional may be helpful, but you will likely want to check for more than a single ZIP code. In this case, it’s also possible to add multiple equals checks chained onto else checks. At the end of your Handlebars block, be sure to add the closing equals tag, `{{/equals}}`, for each opening equals tag, `{{#equals}}`. To check for three ZIP codes, your Handlebars might look like the following example.\n\n```handlebars\n{{#equals nearest_zip_code 12345}}\n20% off all paperback books!\n{{else}}{{#equals nearest_zip_code 23456}}\n10% off all historical fiction\n{{else}}{{#equals nearest_zip_code 34567}}\nAmazing savings!\n{{/equals}}{{/equals}}{{/equals}}\n```\n\nNotice the three closing `{{/equals}}` tags, one for each `{{#equals}}` check.\n\n<call-out type=\"warning\">\n\nBe sure to test more complex uses of Handlebars before sending a message to one of your lists. Not all complex Handlebars can be previewed accurately using the **Preview** tab in Marketing Campaigns at this time.\n\n</call-out>\n\nYou could use a similar approach to check for the preferred language of your customers and provide text in that language. Using equals would make it possible to store a single `language` custom field and check its value as shown in the following example.\n\n```handlebars\n{{#equals language \"english\"}}\nHello, World!\n{{else}}{{#equals language \"español\"}}\n¡Hola Mundo!\n{{else}}{{#equals language \"français\"}}\nBonjour le monde!\n{{/equals}}{{/equals}}{{/equals}}\n```\n\n### Conditional check with greaterThan\n\nYou can use the greatThan helper to display text based on checks against number fields. For example, you might store the number of purchases a customer makes in a custom field called `total_purchases`. You might have another field where you store the current purchase goal for your customers called `purchase_goal`. If you wanted to deliver a message to either reward those who had exceeded your `purchase_goal` or encourage engagement from those who hadn’t, your Handlebars might look like the following example.\n\n```handlebars\n{{#greaterThan total_purchases purchase_goal}}\nThank you for being a loyal customer. To show our appreciation, please enjoy an additional 15% off your next purchase.\n{{else}}\nWe appreciate new customers like you. That’s why we’re offering 10% off your next purchase.\n{{/greaterThan}}\n```\n\nFor recipients whose `total_purchases` are greater than your `purchase_goal`, the message will display, “Thank you for being a loyal customer. To show our appreciation, please enjoy an additional 15% off your next purchase.” For those whose `total_purchases` is equal to or less than your `purchase_goal`, the message will display, “We appreciate new customers like you. That’s why we’re offering 10% off your next purchase.”\n\nYou could use a similar strategy with the lessThan helper.\n\n## Additional resources\n\n- [Design and Code Editor]({{root_url}}/ui/sending-email/editor/)\n- [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/)\n- [Cross-Platform Email Design]({{root_url}}/ui/sending-email/cross-platform-html-design/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/attachments-with-digioh.md",
    "content": "---\nseo:\n  title: Sending Attachments with Digioh\ntitle: Sending Attachments with Digioh\ngroup: partners\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n## Limitations\n\n### v3 Mail Send\n\nThe total message size of emails sent via the [v3 mail send endpoint](https://sendgrid.api-docs.io/v3.0/mail-send) is limited to 30MB. This includes all headers, the body, and attachments. That means\nthat the maximum attachment size depends on the size of the rest of the\nstuff in your message, but we do recommend that your attachments do not exceed 10MB.\n\n### v2 Mail Send\n\nThe total message size of emails sent via the [v2 mail send endpoint](https://www.twilio.com/docs/sendgrid/api/v2/mail) is limited to 20,480,000 bytes, or approximately\n19.5MB. This includes all headers, the body, and attachments. We recommend that your attachments do not exceed 7MB.\n\n<call-out>\n\nKeep in mind that the size of your file on disk or in memory may\nnot be the same as the size of the file once it is attached, as files must\nbe encoded as text to be sent. You can expect an increase in size of up\nto 30%.\n\n</call-out>\n\n## Best Practices\n\nAttachments are in and of themselves potential risks when sending email.\nEmail filters are more likely to prevent delivery of a message that has an attachment\ndue to the risk of viruses.\n\nA good alternative to attaching a file to your message is to place it on a page of your website,\nand then provide a link to that web page within your message body.\n\n## Using Digioh\n\nSendGrid has partnered with Digioh, a digital download distribution service. This allows you to send\nfiles up to 2GB in your SendGrid Marketing Emails. Digioh also allows you to track individual\ndownloads and prevent non-subscribers from downloading files.\n\nDigioh is integrated with SendGrid's Marketing Email solution, so you can be up and running in no time.\n\n[Sign Up for a Free Digioh + SendGrid\nAccount](https://digioh.com/sendgrid)\n\n## Sending email with attachments via SendGrid\n\nTo send emails with attachments via SendGrid, you can employ our [SMTP Relay]({{root_url}}/glossary/smtp-relay) or our [Web API v3](https://sendgrid.api-docs.io/v3.0/mail-send).\n"
  },
  {
    "path": "content/docs/ui/sending-email/blocks.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Blocks\ngroup: delivery-optimization\nseo:\n  title: Blocks\n  description: When your email has been blocked by an ISP or your IP is on a deny list.\n  keywords: blocks, bounces, hard bounces, deny list, ISP Blocks, Mail provider blocks\nnavigation:\n  show: true\n---\n\n[Blocks]({{root_url}}/glossary/blocks/) happen when your message was rejected for a reason related to the message, not the recipient address. This can happen when your mail server IP address has been added to a deny list, blocked by an ISP, or if the message content is flagged by a filter on the receiving server.\n\nThe “Reason on the Block” will clarify what the exact reason is. Typically, it’s possible to have your IP address removed from a deny list, and some lists automatically do this after a period of time. Message content can be modified to correct a filtered block.\n\n<call-out>\n\nUnlike addresses on our other suppression lists, new messages to blocked addresses will be attempted, as the message content is likely different, and may not be blocked.\n\n</call-out>\n\nThe list provided here can be filtered by email address or date.\n\n## Searching Blocks by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the dates you would like to search between. Your recipient list will refresh, showing the email addresses that were blocked between these dates as well as the block reason.\n\n## Removing Recipients from The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list.\n\n## Download Blocks as CSV\n\nYou can download your Global Unsubscribe list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away.\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n### Looking for more visibility into your email performance?\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n</call-out-link>\n\n## Additional Resources\n\n- [Bounces]({{root_url}}/ui/sending-email/bounces/)\n- [Global Unsubscribes]({{root_url}}/ui/sending-email/global-unsubscribes/)\n- [Web API and Blocks](https://sendgrid.api-docs.io/v3.0/blocks-api)\n\n<call-out>\n\nLooking for customized expert advice to improve your email program? Our team of email experts can help you create a plan to ensure you're optimizing your email delivery and engagement, and avoiding future issues. Learn more on our [Expert Services](https://sendgrid.com/solutions/expert-services/?utm_source=docs) page.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/sending-email/bounces.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Bounces\ngroup: delivery-optimization\nseo:\n  title: Bounces\n  description: SendGrid will help prevent you from resending to a recipient whose email server rejects the messages.\n  keywords: Bounce suppressions, bounce unsubscribes, bounce email unsubscribe, bounce email suppression\nnavigation:\n  show: true\n---\n\nA bounce occurs when a sent message is rejected by the receiving mail server. The most common causes for bounced email messages include a misspelled or nonexistent email address. A repeat bounce is when an address has bounced, then bounced a second time and logged to the bounce suppression list, but you ask us to send to this recipient again. Our system will suppress the message because it ‘knows’ that recipient address is bad.\n\n## \tBounce Notifications\n\nIf you would like to receive a notification for each bounce message, you can turn on Bounce Forwarding in your Mail Settings.\n\n## \tSearching Bounces by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the dates you would like to search between. Your recipient list will refresh, showing the recipients who bounced between these dates.\n\n## \tDownload Bounces as CSV\n\nYou can download your Bounce list as a CSV by clicking the gear icon at the top of the page and selecting **Download CSV**. The file will download in your browser right away.\n\n## \tRemoving Recipients From The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list. You can also use the Bounce Purge.\n\n## \tAdditional Resources\n\n- [Global Unsubscribes]({{root_url}}/ui/sending-email/global-unsubscribes/)\n\n- [Group Unsubscribes]({{root_url}}/ui/sending-email/group-unsubscribes/)\n\n<call-out>\n\n Looking for customized expert advice to improve your email program? Our team of email experts can help you create a plan to ensure you're optimizing your email delivery and engagement, and avoiding future issues. Learn more on our [Expert Services](https://sendgrid.com/solutions/expert-services/?utm_source=docs) page.\n\n </call-out>\n"
  },
  {
    "path": "content/docs/ui/sending-email/checking-email-source.md",
    "content": "---\nseo:\n  title: How do I check the headers/raw source of an email?\n  description: How do I check the headers/raw source of an email?\n  keywords: bounces, email, headers, raw, source\ntitle: How do I check the headers/raw source of an email?\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nBeing able to check the raw headers of an email can be incredibly useful when troubleshooting. Headers contain all sorts of details about a message's security, composition, and even the journey it takes from point A to point B.\n\nOur Support agents may sometimes ask you to give us the raw source or headers of an email to help them solve email issues. Below are a few methods for obtaining headers in some popular mail clients. \n\n \n\n**Gmail**\n\n![]({{root_url}}/images/headersgif2.gif)\n\n \n\n \n\n \n\n**Thunderbird**\n\n![]({{root_url}}/images/TbirdheadersGIF.gif)\n\n \n\n \n\n \n\n**Outlook**\n\n![]({{root_url}}/images/Outlookheaders.gif)\n\n \n\n \n\n**Yahoo**\n\nLook for the option called \"View Raw Message\" under the More menu (displayed as 3 dots).\n\n \n\n \n\n \n\n"
  },
  {
    "path": "content/docs/ui/sending-email/coming-soon-to-new-marketing-campaigns.md",
    "content": "---\ntitle: Coming soon to Marketing Campaigns\nweight: 0\ngroup: marketing-campaigns\nlayout: page\nnavigation:\n  show: false\nseo:\n  title: Coming soon to Marketing Campaigns\n  description: Coming soon to Marketing Campaigns\n  keywords: sendgrid account, sendgrid plan, email account, emails per month\n---\n\n**Pardon our dust!**\n\nThere are some important features that are coming soon to our brand new version of Marketing Campaigns, we appreciate your patience as we deliver them for you.\n\n <table>\n  <tr>\n    <th><span style=\"font-weight:bold\">Deliverable</span></th>\n    <th><span style=\"font-weight:bold\">Targeted availability</span></th>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/sending-email/email-testing/#purchasing-additional-credits\" target=\"_blank\" rel=\"noopener noreferrer\">Additional Email Testing credits</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/sending-email/a-b-testing/\" target=\"_blank\" rel=\"noopener noreferrer\">A/B testing for Single Sends</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/managing-contacts/segmenting-your-contacts\" target=\"_blank\" rel=\"noopener noreferrer\">Create segments based on custom fields, reserved fields, and engagement with Single Sends</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td>Segmentation API</td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/sending-email/working-with-marketing-templates/#creating-a-template-from-a-single-send\" target=\"_blank\" rel=\"noopener noreferrer\">Saving a Single Send or Automation email as a template</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/sending-email/working-with-marketing-templates/#duplicating-a-custom-template\" target=\"_blank\" rel=\"noopener noreferrer\">Duplicating a Marketing Campaigns template</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td>View a sample of contacts on a segment</td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td>Send a test email from within Single Sends</td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  <tr>\n    <td>View a sample of contacts on a list</td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td>Designate an IP pool for a Single Send</td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/sending-email/getting-started-with-automation/#automation-use-cases-and-examples\" target=\"_blank\" rel=\"noopener noreferrer\">Trigger an automation to a segment</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.com/docs/ui/analytics-and-reporting/marketing-campaigns-stats/\" target=\"_blank\" rel=\"noopener noreferrer\">View which links within an email were clicked</a></td>\n    <td><span class=\"status-highlighter\">Delivered</span></td>\n  </tr>\n  <tr>\n    <td>View per-contact engagement data</td>\n    <td>Future</td>\n  </tr>\n  <tr>\n    <td>Export statistics for a Single Send or an Automation</td>\n    <td>Q3 2020</td>\n  </tr>\n  <tr>\n    <td>Automation API</td>\n    <td>Future</td>\n  </tr>\n</table>\n"
  },
  {
    "path": "content/docs/ui/sending-email/content-delivery-networks.md",
    "content": "---\nseo:\n  title: Content Delivery Networks\ntitle: Content Delivery Networks\ngroup: delivery-optimization\nlayout: page\nweight: 0\nnavigation:\n  show: true\n---\n\nContent Delivery Networks are a great mechanism that you can use to serve up content very quickly and easily across multiple mediums as well as handle security certificates for you.\n\nWe suggest [CloudFlare](#using-cloudflare), [Fastly](#using-fastly), or [KeyCDN](#using-keycdn) when using Content Delivery Networks with SendGrid.\n\n\n## Using CloudFlare\n\n\nThe following instructions assume you already have a CloudFlare account made, using either a [Full DNS setup](https://support.cloudflare.com/hc/en-us/articles/205195708) or a [CNAME setup](https://support.cloudflare.com/hc/en-us/articles/200168706). You can compare the 2 different setups [here](https://support.cloudflare.com/hc/en-us/articles/203685674). Note that a CNAME setup is only available to Business or Enterprise level CloudFlare plans.\n\nThe instructions also assume that you have set up a valid [branded link]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/) on your account. This step is essential for the following instructions to work.\n\nBegin by logging into your CloudFlare account, and navigating to the DNS settings for your domain.\n\n![CloudFlare DNS Settings]({{root_url}}/images/cloudflare1.png)\n\nAdd a new CNAME entry that points your configured branded link domain to sendgrid.net.\n\n![CloudFlare DNS Addition]({{root_url}}/images/cloudflare2.png)\n\nOnce the record is created, click on the cloud icon under the Status column to turn it orange and enable HTTP proxy.\n\n![CloudFlare DNS HTTP proxy]({{root_url}}/images/cloudflare3.png)\n\nNext, navigate to the Page Rules settings for your domain. You will need to create a Page Rule for your branded link domain that sets SSL to Full. This is necessary due to how [CloudFlare validates the certificate on the origin](https://support.cloudflare.com/hc/en-us/articles/200721975). You can find more information on the different SSL options [here](https://support.cloudflare.com/hc/en-us/articles/200170416).\n\n![CloudFlare Page Rules Addition]({{root_url}}/images/cloudflare4.png)\n\nEnsure that the Page Rule is On.\n\n![CloudFlare Page Rules Verification]({{root_url}}/images/cloudflare5.png)\n\nIf you are using a CNAME setup, you will also need to change DNS to point to the CloudFlare CNAME you created.\n\nOnce all of this is done, you will need to contact [SendGrid support](https://support.sendgrid.com/) and request that SSL click and open tracking be enabled on your account. They will then verify the configuration and enable the setting on your account.\n\n## \tUsing Fastly\n\n1. [Sign up for Fastly](https://www.fastly.com/signup/) or [log in](https://manage.fastly.com) to an existing account.\n2. Click **Configure** on the Dashboard.\n3. Click the gear icon to open the **Manage Service** menu and click **Create**.\n\nSet the options as follows:\n\n* **Server address and port:** `sendgrid.net` : `443` _The connection on the SSL port 443_\n* **Domain:** `email.example.com` _Enter your branded link domain here. Ensure it matches the domain configured in the SendGrid link branding settings. This value will be what recipients see in your SSL enabled click tracking links._\n* **Description:** `SendGrid` (or whatever you like)\n\nFinally, click the **Create**. The new service will appear in the list of available services.\n\nContact SendGrid support to validate your CDN settings and enable SSL click and open tracking.\n\n<call-out>\n\nFor more information, please visit [Fastly's documentation](https://docs.fastly.com/guides/basic-setup/working-with-services#creating-a-new-service).\n\n</call-out>\n\n## \tUsing KeyCDN\n\nThis section is maintained by KeyCDN, if you have any questions about KeyCDN please [contact their support](https://www.keycdn.com/support/) team.\n\n[Sign up for KeyCDN](https://app.keycdn.com/signup) or login to your\nexisting account.\n\nCreate a pull zone and point the origin URL to https://sendgrid.net.\n\n![KeyCDN Pull Zone]({{root_url}}/images/keycdn1.png)\n\nEnable SSL and HTTP/2 (custom SSL or Let's Encrypt).\n\n![KeyCDN Enable SSL]({{root_url}}/images/keycdn2.png)\n\nEnable the option \"Forward Host Header.\"\n\n![KeyCDN Forward Host Header]({{root_url}}/images/keycdn3.png)\n\nCreate a CNAME record in your DNS settings pointing the alias you want to use for your email branded link domain (e.g. email.domain.com) to the Zone URL provided within your KeyCDN dashboard (e.g. sendgrid-1c6b.kxcdn.com). Then, add that alias as a Zonealias.\n\n![KeyCDN Zonealias]({{root_url}}/images/keycdn4.png)\n\nFinally, [contact SendGrid support](https://support.sendgrid.com/hc/en-us), and they'll validate the CDN settings and enable SSL click and open\ntracking.\n"
  },
  {
    "path": "content/docs/ui/sending-email/create-and-edit-legacy-transactional-templates.md",
    "content": "---\ntitle: Create and Edit Legacy Transactional Templates\ngroup: transactional-email\nseo:\n  title: Create and Edit Legacy Transactional Templates\n  description: Transactional email templates are pre-coded email layouts that anyone can use to easily create and send transactional emails.\n  keywords: transactional email templates, email template, create templates\nweight: 80\nlayout: page\nnavigation:\n  show: true\n---\nCreating email templates involves a mix of content writing, HTML, and CSS expertise. Email templates should look good on different email clients and be responsive for mobile devices. Many non-technical customers will hire a front-end or email template developer to build their templates. We also suggest testing your templates with rendering applications like [Litmus](http://litmus.com) before sending them to your customers.\n\n<call-out>\n\nThe maximum number of transactional templates and versions per user ID is limited to 300. This means you can have 300 templates with 1 version each, or fewer templates with more versions of each template.\n\n</call-out>\n\n<call-out>\n\nTransactional templates are account and Subuser specific. Templates created on a parent account will not be accessible from the Subuser accounts.\n\n</call-out>\n\n## \tCreating a template\n\n1. Open the [Legacy Templates](https://sendgrid.com/templates) page and then click **Create Template**.\n1. Add a unique template name in the dialogue box and then click **Save**.\n1. Open the **Actions** drop-down menu to create a new version.\n1. Click **Add Version**.\n<br></br>The editor opens. From here, you can change the subject and the body of your email template.\n\nThe easiest way to get started with a new template is to use one of your previous email templates or a free template from the internet, and then modify it to fit your needs.\n\n## \tEditing your HTML template\n\n<call-out>\n\nEmail templates are table-based HTML with inline or header styles, because some well-known email applications will only read table-based HTML.\n\n</call-out>\n\n*To add a template:*\n\n1. Open a new template in the [Code Editor]({{root_url}}/ui/sending-email/editor/#the-code-editor) or [Design Editor]({{root_url}}/ui/sending-email/editor/#the-design-editor) by clicking **Actions** and selecting **New Version**.\n\n1. If you selected the Code Editor, copy and paste your HTML code into the code editor.\n<br></br>If you paste in an email template, it is likely that you will overwrite the default basic HTML provided in the code editor. If you selected the Design Editor, use the WYSIWYG editor with drag & drop modules to create your email template.\n\n1. When you’re done editing, click **Save**. <br></br>Please double check that the content is formatted correctly before you send an email using this template.\n\n## \tPreview and test your template\n\nSendGrid suggests previewing and testing your template once you have created it to ensure that the format and layout look the way you expect.\n\n*To preview your template:*\n\n1. Select **Preview**. <br></br>A window pops out with a preview of the email that you’re going to test, with the option to view the template formatted for both mobile and desktop platforms.\n\n1. Click **Send Test** to send a test email using your new template.\n1. Fill in the *recipient* and *subject line* fields and then click **Send**.\n\n\n<call-out>\n\nAny Substitution tags will not be populated in this test, but you will be able to confirm the layout and format of your template.\n\n\n</call-out>\n\n## \tManaging templates\n\nFrom the main template view on each template group, you will see an actions menu. From this menu, you can choose to edit the name of your template, add a version, preview, test, or delete the template. You will also see an action menu for each template version. Clicking this presents a menu that allows you to preview and test, edit, duplicate, and delete the template version. You can also use the preview function to send a test.\n\n<call-out>\n\nWhen you delete a template you will delete all the versions of your template.\n\n</call-out>\n\n ### \tActivate your template\n\n*To activate your template:*\n\n1. Navigate to the template you wish to use and select the action menu.\n1. Select **Make Active**.\n\n<call-out>\n\nA template can only have one active version at a time. If you’ve created a new version with different HTML that you want your customers to start receiving, you’ll need to make that version “Active.”\n\n</call-out>\n\n ### \tDuplicate a Template\n\n*To duplicate a template:*\n\n1. Navigate to the template you wish to use and select the action menu.\n1. Select **Add Version**.\n\nThe app creates a clone, giving it a name that starts with \"untitled\". You can give the template a unique name by selecting the action menu next to that version and clicking **Edit**. Once the editor has opened, enter a unique name in the *Template Name* field. This duplicate version will not be active until you activate it.\n\n\n## \tAdding unsubscribe links to a template\n\nFor more information about unsubscribes, check out our [unsubscribe documentation]({{root_url}}/ui/sending-email/index-suppressions/).\n\n\n\n## Additional Resources\n\n- [Dynamic Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/)\n- [Design & Code Editor]({{root_url}}/ui/sending-email/editor/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/create-and-manage-unsubscribe-groups.md",
    "content": "---\nlayout: page\nweight: 90\ngroup: marketing-campaigns\ntitle: Create and Manage Unsubscribe Groups\nseo:\n  title: Create and Manage Unsubscribe Groups\n  description: Suppression Manager helps you to define and manage unsubscribe groups to keep you out of the spam folder.\n  keywords: unsubscribe groups, suppressions, manage unsubscribe groups, delete unsubscribe groups\nnavigation:\n  show: true\n---\n\n<iframe src=\"https://player.vimeo.com/video/373265768\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n<call-out>\n\nThis page is describing the functionality of the new Marketing Campaigns experience. If you're using legacy Marketing Campaigns, your workflow and screens may be a little different. For more information on the new Marketing Campaigns experience click [here](https://sendgrid.com/pricing).\n\n</call-out>\n\nAdding Unsubscribe Groups to your emails makes it easy to honor your recipients' email preferences and protect your sender reputation by complying with anti-spam legislation.\n\n## Create an Unsubscribe Group\n\n*To create an Unsubscribe Group:*\n\n1. Select **Marketing** and then click **Unsubscribe Groups**.\n1. Click **Create New Group**.\n1. Add a *Group Name* and *Group Description*.\n\n<call-out>\n\nMake sure your Group Names and Group Descriptions are customer-friendly. This is what your recipients will see.\n\n</call-out>\n\n4. Select the checkbox if you want the Unsubscribe Group to display on the unsubscribe preferences page.\n5. Click **Save Unsubscribe Group**.\n\n<call-out>\n\nTo view the unsubscribe preferences page, select the action menu next to an Unsubscribe Group and then click **Preview**. Toggle to the Unsubscribe Preferences tab to view all of the options listed.\n\n</call-out>\n\n## Adding an Unsubscribe Group to your Email\n\n*Using the Design Editor:*\n\n1. Select your preferred Unsubscribe Group by clicking **Settings** and selecting the group from **Recipients**.\n1. From the **Build** tab, drag the **Unsubscribe** module to insert Sender Information and a link to the `{{{unsubscribe}}}` tag.\n1. To manually hyperlink to the {{{unsubscribe}}} tag, enter the text you would like to link.\n1. Highlight the text then select the link icon from the top toolbar.\n1. In the URL field enter `{{{unsubscribe}}}`, then click **Save**.\n\n*Using the Code Editor:*\n\n1. Select your preferred Unsubscribe Group by navigating to **Settings** and then selecting **Recipients**.\n1. Enter the following code styling to the HTML window where you would like your unsubscribe content placed:\n\n```\n<a href=\"{{{unsubscribe}}}\">Click here to unsubscribe.</a>\n```\n\n## Using a Custom Unsubscribe Link\n\nWhile Twilio SendGrid Unsubscribe Groups are a powerful way to manage unsubscribes and email preferences, we realize some senders may have their own subscription management tools. For these senders, Marketing Campaigns supports custom unsubscribe links as well.\n\nIf you would like to use a custom URL for your unsubscribe link, from the Editor, navigate to **Settings** in the left-hand sidebar and select the **Recipients** dropdown menu. Under **Unsubscribe Group**, select **Use Custom Link...**\n\nThis will expand a new field where you can insert a URL for one of your own pages where recipients can manage their subscription preferences.\n\nTo place your Custom Unsubscribe link into your email, highlight any text within the body of your email and click the small link icon to specify a hyperlink. In the URL field that appears, enter the tag `{{{unsubscribe}}}`. Since you've specified your Custom Unsubscribe Link in the Settings panel, SendGrid will replace the Unsubscribe Tag with your custom URL.\n\n## Add recipients to an Unsubscribe Group\n\nYou can add recipients to an unsubscribe group by uploading a CSV or adding them manually using the UI. To programmatically add recipients to an unsubscribe group, see our [API documentation](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups)\n\n*To upload a CSV:*\n\n1. Find the group you want to add recipients to and click the action menu.\n\n![]({{root_url}}/img/unsub_action_menu.png \"Unsubcribe Group action menu\")\n\n2. Select **Upload a CSV**.\n3. Drag the CSV you want to upload into the field, or click **select a CSV file to upload** and locate the file you want to upload from your files.\n4. Click **Upload CSV**.\n\n*To manually add recipients to an Unsubscribe Group:*\n\n1. Find the group you want to add recipients to and click the action menu.\n1. Select **Manually Add**.\n1. Enter a recipient email address and then click **Save**.\n\n## Managing Unsubscribe Groups\n\nFrom the UI, you can edit Unsubscribe Groups or download a list of recipients that have unsubscribed from your emails. For more information on managing unsubscribes, see the SendGrid [Suppressions Overview]({{root_url}}/ui/sending-email/index-suppressions/#managing-unsubscribes)\n\n### Exporting an Unsubscribe Group List\n\n*To export an Unsubscribe Group List:*\n\n1. Navigate to the Unsubscribe Group you want to export.\n1. Click the action menu.\n1. Select **Export**. Once the export is completed, a download link will be sent to the email(s) you either signed up with, or have set to receive [notifications]({{root_url}}/ui/account-and-settings/notifications/).\n\n### Editing an Unsubscribe Group\n\n*To edit an Unsubscribe Group:*\n\n1. Navigate to the Unsubscribe Group you want to edit.\n1. Click the action menu.\n1. Select **Edit**.\n\nFrom the Edit Group page, you can change the Group Name, Group Description, and display preferences.\n\n### Deleting an Unsubscribe Group\n\n*To delete an Unsubscribe Group:*\n\n1. Navigate to the Unsubscribe Group you want to delete.\n1. Click the action menu.\n1. Select **Edit**. The Edit Group page opens.\n1. Click **Delete Group**.\n1. Confirm that you want to delete the selected group and then click **Delete**.\n\n![]({{root_url}}/img/confirm_unsub_group_delete.png \"Confirm Unsubscribe Group Delete\")\n\n## Additional Resources\n\n- [Suppressions Overview]({{root_url}}/ui/sending-email/index-suppressions/)\n- [Group Unsubscribes]({{root_url}}/ui/sending-email/group-unsubscribes/)\n- [Global Unsubscribes]({{root_url}}/ui/sending-email/global-unsubscribes/)\n\n"
  },
  {
    "path": "content/docs/ui/sending-email/cross-platform-html-design.md",
    "content": "---\nseo:\n  title: HTML Rendering - Cross-Platform Email Design\n  description: HTML Rendering - The Do's and Dont's of Cross-Platform Email Design\n  keywords: render, message, layout, html, css, cross-platform\ntitle: Cross-Platform Email Design\ngroup: building-email\nweight: 0\nlayout: page\nzendesk_id: 200184928\nnavigation:\n  show: true\n---\n\nAll Mail clients render HTML/CSS differently, in their own ways and for their own reasons. The differences in what HTML and CSS they support depends on many factors. When rendering HTML and CSS in emails many things impact what the end user is going to see. The mail exchange server, the preprocessor, the browsers, the rendering engines, and more; all affect the way your message is going to be displayed. These vary from client to client; browser to browser; server to server. However, don't start pulling your hair out just yet, because there are some best practices you can utilize so that your emails' coding will stay intact across different clients and platforms.\n\n## Layout\n\n- **Avoid using padding or margins**\n  - Certain email clients don't support these formatting settings. For example, Outlook cannot support padding, and Hotmail cannot support margins.\n  - These can be especially problematic when added inside of a table in either mail client.\n\n\n- **Always use inline CSS**\n  - Most webmail clients (Outlook.com, Yahoo.com, Gmail, etc) will strip CSS out when stripping the head and body tags.\n\n    - Make sure you render coding very carefully so it conforms to the email client's pre-set HTML.\n\n- **Avoid BR, HR, and height tags in your emails**\n\n  - Every browser/client has their own default line height and will default to it most of the time.\n  - Workaround in next bullet point below.\n\n\n- **Use Tables to create general layout of email**\n\n  - Set the width of each cell in the table.\n\n  - Avoid cell spacing and padding.\n\n- **Always set a \"doctype\" in your code**\n- **Set wrapper reset styles in \"wrapper div\"**\n\n  - This can override a browser or client's default styling of certain elements.\n  - Click [here](http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/) for more information on reset styles.\n\n\n- **Be aware of text and font changes per device (mobile especially) and browsers**\n\n  - Mobile devices and different browsers may change the font styling to increase readability.\n  - For example, *Comic Sans* is not supported on mobile devices.\n\n## Backgrounds\n\n- **Use the older more basic background HTML tags**\n\n  - \"background-image\" ; \"bgcolor\" ; \"background\"\n  - Many browsers and clients experience issues when trying to support compound CSS values, so be sure to use individual values such as \"background-image\" and \"background-repeat\"\n\n\n- **Always offer reset background colors or fall back background colors to defer to if your specific background isn't supported**\n\n## Images \n\n- **SendGrid Image Library**  - .jpg, .gif, and .png files can be uploaded to the SendGrid Editor for use with Email Designs\n- **Always provide image dimensions**\n\n  - Some mail clients will automatically apply their own if none are given which can lead to major issues when rendering these images in relation to spacing and alignment.\n\n    - It is important to note however that some mail clients will do this regardless as a default setting.\n\n- **Make sure to give ALL of your images 'alt' attributes** - This simple step will keep the overall sizing of your images the same across platforms.\n \n- **Outlook.com adds some pixels at the end of each image which can rearrange spacing, alignment, or padding**\n\n  - Use the \"Outlook.com hack\" - `img {display:block;}`. This removes the padding in outlook.com and gives predictable results across many other email clients in terms of added spacing or padding to images.\n\n\n- **Avoid 'float' tags**\n\n  - Outlook cannot support these tags, so SendGrid recommends using align tags. For example, `<img src=\"image.jpeg\" align=\"right\">`.\n  \n  - Yahoo! has similar issues, so SendGrid recommends using align=\"top\" for the image in question.\n\n\n## \tControlling converted plain text email output\n\n<call-out type=\"warning\">\n\nDue to low usage, this feature has been removed. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\n\n*To control the output of plain-text conversion do one of the following:*\n\n1. Turn off the filters causing the conversion from plain text to HTML.\n1. Start each line with a space, this will add a \"preformatted\" `<pre>` tag around the line.\n1. Separate new sentences with double newlines, which will add a \"paragraph\" `<p>` tag around the sentence.\n1. Convert your message to HTML, bypassing our need to convert it all together.\n1. To disable conversion globally, click **Mail Settings** and select **Plain Content** and enable the suppression.\n\n**Why can't you just automatically add `<br />` tags to newlines upon conversion?**\n\nDue to the way plain text emails are sent ( [RFC 5822](http://www.rfc-editor.org/rfc/rfc5322.txt \"Link: http://www.rfc-editor.org/rfc/rfc5322.txt\"), Revised 2008) mailers are required to wrap lines at 998 characters, and recommends wrapping at 78 characters (excluding CR/LF). As a result, long sentences can often be broken up into multiple lines. Adding `<br />` tags to each newline would create formatting problems.\n\n**For more information**\n\nWe use the open-source library [MKDoc-Text-Structured](http://search.cpan.org/~bpostle/MKDoc-Text-Structured-0.83/lib/MKDoc/Text/Structured.pm) to perform the plain-text to HTML conversion. More information about this library and how it works can be found on the [MKDoc-Text-Structured documentation page](http://search.cpan.org/~bpostle/MKDoc-Text-Structured-0.83/lib/MKDoc/Text/Structured.pm).\n\n## Videos\n\n  - Many clients simply cannot support rendering video (other than GIFs) in their emails\n  - JavaScript nor the object tag are supported in many clients or browsers and thus can't support video rendering\n\nIf you're still having issues, please contact our support team for help. We can provide the tools and the knowledge base to help you understand what your mail will look like across platforms and how to gain insight in making them appear consistent across these platforms.\n\n\n"
  },
  {
    "path": "content/docs/ui/sending-email/deliverability.md",
    "content": "---\nseo:\n  title: Deliverability Overview\n  description: Email Deliverability Overview\n  keywords: spam, bulk, box, segmentation, folder, inbox, list, deliverability, best, practice, engagement, blocked, not, delivered, delivery, spammy, can, can-spam, deliver\ntitle:  Deliverability Overview\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nBelow are some email deliverability tips and tricks from leading industry experts. While none of these are required, they all come highly recommended from SendGrid.\n\nSatisfying each of the below conditions is a great step toward resolving current or potential issues with email deliverability such as spam folder delivery or being added to a deny list.\n\n## \tWho, What, When, Where, Why\n\nFirst and foremost, ask yourself this question:\n\n**Am I sending the right message to the right person at the right time with the right frequency?**\n\nOverall email deliverability is influenced by how your recipients interact with your messages. If your messages are opened in a timely manner, images are displayed and links are clicked, then mail providers will see you as a sender whose messages their recipients want to receive. If messages pile up, remain unopened or get marked as spam, mail providers won't be as comfortable placing your messages in the inbox or accepting them at all!\n\n<call-out-link linktext=\"EXPERT SERVICES\" img=\"/img/expert-insights-promo3.png\" link=\"https://sendgrid.com/solutions/expert-services/\">\n\n\n### Need a helping hand?\n\n\nGetting into the inbox just so you can have the chance to engage with your customers often isn’t as easy as pressing “send.” Get customized advice from our team of email experts on how to optimize your email strategy.\n\n\n</call-out-link>\n\n\n## \tAdhere to Standards\n\nThe second biggest factor in inbox delivery is the actual content you send in your messages. It's very important to ensure your emails meet every CAN-SPAM requirement.\n\nSome key takeaways from [CAN-SPAM](https://www.ftc.gov/tips-advice/business-center/guidance/can-spam-act-compliance-guide-business):\n\n- Don't deceive your recipients. Be up front with who you are and what kind of messages you are sending.\n- Provide your recipients with a way to opt-out of messages.\n\n[Read the full CAN-SPAM Act here!](http://business.ftc.gov/documents/bus61-can-spam-act-compliance-guide-business) This is required reading for any aspiring email acolyte.\n\n ### \t\"No, thank you.\"\n\nOne of the most important parts of CAN-SPAM is this line:\n\n**\"Tell recipients how to opt out of receiving future email from you.\"**\n\nAll email providers look for an unsubscribe method (or links) in all emails. Even though it may not make sense for transactional mail, it can make the difference between messages arriving in the inbox or the spam folder. [Subscription tracking]({{root_url}}/ui/sending-email/subscription-tracking/) automatically inserts an unsubscribe link into all your emails and maintains the Unsubscribe list.\n\nThink of it this way: would you rather a recipient politely decline future emails from you or mark your messages as spam because they have no other option?\n\n ### \tWho are you?\n\nMaximum company visibility helps as well. Placing your company name in the subject line of your emails and including your physical mailing address and phone number in your email footers helps mail providers recognize you as a legitimate company and email sender. This also helps your recipients know that this message is indeed from you!\n\nWe've all ignored phone calls from numbers we don't recognize, the same goes for email!\n\n<call-out type=\"warning\">\n\nCAN-SPAM actually requires you inform recipients of where you are located.\n\n</call-out>\n\n ### \tSegment your traffic\n\nKeeping your mail streams separated can make a huge difference in the long run. Specifically, [segmenting]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/) your marketing email from your transactional email is a great way to keep legitimate mail out of trouble.\n\nSay, for example, you are sending your Daily Knitting Update emails on the same account and the same IP address as your receipts, invoices, and password resets.\n\nThe day then comes where one of your recipients simply can't take it anymore and marks every single Daily Knitting email they've ever received from you as spam. Knitting overload!\n\nThe potential fallback from this is that not only will that recipient no longer receive their important receipts, invoices, and password resets, but it then becomes possible that ALL recipients at the same domain or ISP may also run afoul of the same problem. Yikes!\n\nConsider setting up a [new Subuser account]({{root_url}}/ui/account-and-settings/subusers/) with an [additional dedicated IP address]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/) specifically for your marketing email, for example:\n\n* Parent account | IP 1 | Receipts, invoices, and password resets\n* Subuser account | IP 2 | Marketing/Promotional emails\n\nThis simple division will keep your important email in the clear, even if one stream runs into trouble. Remember, don't cross the streams!\n\n ### \tEncourage recipients to trust you\n\nWith email, things don't happen overnight, and magic wands are few and far between. So for the most part, the actions of your recipients are the highest voice of authority.\n\nEncouraging your recipients to do certain things can help bolster the trust ISPs have for you and your messages. Some examples can include:\n\n- \"Add us to your address book!\" - Having a recipient add your *from address* to their address book or trusted senders list can go a long way. More often than not, if one of an ISPs recipients trust a sender, they will be more lenient to similar messages to different recipients!\n- Star or Mark as important - A simple inbox action like this is just another way your recipients can tell their mail providers that \"Hey, I want these messages\".\n- IP Allow List - Some ISPs or mail admins can add rules to always allow _all_ incoming mail from specific IP addresses! Consider reaching out to the postmaster(usually example@example.com) of problematic mail domains to see if they can allow [your dedicated IP address]({{root_url}}/ui/account-and-settings/ip-access-management/).\n- \"If you don't receive an email right away, please check your spam folder and mark \"not spam\" - Adding this simple sentence to your sign-up form area can solve a lot of potential heartache. If a message you sent ends up in the Spam folder, and the recipient manually goes in and pulls it out, that's fantastic! This not only helps an ISPs incoming mail filters in avoiding false positives, but also improves your standing with that ISP.\n\n### Sending Adult Content\n\nIf your business is adult in nature, we can send your mail to the same standards and deliverability as any of our other customers. However, **We do not allow our users to send explicit content within emails.** This applies primarily to images, but we reserve the right to refuse the sending of any type of content that we deem to be vulgar, pornographic, or otherwise explicit.\n\nIf you are unsure where your emails stand, please contact our support team at [https://support.sendgrid.com](https://support.sendgrid.com)\n\n ## \tNuts and Bolts\n\n ### \tTips for Click Tracked links\n\nOur click tracking application can sometimes trip up spam filters. If you have click tracking enabled, we'll replace any links within HTML `<a>` tags with unique links that redirect through our service. As such, if you use the original link as the clickable link text in your `<a>` tag, when the click tracking link is replaced it creates irregularity between where the link appears to go and where it actually goes. For example the original link:\n\n`<a href=\"http://www.sendgrid.com\">http://www.sendgrid.com</a>`\n\nGets replaced with a much longer link with click tracking:\n\n`<a href=\"http://beertemp.sendgrid.net/wf/click?upn=a2quqXSHnxzJyDEtVGmF4w3cWg6voxuzvZ4oDr9WeNk-3D\\_4MHh\">http://www.sendgrid.com</a>`\n\nThis is may look very similar to phishing emails, placing these messages in the spam folder rather than the inbox. To get around this, use something descriptive for the link text rather than the link itself in your messages:\n\n`<a href=\"http://www.sendgrid.com\">Click to visit SendGrid</a>`\n\n ### \tImages and Attachments\n\nAlso, consider how you include images and attachments in your messages. As it is impossible to know how a receiving server treats attachments, we recommend using the HTML `<img>` tag to include images in your messages and we also recommend linking to hosted files rather than including them as attachments. Images must be hosted on your own or on a public facing server to be included via the HTML `<img>` tag. Secure site logins or credentials can be used to track who is coming to your site to download files. This helps ensure that your message gets to the recipient regardless of any attachment restrictions on the receiving mail server.\n\n## \tTools of the Trade\n\nFinally, there are some great 3rd party services you can use to get an idea of how mail providers analyze your emails:\n\n* [http://isnotspam.com](http://isnotspam.com/)\n* [http://www.mail-tester.com/](http://www.mail-tester.com/)\n\nYou can send emails to a capture address at one of these services and they will reply with a breakdown of all the positive and negative factors of your emails. This helps you isolate and fix specific issues that may be sending your email to the Spam folder rather than the inbox. These services are _HIGHLY recommended_ for troubleshooting **spam folder delivery.**\n\n\n[Senderscore](https://senderscore.org/) is another great resource you can use to get a good idea of how the internet email community ranks the [IP address you send mail from]({{root_url}}/ui/account-and-settings/ip-access-management/).\n\nSendGrid has also released their [2019 Email Deliverability Guide](https://sendgrid.com/marketing/guide-2019-deliverability-guide/) highlighting these and more deliverability tips.\n\n"
  },
  {
    "path": "content/docs/ui/sending-email/deny-lists.md",
    "content": "---\nseo:\n  title: What do I do if I'm added to a deny list?\n  description: What do I do if I'm added to a deny list?\n  keywords: dedicated, deny list, list, delist, best, blocked, BL, RBL, DNSBL\ntitle: What do I do if I'm added to a deny list?\ngroup: delivery-optimization\nweight: 0\nlayout: page\nzendesk_id: 200256676\nnavigation:\n  show: true\n---\n\nEnding up on a [deny list]({{root_url}}/glossary/deny-list/) can be detrimental to your domain’s email deliverability. These days, there are hundreds, maybe thousands of deny lists out there. Some, like the Spamhaus SBL, can have a great impact on your email deliverability, while others may not. Many of the world's largest inbox providers use deny lists to help them make inboxing and filtering decisions. Others rely only on their own internal metrics. No action should be taken with listing entities requesting a fee for delisting or stating they do not accept requests to delist. If you find that your IP address has been added to a deny list by a legitimate entity, then submitting a delisting request would be recommended. Depending on your plan, you should approach being added to a deny list in one of 2 ways:\n\n## Shared IP Plans (Free, Legacy Lite, and Essentials)\n\n### Spamhaus deny list\n\nIf you are on one of our shared IP plans and you notice a block message from Spamhaus based on one of our IP addresses, please know that we are already working with Spamhaus directly to address the issue. There is no need to make an additional request through our support team.\n\n### Other deny lists\n\nIf you are on one of our shared IP plans and you notice a block message from any other deny list based on one of our IP addresses, please note that blocklists are a natural part of sending through shared IP Pools with multiple senders utilizing the same set of IPs. The large majority of these blocklists do not have an impact on your deliverability and often self-mitigate over time. We are actively monitoring these listings to ensure appropriate actions are taken for any that may impact our senders' deliverability.\n\n## Dedicated IP Plans (Pro and Premier)\n\nWe ask that our dedicated IP plan users make the initial delisting request in the event that they discover their SendGrid IP on a deny list. These IP addresses are only assigned to one account at a time, so we expect those users to take responsibility for all of the mail that is sent through their account. SendGrid will still be happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated.\n\n<call-out>\n\nIn the event that a sending domain (and not the IP address) is added to a deny list, the domain’s controller will be responsible for handling the delisting request.\n\n</call-out>\n\n## Checking Your IP Address\n\nHere are 2 aggregation websites that anyone can use to check on the status of their IP:\n\n- [http://multirbl.valli.org/](http://multirbl.valli.org/)\n- [http://www.mxtoolbox.com/blacklists.aspx](http://www.mxtoolbox.com/blacklists.aspx 'Link: http://www.mxtoolbox.com/blacklists.aspx')\n\n## Delisting Request Forms\n\nBelow are links to the delisting forms used by the more popular external deny listing services:\n\n- [AT&T](http://rbl.att.net/cgi-bin/rbl/block_admin.cgi 'Link: http://rbl.att.net/end_user_request2.html')\\*\n- [Barracuda](http://www.barracudacentral.org/rbl/removal-request)\n- [Cloudmark](https://csi.cloudmark.com/en/reset/)\n- [Comcast](http://postmaster.comcast.net/block-removal-request.html)\n- [Google](https://support.google.com/mail/contact/msgdelivery)\n- [McAfee](https://www.mcafee.com/enterprise/en-us/threat-center/threat-feedback.html)\n- [Microsoft/Outlook](https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us&ccsid=635996265829568030&forceorigin=esmc)\n- [Mimecast](http://www.mimecast.com/senderfeedback)\n- [Office365](https://sender.office.com/)\n- [ProofPoint](https://support.proofpoint.com/dnsbl-lookup.cgi)\n- [SORBS](http://www.sorbs.net/overview.shtml)\n- [SpamCop](http://www.spamcop.net/bl.shtml) **†**\n- [Spam Rats](http://www.spamrats.com/removal.php)\n- [Spamhaus](http://www.spamhaus.org/lookup/)\n- [SURBL](http://www.surbl.org/surbl-analysis)\n- [Trend Micro](https://ers.trendmicro.com/reputations)\n- [URIBL](https://admin.uribl.com/)\n\n<call-out>\n\nIf you request a delisting from a deny listing service, and don't do anything to change the behavior that caused the listing in the first place, it is likely to occur again. Depending on the list, it can be progressively harder to get delisted after the second or third listing.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nDon't delist from major deny lists without a plan in place to address the issue that caused the listing! [Learn more about how to avoid and mitigate risk of being added to a deny list here](https://sendgrid.com/blog/avoiding-email-blacklists/).\n\n</call-out>\n\n<call-out-link linktext=\"EXPERT SERVICES\" img=\"/img/expert-insights-promo3.png\" link=\"https://sendgrid.com/solutions/expert-services/\">\n\n### Need a helping hand?\n\nGetting into the inbox just so you can have the chance to engage with your customers often isn’t as easy as pressing “send.” Get customized advice from our team of email experts on how to optimize your email strategy.\n\n</call-out-link>\n"
  },
  {
    "path": "content/docs/ui/sending-email/dmarc.md",
    "content": "---\nseo:\n  title: Everything about DMARC\n  description: Everything about DMARC\n  keywords: security, secure, dmarc, spf, dkim, sender verification, wizard, rua, reject, quarantine\ntitle: Everything about DMARC\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nThis article provides an overview of Domain-based Message Authentication, Reporting and Conformance (DMARC). You will learn how DMARC works and how it applies to your Sender Identity or From address. You should already be familiar with [DNS records]({{root_url}}/glossary/dns/), [IP addresses]({{root_url}}/glossary/ip-address/), and the general [flow of web traffic](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/How_does_the_Internet_work) to get the most from this article. If you need a refresher on these topics, resources are linked throughout this page.\n\n## What is DMARC?\n\nDMARC is a powerful way to verify the authenticity of an email’s sender and prevent malicious senders from damaging your sender reputation.\n\nTo understand DMARC, let's first understand the problem DMARC attempts to solve: email spoofing.\n\nEmail spoofing is the practice of sending email with a forged From address. Note that an email actually has two From addresses: the Header From and Envelope From. DMARC is concerned only with the spoofing of the Envelope From (also known as the `return-path`) address. See our [spoofing glossary entry]({{root_url}}/glossary/spoofing/) for more information about spoofing and From addresses.\n\nDMARC relies on two authentication protocols to prevent spoofing: Sender Policy Framework (SPF) and DomainKeys Identified Mail (DKIM).\n\n<call-out>\n\nTwilio SendGrid now offers additional DMARC enforcement and monitoring options in partership with [Valimail](https://go.valimail.com/TwilioSendGrid.html). Click [here](https://sendgrid.com/blog/twilio-launches-partnership-with-valimail-dmarc-solutions-to-deploy-sophisticated-anti-phishing-technologies-at-scale/) for more information.\n\n</call-out>\n\n## Sender Policy Framework\n\nThe strategy employed by SPF is to add a [TXT record](https://en.wikipedia.org/wiki/TXT_record) to a domain’s [DNS](/glossary/dns/). The TXT record specifies which IP addresses are allowed to send email for the domain.\n\n### SPF mail flow\n\nImagine an email server receives a message and checks the Envelope From (`return-path`). The return path is `sender@example.com`. To perform an SPF check, the following steps take place.\n\n1. The receiving email server retrieves the SPF record from the DNS records for the `example.com` domain.\n2. The receiving server then checks the SPF record for all the IP addresses that are approved to send email on behalf of the domain.\n3. If the SPF check passes, the receiving server can be confident the message was sent from an approved sending server and will continue processing the message.\n4. If the SPF check fails, the message is likely illegitimate and will be processed using the receiving server’s failure process.\n\n![A diagram of the SPF traffic flow described in the steps above this image]({{root_url}}/img/spf_mail_flow.jpeg \"SPF mail flow diagram\")\n\nFor more on SPF, see [SPF Records Explained](/ui/account-and-settings/spf-records/).\n\n## DomainKeys Identified Mail\n\nDomainKeys Identified Mail (DKIM) uses [public-key cryptography](https://www.twilio.com/blog/what-is-public-key-cryptography) to sign a message. Like SPF, DKIM is implemented with a TXT record. Unlike SPF, the DKIM TXT record provides a public key that receiving mail servers can use to verify the authenticity of a message.\n\nRemember, the problem with spoofing is forgery of the From address. However, by signing the From address, among other headers, and providing a public key to verify the signature, receiving servers can corroborate the authenticity of the sender.\n\n### DKIM mail flow\n\nLet’s again imagine an email sent by `sender@example.com`. For DKIM to work properly, the following steps take place:\n\n1. Before sending the message, the sending server signs the email using a private key.\n2. When the message is delivered, the receiving server obtains the DKIM record from the DNS records for `example.com`.\n3. The receiving server then uses the public key in the DKIM record to verify the message’s signature.\n4. If the DKIM check passes, the receiving server can be confident the message was sent by the address in the `return-path` and wasn’t altered in transit.\n5. If the DKIM check fails, the message is likely illegitimate and will be processed using the receiving server’s failure process.\n\n![A diagram of the DKIM traffic flow described in the steps above this image]({{root_url}}/img/dkim_mail_flow.jpeg \"DKIM mail flow diagram\")\n\nFor more information about DKIM, see [DKIM Records Explained](/ui/account-and-settings/dkim-records/).\n\n## Domain-based Message Authentication, Reporting and Conformance\n\nIf SPF and DKIM already help validate an email's sender, what does DMARC add?\n\n### Why we need DMARC\n\nThink of DMARC _not_ as an independent authentication protocol but as a framework for handling SPF and DKIM failures and reporting those failures to domain owners.\n\n* DMARC allows domain owners to specify what should happen if either or both SPF and DKIM checks fail. Neither SPF nor DKIM provide this functionality on their own. This means that without DMARC a sender has no say in whether a failing message is bounced, sent to a spam folder, or handled in some other way.\n* A sender receives no feedback about SPF and DKIM failures without DMARC, so senders have little chance to combat or even understand the delivery trends of their domain, often called a \"[reputation monitoring](/glossary/reputation-monitoring/).\"\n* SPF and DKIM are independent of each other, but neither provide thorough spoofing protection on their own.\n\nDMARC addresses these issues by building on top of SPF and DKIM. SPF and DKIM handle the Domain-based Message Authentication part of DMARC.\n\nDMARC adds the Reporting and Conformance piece on its own. Like SPF and DKIM, DMARC is implemented using a TXT DNS record. This record allows receiving email servers to fetch failure processing instructions from domain owners.\n\n### DMARC Records\n\n<call-out>\n\n\"If you know how to view DNS records (e.g. using the 'dig' command), you can also check to see if [service providers] publish a DMARC TXT Resource Record. This doesn’t necessarily mean they support DMARC for the email they receive (though it’s a good indication), but it does indicate they use DMARC to protect outbound mail.\" — [DMARC.org](https://dmarc.org/wiki/FAQ)\n\n</call-out>\n\n#### Example DMARC record\n\n```text\nv=DMARC1\\;p=none\\;rua=mailto:dmarc@sendgrid.com\\;ruf=mailto:dmarc@sendgrid.com\\;rf=afrf\\;pct=100\n```\n\nA DMARC record contains several tags separated by semicolons, ;. Two of the tags are required, `v` (version) and `p` (policy).\n\n##### Version tag\n\nThe version, `v=DMARC1`, tells receiving servers that the DNS TXT record is a DMARC record.\n\n##### Policy tag\n\nThe policy, `p`, can be one of three values, `none`, `quarantine`, or `reject`. DMARC policies are the mechanism domain owners use to specify how a receiving email server should handle SPF and DKIM failures.\n\n1. `p=none`: No action should be taken. Even if a failure occurs, the message should be delivered. Though no action is taken on the message, the failure is included in reports sent to the domain owner.\n2. `p=quarantine`: Failures should be quarantined. This usually means the message is sent to the spam folder. Again, the failure will be included in reports to the domain owner.\n3. `p=reject`: Failures will be rejected. This usually means that the message will be deleted. The message may also be bounced to the Envelope From address.\n\n##### Report and report-related tags\n\nWhere do the failure reports go? The address assigned to  `rua=` tells receiving email servers where to deliver aggregate reports. The address assigned to `ruf=` tells receiving email servers where to send forensic reports.\n\n1. Aggregate reports are sent daily by default and don’t include detailed information about individual failures.\n2. Forensic reports send detailed information about individual failures at the time of failure. The email address assigned to `ruf` must also use the domain on which the DMARC record exists.\n\nThe request format, `rf=afrf`, tells receiving servers how to format reports for the domain owner. [Authentication Failure Reporting Format](https://tools.ietf.org/html/rfc6591), `afrf`, is the default and is an extension of [Abuse Reporting Format](https://en.wikipedia.org/wiki/Abuse_Reporting_Format).\n\nThe `fo` tag tells receiving servers what type of failures to report. There are four possible values for this tag.\n\n1. `fo=0`: Send a report if _both_ SPF and DKIM checks do not pass. This is the default value.\n2. `fo=1`: Send a report if _either_ SPF or DKIM checks do not pass.\n3. `fo=d`: Send a report only if the DKIM check does not pass.\n4. `fo=s`: Send a report only if the SPF check does not pass.\n\nThe `ri` tag sets the interval in seconds at which a domain owner wishes to receive aggregate reports. The default is, `86400`—that’s 24 hours in case you don’t have your calculator out.\n\n##### Alignment tags\n\nThere are tags for both SPF, `aspf`, and DKIM, `adkim`, alignment. Alignment is a way of qualifying how strictly DKIM and SPF values should be applied to pass a check. The options are either `s` for strict or `r` for relaxed.\n\n* Strict: Only `return-path` domains that match the domain set in the SPF or DKIM record exactly will pass.\n* Relaxed: Any `return-path` domain matching the root of the domain set in the SPF or DKIM record will pass. This allows [CNAME](/glossary/cname/) addresses to pass a check.\n\n##### Subdomain tag\n\nIf a domain owner needs to specify different policies for subdomains, they can use the `sp` tag. Like the policy tag, `p`, the possible values for the `sp` tag are `none`, `quarantine`, and `reject`. This means you can, for example, apply a reject policy to your root domain and a quarantine policy for all its subdomains.\n\n##### Percent tag\n\nThe percent tag, `pct`, specifies the percentage of email to which your DMARC policy will be applied. The possible values are `1` through `100`. For example, if your policy is set to `quarantine`, and your percent is set to `50`, half of all failing mail will be quarantined. This tag value can be adjusted as you learn more about DMARC failures on your domain.\n\n### DMARC mail flow\n\n![A diagram of the DMARC mail flow]({{root_url}}/img/dmarc_mail_flow.jpeg \"DMARC mail flow diagram\")\n\n## How DMARC Applies to a Sender Identity\n\nWhen sending email via a service provider such as SendGrid, you will be asked to [authenticate a domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) or [verify a Single Sender]({{root_url}}/ui/sending-email/sender-verification/#adding-a-sender). However, what happens if you verify a Sender Identity using a `gmail.com`, `yahoo.com`, `aol.com`, or a similar address? In other words, what happens if your Envelope From address is `sender@gmail.com`?\n\nAs you can guess, major mail providers such as Google, Microsoft, and others implement DMARC to protect their customers and prevent abuse. Let's use Yahoo and the email address `sender@yahoo.com`, as an example.\n\nYahoo has SPF, DKIM, and DMARC policies. Yahoo’s DNS records will approve domains such as yahoo.com and the IP addresses Yahoo controls. SendGrid domains and IP addresses will not be included in Yahoo's approved domains and IP addresses.\n\nWhen you send a message from `sender@yahoo.com` to `customer@gmail.com` using SendGrid, a Gmail server will receive the message. Gmail will then look up Yahoo’s SPF and DKIM records because `yahoo.com` is the domain in the return-path message header.\n\nThe Gmail receiving server will determine that the message was sent using a SendGrid IP address and was not signed by a Yahoo private key. Both SPF and DKIM will fail, causing Gmail to employ the DMARC failure policy specified by Yahoo.\n\nEssentially, Gmail, or any other receiving email server, has no way of knowing whether you are using SendGrid to send email for legitimate purposes or spoofing Yahoo's domain.\n\nThis is why SendGrid recommends [authenticating a domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) that you _do_ control. The SendGrid domain authentication process provides CNAME records that you place on your own domain to approve SendGrid's IP addresses. SendGrid will automatically manage your SPF and DKIM records, protecting your domain’s reputation.\n\n### Popular email providers that enforce DMARC\n\nMany of the popular email providers implement DMARC, including:\n\n* AOL\n* Gmail\n* Microsoft (Hotmail, MSN)\n* Outlook\n* Yahoo\n\nProviders with DMARC policies may reject email with messages like, **\"521 5.2.1 : (DMARC) This message failed DMARC Evaluation and is being refused due to provided DMARC Policy\"**.\n\nIf you see a bounce with one of these failure messages, the message has been discarded and tracked as a [Block](http://sendgrid.com/blocks). You will need to adjust your From address field settings, and then try resending from your side.\n\n## Additional Resources\n\n* [How to Implement DMARC]({{root_url}}/ui/sending-email/how-to-implement-dmarc/)\n* [Sender Identity](/for-developers/sending-email/sender-identity/)\n* [Domain Authentication](/ui/account-and-settings/how-to-set-up-domain-authentication/)\n* [Single Sender Verification](/ui/sending-email/sender-verification/)\n* [DMARC.org](https://dmarc.org/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/editor.md",
    "content": "---\nlayout: page\nweight: 81\ntitle: Design & Code Editor\ngroup: building-email\nnavigation:\n  show: true\nseo:\n  title: Design & Code Editor\n  override: true\n  description: Twilio SendGrid Marketing Campaigns' editing gives you complete control over your emails. Use a flexible drag-and-drop Design editor or a robust HTML code editor.\n---\n\n<iframe src=\"https://player.vimeo.com/video/388548001\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\nThe Twilio SendGrid email design experience is all about supporting your unique workflow, so you can get things done more efficiently. You have complete control over the way that you create and edit each new email, thanks to our two distinct editing experiences.\n\n## Choosing the right editor\n\nBoth editors provide access to similar features, and you can achieve the same results with either editor. Which editor you choose will mostly be determined by the way you like to work. A brief description of the editors and their shared functionalities is provided below. The user interfaces are similar but have some differences. How to work with the editors is detailed in the editor-specific sections below.\n\nThe [**Code Editor**](#the-code-editor) is perfect for users who are importing, creating, or editing custom HTML. It offers a robust environment to upload images, backed by a feature-packed editor – complete with split-screen preview, error flagging, scroll-syncing, syntax highlighting, and more. While other email editors may be notorious for adding excess code to your project, rest assured that our editor never modifies your carefully crafted HTML.\n\nThe [**Design Editor**](#the-design-editor), complete with HTML access to each content module, offers powerful _what you see is what you get_ (WYSIWYG) editing. It features a diverse library of content blocks, allowing you to build beautiful emails quickly and intuitively. Once placed into your email, each module offers access to edit the HTML and a robust panel of settings–perfect for customizing content precisely to your needs.\n\n<call-out>\n\nThe [Design Editor](#the-design-editor) features a number of convenient ways to edit the HTML content of your email, including the ability to [edit the HTML of each drag-and-drop module](#editing-module-html), [edit the HTML `head` of your message](#editing-the-html-head), and even import complete code using our [drag and drop markup](#importing-custom-html-with-drag--drop-markup).\n\n</call-out>\n\n<call-out type=\"warning\">\n\nTwilio SendGrid recommends only having one instance of a template or Marketing Campaigns email open in one instance of the editor at a time. Multiple instances in different browsers or computers will cause autosave to undo changes, and there is no recovery option.\n\n</call-out>\n\n## Shared editor features\n\n### Dynamic data with Handlebars\n\nBoth editors support dynamic data using [Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/) syntax. Dynamic data includes any information you use to personalize a design, such as a customer's name or order confirmation number. You can use test data in the editor's preview to ensure your dynamic values behave the way you expect before you ever send a message.\n\nIn addition to substituting values, you can use Handlebars in your designs to [format dates]({{root_url}}/for-developers/sending-email/using-handlebars/#formatdate), [iterate over lists]({{root_url}}/for-developers/sending-email/using-handlebars/#iterations), and [conditionally render values]({{root_url}}/for-developers/sending-email/using-handlebars/#conditional-statements). See our [Handlebars documentation]({{root_url}}/for-developers/sending-email/using-handlebars/) to see all that you can do with dynamic data and Twilio SendGrid templates.\n\n### Substitution Tags\n\nSubstitution Tags allow you to use any reserved or custom field data you've added to Marketing Campaigns to dynamically generate unique content for each recipient of your email. A common example is to add a recipient's first name to the body (or even the subject line) of your email.\n\nThe data that populates your Substitution Tags will come from the information you have stored about each contact. You can manage this information on the [Marketing Campaigns Contacts page](https://mc.sendgrid.com/contacts).\n\nIn addition to the following reserved fields that are available on all contacts by default, you can add your own [Custom Fields](https://mc.sendgrid.com/custom-fields) with Marketing Campaigns. When building Marketing Campaigns designs, your Custom Fields will be available in the **Tags** tab of the editors. For information about managing these fields, see our [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/) documentation.\n\n<call-out>\n\nFor contacts with no entry in a custom field, the Substitution Tag appears blank. To set a default value, use the following pattern:\n\n`{{insert first_name \"default=Valued Customer\"}}`\n\n</call-out>\n\n#### Reserved Substitution Tags\n\nThe following Tags are provided by Twilio SendGrid by default and are available on each of your contacts.\n\n<table class=\"table\" style=\"table-layout:fixed\">\n <tr>\n   <th>Substitution Tag</th>\n   <th>Description</th>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{first_name}}</code></td>\n   <td>The first name of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{last_name}}</code></td>\n   <td>The last name of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{email}}</code></td>\n   <td>The email address of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{alternate_emails}</code></td>\n   <td>Alternate emails of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{address_line_1}}</code></td>\n   <td>The first line of the address of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{address_line_2}}</code></td>\n   <td>The second line of the address of the recipient</td>\n </tr>\n  <tr>\n   <td><code class=\"language-text\">{{city}}</code></td>\n   <td>The city of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{state_province_region}}</code></td>\n   <td>The region of the recipient</td>\n </tr>\n  <tr>\n   <td><code class=\"language-text\">{{postal_code}}</code></td>\n   <td>The postal code of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{country}}</code></td>\n   <td>The country of the recipient</td>\n </tr>\n   <tr>\n   <td><code class=\"language-text\">{{phone_number}}</code></td>\n   <td>The phone number of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{whatsapp}}</code></td>\n   <td>The whatsapp of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{line}}</code></td>\n   <td>The line of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{facebook}}</code></td>\n   <td>The facebook of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{unique_name}}</code></td>\n   <td>The unique name of the recipient</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_Name}}</code>* </td>\n   <td>The name of the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_Email}}</code>* </td>\n   <td>The email of the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_Address}}</code>* </td>\n   <td>The address on record for the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_City}}</code>* </td>\n   <td>The city on record for the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_State}}</code>* </td>\n   <td>The state on record for the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_Zip}}</code>* </td>\n   <td>The zip code on record for the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\">{{Sender_Country}}</code>* </td>\n   <td>The country on record for the sender selected when sending your email</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\"><%asm_group_unsubscribe_<br>raw_url%></code>* </td>\n   <td>This tag is replaced with a link allowing your recipients to opt out of any emails you send using the chosen Unsubscribe Group</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\"><%asm_global_unsubscribe_<br>raw_url%></code>* </td>\n   <td>This tag is replaced with a link allowing your recipients to opt out of all email communication</td>\n </tr>\n <tr>\n   <td><code class=\"language-text\"><%asm_preferences_<br>raw_url%></code>* </td>\n   <td>This tag is replaced with a link allowing your recipients to opt out of any email unsubscribe groups you offer.</td>\n </tr>\n <tr>\n  <td><code class=\"language-text\">{{Weblink}}</td>\n  <td>This tag is replaced with a link that will open the email in a Twilio SendGrid-hosted webpage. This feature makes it possible to view an email when an email client fails to open or properly render the message.</td>\n </tr>\n</table>\n\n\\* For your convenience, these substitution tags are included by default in the Unsubscribe Module found on the Tags tab of the Design Editor.\n\n<call-out type=\"warning\">\n\nThe `<%asm_group_unsubscribe_raw_url%>`, `<%asm_preferences_raw_url%>`, and `<%asm_global_unsubscribe _raw_url%>` tags are reserved for use in Transactional Templates and should not be used in Marketing Campaigns.\n\n</call-out>\n\n_See how to work with Substitution Tags_\n\n- [Using the Code Editor](#using-substitution-tags-with-the-code-editor)\n- [Using the Design Editor](#using-substitution-tags-with-the-design-editor)\n\n### Test data\n\nThe Design and Code Editors both provide a test data preview feature. This means you can add the reserved and custom fields stored on a contact as well as any other variables you wish to pass into your template, such as order confirmation data. Test data provides a way to be sure that your final design will populate and render the substitutions properly. If you wanted to collaborate on a design for example, having test data stored directly in the design means each teammate can reference the data structure used to populate substitution tags without having to dig into a code base.\n\n_See how to work with Test Data_\n\n- [Using the Code Editor](#test-data-with-the-code-editor)\n- [Using the Design Editor](#test-data-with-the-design-editor)\n\n### Categories\n\n<call-out type=\"warning\">\n\nCategory information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\nAssigning categories to a single send allows you to track emails based on your own categorization system. By assigning your single send to a category, you can track statistics across multiple similar Single Sends and Automations. For example, you might have categories like “Weekly Digest” or “Product Announcements.”\n\n<call-out>\n\nCurrently, only 10 categories can be added to each single send.\n\n</call-out>\n\n_See how to add categories_\n\n- [Using the Code Editor](#adding-categories-with-the-code-editor)\n- [Using the Design Editor](#adding-categories-with-the-design-editor)\n\n### Email Testing\n\nEmail testing offers robust, pre-send testing of your emails, including in-app spam testing, inbox rendering previews, and link validation right within your Marketing Campaigns workflow. It allows you to preview how an email is likely to perform across a wide range of inbox providers, devices, and spam filters before sending. For more information, see our dedicated [email testing documentation]({{root_url}}/ui/sending-email/email-testing/).\n\n### Undo and redo functionality\n\nBoth editors provide undo and redo functionality using the undo and redo buttons at the top of the editor UI or with keyboard shortcuts.\n\n_Undo/redo keyboard shortcuts_\n\n- **Undo**: `Command` or `Control` + `Z`\n- **Redo**: `Command` or `Control` + `Shift` + `Z`\n\n![Undo and redo buttons]({{root_url}}/img/editors_undo_redo.png 'Undo/Redo')\n\n## The Code Editor\n\nTwilio SendGrid’s marketer-friendly code editor features a powerful split-screen editing experience – perfect for building Single Send or Automation emails with your own custom HTML. It offers a number of helpful features, often found in full-featured code editors.\n\n### Code Editor Features\n\n#### Live template preview\n\nSee how your email looks in real-time as you write and edit code. No more tabbing between windows, refreshing, or re-rendering. Marketing Campaigns’ split-screen editing experience displays your code on the left and a pixel-perfect preview on the right.\n\n#### Error flagging\n\nIf the code editor finds something that seems odd or inconsistent with best practices, instead of interrupting your workflow, it places a small red “x” in the margin of the line so you can come back and check when it’s convenient for you.\n\n#### Scroll syncing\n\nEasily pinpoint the HTML element you wish to edit. Click anywhere on the right-side preview of your email, and the code on the left automatically jumps to the corresponding line. Click somewhere on the left, and the preview on the right will jump along with you.\n\n#### Syntax highlighting\n\nAs you edit, parts of your code highlight in various colors according to the type of syntax. This added dimension provides clarity and efficiency as you search for, locate, and edit code elements.\n\n### Getting Started With The Code Editor\n\n_To use the code editor for Single Sends:_\n\n1. From the left-hand navigation, select **Marketing**, and then click **Single Sends**\n1. Click **Create a Single Send**.\n   <br>To create a Single Send email using an existing (drafted or sent) email, find the Single Send you'd like to use and click the action menu next to the email.\n1. Then, select **Edit** or **Duplicate**.\n1. Select **Code Editor**, and then click **Continue**.\n\n_To use the code editor for Automations:_\n\n1. From the left-hand navigation, select **Marketing**, and then click **Automations** .\n1. Click **Create an Automation**.\n1. Under Custom Automation click **Select**.\n\n<call-out>\n\nThe Welcome Series Automation can only be edited with the [Design Editor]({{root_url}}/ui/sending-email/editor/#the-design-editor)\n\n</call-out>\n\n1. Give the automation a name, entry criteria, exit criteria, and select an [Unsubscribe Group](https://sendgrid.com/docs/ui/sending-email/create-and-manage-unsubscribe-groups/).\n1. Select the send time and then click the edit button next to _Email 1_.\n1. Select **Code Editor**, and then click **Continue**.\n\n<call-out>\n\nYou can only edit unsent emails.\n\n</call-out>\n\nYou can select a blank template, a custom template that you have already created, or one of Twilio SendGrid's pre-built templates. For more information, see [Working With Templates]({{root_url}}/ui/sending-email/working-with-marketing-templates/).\n\nIf you have already built the HTML that you want to use in another application, copy and paste that code directly into the content area of the Code Editor. You can also write the HTML for your email or template directly in the Code Editor.\n\nThe split-screen view of the Code Editor allows you to see a real-time preview of your email. You can toggle between a preview of how your email or template appears on a recipient’s desktop and mobile phone by clicking either the desktop or mobile phone icons above the content area. You can also view a plain text version of your email or template by clicking the **T** icon. When in this preview mode, you can edit the plain text content of your email or template by clicking the **Edit Plain Text** button.\n\n<call-out type=\"warning\">\n\nOnce you create a new single send or automation email in the Code Editor, it cannot be edited using the Design Editor unless you add our [Drag and Drop Markup]({{root_url}}/ui/sending-email/editor/#drag--drop-markup).\n\n</call-out>\n\n### Uploading images with the Code Editor\n\n1. Select the **images** icon above the HTML code. A window opens where you can upload images to your library.\n2. Select the image you want to add from your image library.\n3. Select the **image details** tab and copy the URL in the **Image Source URL** tab by clicking **Copy URL**.\n4. Paste this URL in an image source tag in your email or template's HTML.\n\n```html\n<img src=\"your image URL here\" />\n```\n\n### Using Substitution Tags with the Code Editor\n\n_To add a substitution tag to your email:_\n\n1. Click the **Settings** tab on the left side of the editor.\n2. Click the **Tags** tab at the top of the **Settings** window.\n3. Locate the tag you want to add to your email and click it to automatically copy it to your clipboard.\n4. Paste the tag into the email.\n\nWhen copying and pasting a tag from the **Tags** tab, a default will be added automatically. Default values are supported by the `insert` keyword only. For this reason, tags with default values will be saved with a different syntax automatically. For more information about working with default values and Handlebars, see [Adding Dynamic Content with Handlebars in Marketing Campaigns]({{root_url}}/ui/sending-email/adding-dynamic-content-with-handlebars-in-marketing-campaigns/).\n\n### Test data with the Code Editor\n\n1. To access the test data preview from the editor, click **preview** and then **Show Test Data**.\n\n![The Code Editor's Test Data tab with a side-by-side view of the design and a window to place your test data]({{root_url}}/img/code_editor_test_data_tab.png 'Test Data')\n\nYou can place the data for any tags in your design into the Test Data window. Note that the data must be in JavaScript Object Notation (JSON) format which is shown below. JSON is a way of structuring data in a collection of key/value pairs. For example, if you use the `first_name` substitution tag, `first_name` is the key and the customer's name is the value. The following sample code can be copied into **Test Data** to show a number of reserved fields. You can add to the list following the same format to capture any of your custom fields that are used as tags in your design.\n\n```json\n{\n  \"first_name\": \"Tira\",\n  \"last_name\": \"Misu\",\n  \"email\": \"recipient@example.com\",\n  \"alternate_emails\": \"recipient+@example.com\",\n  \"address_line_1\": \"1234 N. Real Ave.\",\n  \"address_line_2\": \"Suite 200\",\n  \"city\": \"Denver\",\n  \"state_province_region\": \"CO\",\n  \"postal_code\": 80202,\n  \"country\": \"United States\"\n}\n```\n\n4. Once you have test data in place, the preview on the right pane will render your test data within your design as it would appear for recipients.\n\n![A side-by-side view of the test data and the rendered values in the template]({{root_url}}/img/code_editor_test_data_replaced.png 'Rendered test data')\n\n### Adding Categories with the Code Editor\n\n<call-out type=\"warning\">\n\nCategory information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n_To add categories to a Single Send_\n\n1. Click the **Settings** panel located on the left-hand side of the window to expand it.\n1. Navigate to the **Settings** tab, and click **Single Send Settings** to expand the menu.\n1. Locate the **Categories** field under **Single Send Settings**.\n1. Select the **Add Categories** field. Type in the tag that you'd like to add, and press enter.\n\n## The Design Editor\n\nSendGrid’s flexible design editor allows you to build your templates and emails using intuitive, drag & drop tools. The _what you see is what you get_ (WYSIWYG) editing experience features a library of modules for easily adding content to your email.\n\n### Getting Started with the Design Editor\n\n_To use the design editor for Single Sends:_\n\n1. From the left-hand navigation, select **Marketing**, and then click **Single Sends**\n1. Click **Create a Single Send**.\n   <br>To create a single send email using an existing (drafted or sent) email, find the Single Send you'd like to use and click the action menu next to the email.\n1. Then, select **Edit** or **Duplicate**.\n1. Select **Design Editor**, and then click **Continue**.\n\n_To use the design editor for Automations:_\n\n1. From the left-hand navigation, select **Marketing**, and then click **Automations** .\n1. Click **Create an Automation**.\n1. Determine whether you’d like to send a pre-made \"Welcome\" series or a custom Automation and then click **Select**.\n1. Give the automation a name, entry criteria, exit criteria, and select an unsubscribe group.\n1. Select the send time and then click the edit button next to **Email 1**.\n1. Select **Design Editor**, and then click **Continue**.\n   <br>The Design Editor opens.\n1. Select the template that you want to use for your email.\n   <br>You can select a **Blank Template**, a custom template that you have already created, or one of Twilio SendGrid’s pre-built templates. For more information, see [Working With Marketing Templates]({{root_url}}/ui/sending-email/working-with-marketing-templates/)\n1. Select **Design Editor** and then click **Continue**.\n   <br>The Design Editor opens.\n\n### Using drag and drop modules\n\nDrag and drop editing helps you swiftly construct your email, using pre-built content modules. You can edit individual modules in the left sidebar and reorder modules in your email body by clicking and dragging your mouse.\n\n_To add a drag & drop module:_\n\n1. Navigate to the **Build** tab and then click **Add Modules**.\n\n![]({{root_url}}/img/design_editor_drag_drop.png 'Drag and drop editor')\n\n2. Find the module tile you want to add to your email. Then, drag and drop it into your content area.\n3. Edit the module settings and add your custom content to build your email.\n\n### Drag and drop module descriptions and styles\n\n<table class=\"table\" style=\"table-layout:fixed\">\n  <tr>\n    <th>Module</th>\n    <th>Description</th>\n    <th>Unique Style Options</th>\n  </tr>\n  <tr>\n    <td>Button</td>\n    <td>A clickable button that links to a URL.</td>\n    <td>button color, border color, font color, width, height, padding, border radius, font size, button text, button URL, alignment,container background, container padding</td>\n  </tr>\n  <tr>\n    <td>Columns</td>\n    <td>The Columns module comprises multiple column layouts. When you drag a column module into your design, you will be presented with layout options. Each layout provides a number of columns distributed among common width ratios. Available layouts include evenly distributed 1, 2, 3, and 4 columns, 1:2 and 2:1 columns, 1:3 and 3:1 columns.<br><br>\n    Within a column there are multiple drop zones for other non-column modules such as images, buttons, and text.</td>\n    <td>container background, container padding, cell padding, columns</td>\n  </tr>\n  <tr>\n    <td>Code</td>\n    <td>This is an \"anything goes\" module where you can enter your own custom HTML.</td>\n    <td>Module styles are not available for code modules.</td>\n  </tr>\n  <tr>\n    <td>Text</td>\n    <td>Can contain text, tables, and images.</td>\n    <td>Background color, padding, line height</td>\n  </tr>\n  <tr>\n    <td>Image</td>\n    <td>Can contain a single image. Data attributes can be inserted directly in the &lt;img&gt; tag.</td>\n    <td>Image background, image margin, link url, alt text, alignment, responsive, height, width</td>\n  </tr>\n  <tr>\n    <td>Image and Text</td>\n    <td>This is a columns module with 2 columns - each can contain either an image or some text.</td>\n    <td>Image, image position, image background, image margin, text background, text margin</td>\n  </tr>\n  <tr>\n    <td>Spacer</td>\n    <td>Allows you to insert spacing between other modules.To add spacing using this module, simply adjust the padding in the &lt;td&gt; tag. For example, the spacer module adds a spacing of 50 pixels.</td>\n    <td>Background color, spacing (padding-bottom)</td>\n  </tr>\n  <tr>\n    <td>Divider</td>\n    <td>A visual divider, or horizontal rule, that can be placed between modules.</td>\n    <td>Background color, line color, height, padding</td>\n  </tr>\n  <tr>\n    <td>Social</td>\n    <td>Icons that allow for social media integration within your emails.The module offers 5 different social media icon options (Facebook, Twitter, Instagram, Google+, and Pinterest) all of which can be toggled on or off as well as fully customized to match individual branding and design standards. </td>\n    <td>URL, size, border radius, and icon ( Facebook, Twitter, Instagram, Google+, and Pinterest).</td>\n  </tr>\n  <tr>\n    <td>Unsubscribe</td>\n    <td>This module is pre-populated with your sender information and a hyperlink to the `{{{unsubscribe}}}` tag which are required in order to be compliant with anti-spam laws. If you are using transactional templates, you need to include sender information the JSON array. For more information, see [How to Send Email with Dynamic Transactional Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/.</td>\n    <td>Background color, padding, line height, font, font size, link color, alignment, Address Line, Unsubscribe Settings.</td>\n  </tr>\n</table>\n\n### Using global styles\n\nIn addition to editing the styles for individual modules within your email/template, you may also make changes to the global styling of your entire email/template. This includes attributes such as the background color, text color, or font family.\n\nThe email body is the entire area that your email or template fills inside your recipient’s browser or email inbox.\n\nUnder the **Global Styles** dropdown menu in the left hand sidebar, click **Email Body** or **Content Container** to view and edit the following styles:\n\n<table class=\"table\" style=\"table-layout:fixed\">\n<tr>\n    <th>Global Style</th>\n    <th>Style Options</th>\n</tr>\n  <tr>\n    <td><b>Email Body</b></td>\n    <td><p><b>Background Color</b> - This is the color for the background of your entire email/template.</p>\n        <p><b>Text Color</b> - This is the color of all text in your email/template. </p>\n        <p><b>Link Color</b> - This is the color of all links in your email/template.</p>\n        <p><b>Font Family</b> - This is the font family to be used for all text in your email/template.</p>\n        <p><b>Font Size</b> - This is the default font size to be used for all text in your email/template.</p>\n    </td>\n  </tr>\n  <tr>\n    <td><b>Content Container</b></td>\n    <td><p><b>Width</b> - This is the width of the container for your entire email/template. Your modules are all contained within these dimensions.</p>\n        <p><b>Background Color</b> - This is the color of the area containing your modules.</p>\n        <p><b>Padding</b> - This is the amount of space that you want between your modules and the boundaries of the content container.</p></td>\n  </tr>\n</table>\n\n### Editing module HTML\n\n_To edit Module HTML:_\n\n1. Select the module in the design editor and click the **&lt; &gt;** icon.\n   <br>A window opens where you can edit the module HTML.\n1. When you are finished editing the HTML, click **Update**.\n\n<call-out>\n\nIf you make any structural code changes, you need to convert the module to a code module.\n\n</call-out>\n\n### Code modules\n\nThe code module is a unique drag and drop module that allows you to insert any custom HTML in your email as a single module which can be relocated and edited.\n\n<call-out type=\"warning\">\n\nThe Design Editor does not modify or validate any HTML inserted via a code module. Please be careful when using custom HTML. Always preview your email before sending it.\n\n</call-out>\n\n### Adding images with the Design Editor\n\n_To upload an image:_\n\n1. Navigate to the **Build** tab and then click **Add Modules**.\n1. Select the Images module and drag and drop it into your content area.\n   <br>This opens a window where you can upload images to your image library.\n1. Drag and drop the image you want to use from your files or select **Choose images** to upload.\n\n_To insert an image:_\n\n1. Navigate to the **Build** tab and then click **Add Modules**.\n1. Drag and drop the **Images** module into your content area.\n   <br>A window opens where you can select images from the image library.\n1. Select the image you want to add to your email.\n   <br>The Image Details tab opens.\n1. Insert your image in the email by clicking **Save Image**.\n\n### Using Substitution Tags with the Design Editor\n\n_To add a substitution tag to your email:_\n\n1. Navigate to the **Tags** tab.\n1. Locate the tag you want to add to your email and click the **copy** icon.\n1. Paste the tag into the module.\n\nWhen copying and pasting a tag from the **Tags** tab, a default will be added automatically. Default values are supported by the `insert` keyword only. For this reason, tags with default values will be saved with a different syntax automatically. For more information about working with default values and Handlebars, see [Adding Dynamic Content with Handlebars in Marketing Campaigns]({{root_url}}/ui/sending-email/adding-dynamic-content-with-handlebars-in-marketing-campaigns/).\n\n#### Test data with the Design Editor\n\n1. To access the test data preview, open a design in the Design Editor and select the **Preview** tab.\n2. With the **Preview** tab active, you will see a **{} Show Test Data** button on the left. Click this button to open the test data window.\n\n![The Design Editor's Preview tab with the {} Show Test Data button highlighted]({{root_url}}/img/design_editor_show_test_data.png '{} Show Test Data')\n\n3. You will now have a side-by-side view of a code window and your design.\n\nYou can place the data for a contact into the code window. Note that the data must be in JavaScript Object Notation (JSON) format. JSON is a way of structuring data in a collection of key/value pairs. For example, if you use the `first_name` substitution tag, `first_name` is the key and the customer's name is the value. These keys can also be thought of as variables. Like a variable in algebra, these variables represent a value you don't yet know. The following sample customer is provided in JSON format for you to experiment with.\n\n```json\n{\n  \"first_name\": \"Tira\",\n  \"last_name\": \"Misu\",\n  \"email\": \"recipient@example.com\",\n  \"alternate_emails\": \"recipient+@example.com\",\n  \"address_line_1\": \"1234 N. Real Ave.\",\n  \"address_line_2\": \"Suite 200\",\n  \"city\": \"Denver\",\n  \"state_province_region\": \"CO\",\n  \"postal_code\": 80202,\n  \"country\": \"United States\",\n  \"phone_number\": \"+15555555555\",\n  \"Sender_Name\": \"Orders\",\n  \"Sender_Email\": \"orders@example2.com\",\n  \"Sender_Address\": \"1234 N. Exist St.\",\n  \"Sender_City\": \"Portland\",\n  \"Sender_State\": \"OR\",\n  \"Sender_Zip\": 97227,\n  \"Sender_Country\": \"United States\"\n}\n```\n\n4. Once you have test data in place, you should see any substitution tags for which data is present rendered properly.\n\n![A template with the first_name substitution and multiple address substitutions in text fields]({{root_url}}/img/design_editor_substitution_tags.png 'Substitution tags in a template')\n\n![A side-by-side view of the test data and the rendered values in the template]({{root_url}}/img/test_data_replaced.png 'Rendered test data')\n\n### Previewing your email\n\nTo preview your email or template, click the **Preview** button in the upper-left corner.\n\nYou can toggle between a mobile and desktop preview mode by clicking either the desktop or mobile phone icons above the content area.\n\nTo view a plain-text version of your email or template, click the **T** icon. When in this preview mode, you can edit the plain text content of your email or template by clicking the **Edit Plain Text** button.\n\nWhen previewing an email, you also see a preview of the From name, the Subject, and the preheader text that you have selected.\n\n### Editing the HTML Head\n\nThe HTML `<head>` element is where you can define any metadata you would like to include with your email or template. For example, you can use the `<head>` element to define any custom fonts or CSS styles you would like to use.\n\n_To edit the HTML head of your email or template:_\n\n1. Navigate to the **Build** tab in the left-hand toolbar and scroll to the **Advanced** menu.\n1. Expand the option titled **Edit HTML Head**.\n1. Click **Edit** to begin editing your HTML head.\n   <br>A window appears where you can insert your custom HTML.\n1. Once you've finished making your changes, click the **Update** button.\n\n#### Adding custom fonts using the HTML Head\n\nMost commonly, users add custom fonts by using the <link> tag to reference a web font hosted somewhere on the internet. For example, [Google Fonts](https://fonts.google.com).\n\n<call-out type=\"warning\">\n\nMake sure that you define a web-safe font to use as a fallback if one of your recipient’s clients does not support your custom font.\n\n</call-out>\n\nWhile some inbox providers do not support web fonts, the following popular clients do provide web font support\\*:\n\n- Apple Mail\n- Outlook.com app\n- Outlook 2000\n- Default Android Mail app (not the Android Gmail app)\n- iOS Mail\n\n\\* This list may change and we cannot guarantee 100% support from any of these clients.\n\n_To add a custom font using the HTML head:_\n\n1. Open the HTML Head by navigating to the **Build** tab in the design editor.\n1. Scroll down to the **Advanced** drop-down menu and select **Edit HTML Head**.\n1. Click **Edit** to begin making your changes.\n1. Insert a `<link>` tag containing an href attribute pointing to your web font.\n\n```html\n<link href=\"https://fonts.google.com/specimen/Oswald\" rel=\"stylesheet\" />\n```\n\nNext, add a `<style>` to specify that you want to use this new font family:\n\n```html\n<style>\n  body {\n    font-family: 'Oswald', sans-serif;\n  }\n</style>\n```\n\n### Importing custom HTML with drag and drop markup\n\nIf you are writing your own custom HTML that you plan on importing into the design editor, refer to the [drag & drop code examples](#drag--drop-code-examples) to ensure that any modules you create are compatible with our drag and drop functionality. If you do not specify a data type that matches one of our drag and drop modules, your code is imported as a text module.\n\n_To import custom HTML:_\n\n1. Navigate to the **Build** tab in the left-hand navigation.\n2. Scroll down and select the **Advanced** drop-down menu.\n3. Expand the option titled **Import Drag & Drop HTML**.\n4. Click **Import**.\n   <br>A window opens where you can paste in your own HTML.\n\n![]({{root_url}}/img/import_custom_html.png 'Import custom HTML')\n\n5. Paste or enter the HTML you want to use and then click **Import**.\n\n<call-out type=\"warning\">\n\nAny HTML that you import replaces all existing content in your email or template. If you want to import only a section of HTML, use a [code module](#code-modules).\n\n</call-out>\n\n### Drag and drop markup\n\nTwilio SendGrid parses your custom HTML, looking for any [drag & drop compatible modules](#drag--drop-code-examples).\n\n- First, we look for any HTML elements that contain the attribute `role=\"modules-container\"`.\n- Next, we look for all HTML elements with the attribute `role=\"module\"` that are descendants of the \"modules-container\" element.\n\nThe `role=\"modules-container\"` attribute is required so that we know where your drag and drop modules are located. All of the Twilio SendGrid pre-built templates include the `role=\"modules-container\"` by default. You are only required to include this attribute when creating an email or template from scratch that you want to be compatible with the design editor.\n\n<call-out type=\"warning\">\n\nAny HTML outside an element with the \"modules-container\" attribute is discarded. Only [supported styling options and attributes](#drag--drop-module-descriptions-and-styles) are included.\n\nIf you don't include the \"modules-container\" attribute in any of your custom HTML, then all of your HTML is imported as a single text module.\n\n</call-out>\n\nFollowing is an example of how you should structure and organize your custom HTML, where `[module content]` represents the content of your modules.\n\n### Drag and drop code examples\n\n<code-group langs=\"Image,Image & Text,text,code,columns,button,divider,spacer,social\">\n\n```image\n<table class=\"wrapper\" role=\"module\" data-type=\"image\">\n  <tr>\n    <td [styles go here] align=['left' or 'right']>\n      [MODULE CONTENT]\n    </td>\n  </tr>\n</table>\n```\n\n```image & text\n  <table role=\"module\" data-type=\"imagetext\">\n    <tr>\n      <td>\n        <table>\n          <tr role=\"module-content\">\n            <td class=\"templateColumnContainer\" >\n              <table>\n                <tr>\n                  <td class=\"leftColumnContent\" role=\"column-one\">\n                    <table role=\"module\" data-type=\"image\">\n                      <tr>\n                        <td role=\"module-content\">\n                          [MODULE CONTENT]\n                        </td>\n                      </tr>\n                    </table>\n                  </td>\n                </tr>\n              </table>\n            </td>\n            <td class=\"templateColumnContainer\" >\n              <table>\n                <tr>\n                  <td class=\"rightColumnContent\" role=\"column-two\">\n                    <table role=\"module\" data-type=\"text\">\n                      <tr>\n                        <td role=\"module-content\">\n                          [MODULE CONTENT]\n                        </td>\n                      </tr>\n                    </table>\n                  </td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n```\n\n```text\n  <table class=\"module\" role=\"module\" data-type=\"text\">\n    <tr>\n      <td [styles go here] bgcolor=[some color]>\n        [MODULE CONTENT]\n      </td>\n    </tr>\n  </table>\n```\n\n```code\n  <table class=\"module\" role=\"module\" data-type=\"code\">\n    <tr>\n      <td>\n        [MODULE CONTENT]\n      </td>\n    </tr>\n  </table>\n```\n\n```columns\n  <table role=\"module\" data-type=\"columns\">\n    <tr>\n      <td [styles go here] bgcolor=[some color]>\n        <table>\n          <tr>\n            <td class=\"templateColumnContainer column-drop-area\">\n            [MODULE CONTENT]\n            </td>\n            <td class=\"templateColumnContainer column-drop-area\">\n            [ANOTHER MODULE CONTENT]\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n```\n\n```button\n  <table class=\"module\" role=\"module\" data-type=\"button\">\n    <tr>\n      <td [styles go here] bgcolor=[some color] align=['left' or 'right']>\n        <table class=\"wrapper-mobile\">\n          <tr>\n            <td [styles go here too] bgcolor=[some color]>\n              [MODULE CONTENT]\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n```\n\n```divider\n  <table class=\"module\" role=\"module\" data-type=\"divider\">\n    <tr>\n      <td [styles go here] bgcolor=[some color]>\n        <table height=[some height]>\n          <tr>\n            <td bgcolor=[some color]></td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n```\n\n```spacer\n  <table class=\"module\" role=\"module\" data-type=\"spacer\">\n    <tr>\n      <td style=\"padding: 50px 0 0 0\" bgcolor=[some color]>\n      </td>\n    </tr>\n  </table>\n```\n\n```social\n  <table class=\"module\" role=\"module\" data-type=\"social\">\n    <tbody>\n      <tr>\n      <td [styles go here] data-align=['left', 'right', or 'center']>\n        <table>\n        <tbody>\n          <tr>\n          [MODULE CONTENT]\n          </tr>\n        </tbody>\n        </table>\n      </td>\n      </tr>\n    </tbody>\n  </table>\n```\n\n</code-group>\n\n### Exporting HTML from the design editor\n\n_To export template HTML from the design editor:_\n\n1. Navigate to the **Build** tab in the left-hand navigation.\n1. Scroll down and select the **Advanced** drop-down menu.\n1. Expand the option titled **Import/Export**.\n   <br>This starts the raw HTML download of the template, excluding images.\n\nSendGrid hosts the images included in the pre-built templates and any images you have uploaded to the image library, so when you export a template’s HTML from the design editor, the embedded URLs in each `<img>` tag remains valid.\n\n_To open exported HTML in the code editor using Single Sends:_\n\n1. From the left-hand navigation, select **Marketing** and then click **Single Sends**.\n1. Click **New Campaign** and then select **Blank Template**.\n1. Select **Code Editor**.\n1. Paste the raw SendGrid template HTML into the code editor.\n\n_To open exported HTML in the code editor using Automations:_\n\n1. From the left-hand navigation, select **Marketing** and then click **Automations**.\n1. Click **Create an Automation** and then navigate to _Custom Automation_ and click **Select**.\n1. Navigate to the first email in the Automation series and click **Edit Email Content**.\n1. Locate the blank template and click **Select**.\n1. Select **Code Editor**.\n1. Paste the raw SendGrid template HTML into the code editor.\n\n### Adding Categories with the Design Editor\n\n<call-out type=\"warning\">\n\nCategory information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n_To add a category:_\n\n1. Navigate to the **Settings** tab and click **Single Send Settings** to expand the menu.\n1. Find the **Categories** field.\n1. Enter the name of a new category or select a previously used category from the drop-down menu.\n\n## Additional resources\n\n- [Sending an Email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n- [A/B Testing]({{root_url}}/ui/sending-email/a-b-testing/)\n- [Campaign Statistics]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats/)\n- [Marketing Templates]({{root_url}}/ui/sending-email/working-with-marketing-templates/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/email-flow.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Email Flow\ngroup: delivery-optimization\nnavigation:\n  show: true\nseo:\n  title: Email Message Flow Explained\n  description: A basic diagram and description of how each email message flows in general and through SendGrid\n  keywords: Email flowchart, email delivery flow, email delivery diagram, basic email flow\n---\n\nSendGrid has helped thousands of customers send their email messages since 2009. We help our customers build their email content, send their messages, and view the success of each campaign sent.\n\nWe also realize that the actual journey of an email message sent to an inbox  is complicated. Sometimes this process may not be fully understood by all senders. This post shows the basics of the email path, along with where SendGrid is helping to make that journey less complicated.\n\nIn the email flowchart below, you can see the main components that all email messages pass through. Granted, there are many other finer details involved within each step, but for the sake of this post, we’re keeping it to the basics.\n\n![]({{root_url}}/img/MailFlow.png \"Email Flow\")\n\nFirst, a sender puts together the content that their recipients will love. Then it’s time for the “SMTP conversation” to take place. SMTP stands for Simple Mail Transfer Protocol, and this conversation is what makes email messages get from the sender to the recipient. It’s easiest to think of an SMTP conversation as a “handshake”.\n\nImagine that a sender is a host at a party and all of the other guests are the recipients of the message. The host will shake every guest’s hand and during that “handshake” they will have this SMTP conversation. In the end, the guest (i.e. recipient and its recipient server) will determine if they will accept the message or not. In this scenario, you can think of SendGrid as a person at the party grabbing both the host’s and guest’s hands and making the handshake and discussion actually happen.\n\n## \tThe “Handshake” Details and Results\n\nThe sender connects to the SMTP server through SendGrid and tells the server the final destination it would like its message to go to. Let’s say it is “person@example.com”. The SMTP server recognizes the domain portion (the part after the @ sign) of “example.com” and contacts the receiving server responsible for accepting messages for that domain. During this connection, the two servers exchange multiple pieces of information. The receiving server typically then says one of the following:\n\n* “Yes, I know who ‘person’ is and all is in order to deliver it to their inbox.”\n* “Yes, I know who ‘person’ is and all is in order to deliver the message, but not to the inbox.”\n* “Yes, I know who ‘person’ is and there are still some items I have to identify, so I am not going to deliver the message at this time but I am not sending it back to the sender.” (aka a deferred message)\n* “No, I do not know who ‘person’ is and will be sending the message back to the sender.” (aka a bounced message)\n\n## \tDetermining Factors of Delivery\n\nAs mentioned before, there are many pieces of information exchanged between the sending and receiving mail servers. As you can see from the email flow diagram, the other 2 places SendGrid assists in the message path (along with the Outbound Mail Server) are the DNS (Domain Name System) and Authentication portions. The receiving server wants to trust the mail that is being exchanged in order to accept it. DNS and Authentication assists with this decision.\n\n### \tDNS\nDNS stands for “Domain Name System” and it is thought of as the “phone book for the Internet”. It houses many pieces of information for the sending domain of a message. The receiving server checks this “phone book” to see if it can determine who the sender is and if they are trusted.\n\n### \tAuthentication\nThe receiving server will check:\n* if there is an SPF (Sender Policy Framework) record in place (to see if the mail is coming from an IP authorized by that domain's administrators);\n* if there is a DKIM (DomainKeys Identified Mail) record in place (to see if the message was tampered with in transit by someone other than the sender);\n* if there is a DMARC (Domain-based Mail Authentication Reporting and Conformance) record in place (this tells the receiving server where to place the mail based on the results of the SPF and DKIM authentication).\n\nSendGrid’s sender authentication feature assists with setting up both SPF and DKIM properly. This assists the host (sender) in being more recognizable and the guest (recipient) and their mailbox provider to more easily trust the content attempting to be shared during the conversation.\n\n### \tReputation\nWhen reviewing the sending IP and domain, the receiving server will factor in both of the following items:\n* The reaction of its other recipients to mail sent by that same IP and domain (i.e. whether or not marked as spam).\n* Where the receiving server previously decided to place any mail from the same IP and domain.\n\n<call-out>\n\nThe reputation of the domains included in the links within the body content will also factor into delivery.\n\n</call-out>\n\n ### \tUser Level Filtering\n\nAlong with these items listed above, some recipients may also have their own individual rules within their inbox of where certain mail will go. This placement is harder to change, aside from making sure that your content is desired by the recipient and they won’t be creating any custom filters to have your messages delivered anywhere but the inbox.\n\n## \tReacting to Opinions of the “Guests”\n\n### \tFeedback for the Guests to Give the Host\n\nWithin an email, there is a function known as a Feedback Loop. Feedback Loops are created by the mailbox providers and a sender can get set up to receive notifications through them to inform them when a recipient complains about the sender’s message (aka marking a message as junk or spam). This should help the host (sender) to be aware of when certain guests didn’t want the content included in their interaction. The host (sender) should not try to have another conversation with (aka send messages to) these guests in the future.\n\n<call-out>\n\nGet additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/sending-email/email-testing.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Email Testing\ngroup: marketing-campaigns\nnavigation:\n  show: true\nseo:\n  title: Email testing\n  keywords: email testing, send test email, email rendering test\n  override: true\n  Description: How to use SendGrid's new email testing feature to preview how your email renders, performs against spam filters, and validate the links within your email.\n  \n---\n\n<iframe src=\"https://player.vimeo.com/video/389535005\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\nEmail testing offers robust, pre-send testing of your emails, including in-app spam testing, inbox rendering previews, and link validation without leaving your workflow. It allows you to preview how an email is likely to perform across a wide range of inbox providers, devices, and spam filters, before sending.\n\n- **Inbox Rendering Test:** Displays how an email message is rendered and appears across a select group of inbox providers and devices.\n- **Spam Test:** Shows how an email performs against the world’s most powerful consumer (B2C) and enterprise (B2B) spam filters.\n- **Link Validation Test:** Tests all links within a message to ensure they are valid. The test checks for redirects, domain reputation, and critical metadata, like title text. Your inbox rendering tests will automatically include this link validation test. Link validation tests **do not** deduct from your Email Testing credits.\n\n<iframe src=\"https://player.vimeo.com/video/359828434\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n## Email Testing credits and pricing\n\nThe number of Email Testing credits available to you depends on your Marketing Campaigns or Email API plan. For more information on email plans, see our [pricing page](https://sendgrid.com/pricing/). Email Testing credits can be used for both Inbox Rendering Tests and Spam Tests, and all Email Testing credits (whether part of your plan or purchased as part of an add-on package) expire at the end of each month.\n\n## Purchasing additional credits\n\nIf you find yourself in need of more credits than your email plan offers, we offer additional Email Testing credit packages as add-ons to your monthly plan.\n\n<callout>\n\nPackages for additional Email Testing credits are billed on a monthly, recurring basis and will continue to renew each month unless removed from your account.\n\n</callout>\n\n  Available Email Testing credit add-on packages are:\n  \n  <ul>\n  <li><strong>30 Email Testing Credits</strong> per month, available for $18.00 USD</li>\n  <li><strong>60 Email Testing Credits</strong> per month, available for $30.00 USD</li>\n  <li><strong>100 Email Testing Credits</strong> per month, available for $40.00 USD</li>\n  </ul>\n\n## Running an Email Test\n\nEmail testing is available for both Marketing Campaigns and emails within API plans ultilizing Dynamic Templates. \n\n*To test an email:*\n\n1. From inside either the Design or Code editor, navigate to the Settings tab.\n1. Scroll down and click on the **Test Your Email** dropdown to expand testing options.\n1. Below the option to send a test email, you will see an **Email Testing** option. To create a test, click **Create Test**.\n\n<call-out>\n\nBefore you can create a test, you need to specify a Sender and include a Subject for your email.\n\n</call-out>\n\n![]({{root_url}}/img/auto-email-testing-launch.png \"Launch Automated Email Testing\")\n\n4. When Email Testing opens a new test, choose which kind of tests you'd like to run by selecting the checkboxes next to **Spam Test**, **Inbox Rendering Test**, or by selecting both.\n\n<call-out>\n\nEvery inbox rendering test that you run automatically includes a link validation test, checking that all URLs within your message are valid. Link validation tests **do not** deduct from your Email Testing credits.\n\n</call-out>\n\n5. If you choose to run an Inbox Rendering test, select the clients and browsers you'd like to include as part of your test by clicking the associated checkbox for each. \n6. Click **Run Test**. \n7. Your test will begin. Please note: It may take a moment for the test to begin returning your results. Test results will appear on the **View Test Results** tab. Click any thumbnail of a rendering to open the image and view in greater detail.  \n8. From the View Test Results tab, you can select the **Inbox**, **Spam**, or **Links** tabs to view all of the details for your test.\n\n## Additional Resources\n\n- [A/B Testing]({{root_url}}/ui/sending-email/a-b-testing/)\n- [Design Editor]({{root_url}}/ui/sending-email/editor/#-The-Design-Editor)\n- [Code Editor]({{root_url}}/ui/sending-email/editor/#the-code-editor)\n- [Dynamic Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/email-to-sms.md",
    "content": "---\nseo:\n  title: Email to SMS\n  description: Email to SMS\n  keywords: sms, short, service, carrier, media, gateway, 5724, provider, vtext, message, text, att, tmobile, verizon\ntitle: Email to SMS\ngroup: delivery-optimization\nweight: 0\nlayout: page\nzendesk_id: 202603863\nnavigation:\n  show: true\n---\n\nSendGrid occasionally gets the question \"Why isn't my email to SMS working?\"\n\nBasically, SMTP-to-SMS gateways have narrow bandwidth, due to the need for mobile carriers to predict network traffic, as well as a way to prevent spam to their users. Furthermore, mobile carriers are not incentivized to successfully deliver SMTP-to-SMS messages, since they often provide this as a free service. Senders will see deferrals and blocks if they attempt to send high volumes without reaching a payment agreement with mobile carriers ahead of time.\n\nHere’s a relevant comment about SMS from [RFC 5724](http://www.ietf.org/rfc/rfc5724.txt):  \n > \"SMS messages very often are delivered almost instantaneously (if the receiving SMS client is online), but there is no guarantee for when SMS messages will be delivered. In particular, SMS messages between different network operators sometimes take a long time to be delivered (hours or even days) or are not delivered at all, so applications SHOULD NOT make any assumptions about the reliability and performance of SMS message transmission.\"\n\nEssentially, email to SMS may work for occasional messages at low volume, and even then it can be a gamble.\n"
  },
  {
    "path": "content/docs/ui/sending-email/formatting-html.md",
    "content": "---\nseo:\n  title: HTML Formatting Issues\n  description: HTML Formatting Issues\n  keywords: message, format, html\ntitle: HTML Formatting Issues\ngroup: building-email\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nTo be successful sending email through SendGrid and to ensure that your content gets preserved as needed, please follow these guidelines. These guidelines are also useful if you are encountering issues with the HTML formatting or styling of your messages.\n\n**Duplicate Versions**\n\nEnsure your email contains both Plaintext and HTML versions so recipients can view the information within the mail client of their choice. If you only send HTML emails and a recipient's server or mail client blocks HTML content, they will not see anything in your emails.\n\n**Character Limits**\n\nMake sure that each line of content does not exceed 78 characters in length, nor that you exceed 998 continuous characters.\n\nFor more information on how email should be formatted, see these [Formatting Guidelines](http://tools.ietf.org/html/rfc5322). (Refer to 2.1.1. Line Length Limits.)\n\n**Troubleshooting**\n\nSome mailers, such as Apple Mail, place Multipurpose Internet Mail Extensions (MIME) into emails automatically which can cause our system to not parse the boundaries correctly. If you do notice a problem with the content from your email not rendering correctly, please do the following:\n\n1. Some mail clients, such as Outlook and Thunderbird, appear to insert double spacing line breaks at every line. The reason is that the 'content-transfer-encoding' in MIME is set to 'quoted-printable' which adds Carriage Return Line Feed (CRLF) line breaks to the source content of the email which are characters interpreted by these mail clients. To alleviate this problem, please do the following:\n\n   a) If you can customize the MIME settings for your email, set the 'Content-Transfer-Encoding' to '7bit' instead of 'Quoted-Printable.'\n\n   b) Ensure that your content follows the [line length limits](http://tools.ietf.org/html/rfc5322).\n\n2. Hard line breaks appear as CRLF characters in the source of an email with the character combination of \" **=0D**\" in the source of an email. This only happens with 'quoted-printable' (Content-Transfer-Encoding set in MIME) emails. Email clients such as Outlook and Thunderbird render these characters which results in additional breaks in the content of your emails.\n\n3. The best possible MIME layout in your email when sending through SendGrid is as follows. It is best to reference files using separate links to download since it lowers the percentage of spam threshold for most domains you are sending to.\n"
  },
  {
    "path": "content/docs/ui/sending-email/getting-started-with-automation.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: marketing-campaigns\ntitle: Getting Started with Automation\norder: 2\nseo:\n  title: Getting Started with Automation\n  description: Use Automation to create an automated email series or drip campaign targeted towards a specific audience.\n  keywords: automation, triggered email, automated email, welcome series\nnavigation:\n  show: true\n---\n\n<iframe src=\"https://player.vimeo.com/video/382215903\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n<call-out>\n\nAutomation is available as part of the Advanced Marketing Campaigns package. To access this feature, please upgrade to Advanced Marketing Campaigns from [Your Products](https://app.sendgrid.com/account/billing/choose_plan_marketing_campaigns).\n\n</call-out>\n\nAutomation allows you to send a recurring email or drip series to contacts automatically at a cadence you define. Once you create an Automation, you can trigger them to send automatically by adding new recipients to a chosen list or segment, saving you time.\n\nWith Automation, you could build email campaigns to:\n\n- Welcome new contacts when they join your list with a warm message and introductory tips.\n- Engage contacts who’ve downloaded an asset from you with follow-up content.\n- Promote an upcoming event to a list of invitees with a series of reasons to attend.\n\n<iframe src=\"https://player.vimeo.com/video/396803246\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n## Getting Started with Automation\n\nIf you haven’t done so already, you’ll need to complete the following before building your first automation:\n\n- Add a [notification]({{root_url}}/ui/account-and-settings/notifications/) email\n- Create [Unsubscribe Groups]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/)\n- Add a [sender]({{root_url}}/ui/sending-email/senders/) (optional)\n\n## Create an Automation\n\nOnce you've completed the prerequisites, you’re ready to start building your first automation. You can start with a pre-built Welcome Series and make it your own, or start from scratch by selecting **Custom Automation**.\n\n<call-out>\n​\nClick tracking was released on 7/16/20. To enable click tracking for automations set live prior to 7/16, pause the automation and set it to live once again. Click tracking will populate data from 7/16/2020 onward regardless of when it is set live.\n\n</call-out>\n\n### Create a Custom Automation\n\n_To create a Custom Automation:_\n\n1. Navigate to **Automations** and then click **Create an Automation**.\n1. Under Custom, click **Select**.\n1. Give the series a name. This is for your reference and will not be visible to your contacts.\n1. Select the entry criteria. You can choose from \"The first time a [contact is added to a list]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/#add-contacts) or \"The first time a contact is added to a [segment]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\".\n\n<call-out>\n\nContacts will only receive your automation if they are added to the list or segment you select for entry criteria _after_ you set the automation live.\n\n</call-out>\n\n5. Select the exit criteria for this series. You can choose from \"Contacts have received all emails in the automation\" or \"Contacts no longer meet the entry criteria\".\n\n<call-out>\n\nIf you select “no longer meet entry criteria”, before each email in your series sends, Marketing Campaigns will check to make sure each recipient is still on the entry criteria list or segment. If they aren’t, they won’t get the email. For more information on deleting contacts or removing them from lists, see [Create and Manage Contacts]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#edit-or-remove-contacts-from-a-list).\n\n</call-out>\n\n6. Select an [Unsubscribe Group]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/#create-an-unsubscribe-group). This Unsubscribe Group will apply to all emails in your Automation.\n7. Add a [category]({{root_url}}/glossary/categories/) to the automation (optional). Categories are useful for [comparing performance]({{root_url}}/ui/analytics-and-reporting/category-comparison/) across different types of email you send.\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n<call-out>\n\nIf you have dedicated IPs, you can set up [IP Pools]({{root_url}}/ui/account-and-settings/ip-pools/) that allow you separate your traffic and potentially enhance your deliverability by protecting your sender reputation. To utilize IP pools for Automations, select the IP Pool you wish to use for the entire automation series from the IP Pool drop-down.\n\n</call-out>\n\n8. Select the send time for the first email. You can choose to send the first email instantly, or you can set a delay of days or hours from the time meet the entry criteria.\n9. Build your email(s) by clicking **Add Email Content**.\n10. Choose a template, then use your preferred [editor]({{root_url}}/ui/sending-email/editor/) to craft your content.\n11. If you did not do so within the editor, you can add a subject line and select a sender from the Edit Automation page.\n12. To add more emails to this automated series, click **Add an Email**.\n13. Choose how long to wait before sending the next email. This time will be relative to the preceding email.\n\n14. Once you have created all of your emails for the automation, click **Set Live**.\n\n### Use the Pre-Built Welcome Series\n\nThe pre-built Welcome Series automation provides a jumping off point to inspire you to create your own tailored welcome series.\n\n_To create a Welcome Series:_\n\n1. Navigate to **Automations** and then click **Create an Automation**.\n2. Under Welcome, click **Select**.\n3. Update the automation name (this is for your reference and will not be visible to your contacts).\n4. Review the entry criteria to decide if you’d like to update it. The default entry criteria is “The first time a contact is added to All Contacts”.\n5. Review the exit criteria to decide if you’d like to update it.\n6. Select an [Unsubscribe Group]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/#create-an-unsubscribe-group). This Unsubscribe Group will apply to all emails in your Automation.\n7. Add a [category]({{root_url}}/glossary/categories/) to the automation (optional). Categories are useful for [comparing performance]({{root_url}}/ui/analytics-and-reporting/category-comparison/) across different types of email you send.\n\n<call-out type=\"warning\">\n\nCategories will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.\n\n</call-out>\n\n8. The pre-built Welcome Series has three placeholder emails by default. You’ll need to edit the subject line and content of each email. You may decide to remove or add emails to the pre-built.\n9. If you did not do so within the editor, you can add a subject line and select a sender from the Edit Automation page.\n10. To add more emails to this automated series, click **Add an Email**.\n11. Choose how long to wait between each email in the series. This time will be relative to the preceding email.\n12. Once you have created all of your emails for the automation, click **Set Live**.\n\n<call-out type=\"warning\">\n\nIf you keep the entry criteria as \"All Contacts\" it's important to remember that any recipient you add to your Automation contacts after you set the welcome series live will be entered into the automation. Use \"All Contacts\" with caution to avoid sending a welcome series to contacts that aren't actually new to you.\n\n</call-out>\n\n## Manage Automations\n\n### Duplicate an Automation\n\n_To duplicate an automation:_\n\n1. Navigate to Automations.\n1. Find the automation you want to duplicate.\n1. Select the Action Menu to the right of the automation.\n1. Click **Duplicate**.\n1. Once you create the duplicate, the automation will open to the edit page. From here, you can change any or all of the settings within the automation.\n\n### Edit an Automation\n\nYou can edit the content, subject line, and sender for any emails in your automation.\n\n_To edit an automation:_\n\n1. Navigate to **Automations** and select the series you want to edit.\n1. Click **Edit** on each email you’d like to modify.\n\n<call-out>\n\nYou can also create a template from an existing email within your Automation series by selecting the action menu next to the email you'd like to reuse and selecting **Create Template**.\n\n</call-out>\n\n3. Make your changes in the editor, then click **Save**.\n4. Click the arrow in the upper left-hand corner.\n5. Below the email you’ve edited, you’ll see an alert that changes have not yet been applied to the live automation. When you’re ready to apply them, click **Save and Apply**.\n\n### Disable an Automation\n\n_To disable an automation:_\n\nWhen you disable an automation, all emails in your automation will stop sending unless you set it live again. No new contacts will be entered into your automation while it's disabled. If you set the automation live again, contacts who entered the automation before it was disabled will continue receiving emails again according to where they left off.\n\n1. Navigate to **Automations** and select the series you want to stop.\n1. Select the Action Menu to the right of the Automation.\n1. Click **Disable Automation** in the upper right corner.\n\n_To set a disabled automation live again:_\n\n1. Navigate to **Automations** and select the series you want to re-enable.\n1. Select the Action Menu to the right of the Automation.\n1. Click **Set Live** in the upper right corner.\n\n<call-out>\n\nWhen you re-enable the automation, contacts who previously entered the series will continue receiving emails where they left off in the series. Contacts who met your entry criteria during the disabled period will not be added to the automation. For this reason, do not add users to lists that are used as the entry criteria for automations in a disabled state.\n\n</call-out>\n\n## Automation Use Cases and Examples\n\n### Segment-triggered nurture series\n\nA valuable use case for Automation is to nurture your free customers to become paid using a drip series. The series will send automatically to free users until they reach the end of the email sequence or they upgrade to paid, whichever comes first. Here's how:\n\n1. Create a segment of all contacts whose custom field “Plan Type” value is “Free”\n1. Set entry criteria to the first time a contact \"is added to a segment\" and select the “Free customers\" segment you just created.\n1. Set the exit criteria as “Contacts no longer meet entry criteria”\n1. Craft a series of emails to nurture contacts to become paid.\n\nFrom there, any time you add a new contact whose plan type is \"Free\", they are automatically added to the relevant segment and entered into the automation. If they upgrade their plan during the drip series, Automation automatically removes them from the series.\n"
  },
  {
    "path": "content/docs/ui/sending-email/global-unsubscribes.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Global Unsubscribes\ngroup: tracking\nseo:\n  title: Global Unsubscribes\n  description: Recipients can unsubscribe from everything you send, rather than just a single group.\n  keywords: Global suppressions, global unsubscribes, global email unsubscribe, global email suppression\nnavigation:\n  show: true\n---\n\nGlobal unsubscribes happen when a recipient indicates that they would like to opt out from any email that you send by clicking on the [Unsubscribe From All Emails link](#global-unsubscribe-substitution-tags) within your emails. The list provided here can be filtered by email address or date.\n\n## Searching Global Unsubscribes by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the unsubscribe dates you would like to search between. Your recipient list will refresh, showing the recipients who unsubscribed between these dates.\n\n## Removing Recipients From The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list.\n\n## Download Global Unsubscribes as CSV\n\n_To download your Global Unsubscribe list as a CSV:_\n\n1. Navigate to the Global Unsubscribes page.\n1. Click the action menu at the top of the page.\n1. Select **Download as CSV**. The file will download in your browser right away.\n\n### Global Unsubscribe Substitution Tag\n\nWhen you add the `<%asm_global_unsubscribe_url%>` tag to your email, we will replace that tag with the text \"Unsubscribe From All Emails\", wherever the tag is found in your email. This will allow your recipient to be globally unsubscribed from all of your emails.\n\nAlternatively, you can use the `<%asm_global_unsubscribe_raw_url%>` tag, which will be replaced with only the global unsubscribe URL without the hyperlinked text \"Unsubscribe From All Emails\".\n\n<call-out>\n\nWhen using our ASM Global or Group Unsubscribe tags, you must pass an unsubscribe group in your API or X-SMTPAPI request for the unsubscribe link to populate.\n\n</call-out>\n\n## Using the API\n\nYou can manage your Global Unsubscribes via the [Global Suppressions API](https://sendgrid.api-docs.io/v3.0/suppressions-global-suppressions).\n\n## Additional Resources\n\n- [Global unsubscribes vs. Group Unsubscribes]({{root_url}}/ui/sending-email/subscription-tracking/)\n- [Group Unsubscribes]({{root_url}}/ui/sending-email/group-unsubscribes/)\n- [Invalid Emails]({{root_url}}/ui/sending-email/index-suppressions/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/google-feedback-loop.md",
    "content": "---\nseo:\n  title: Google Feedback Loop (Spam Complaints)\n  description: Google Feedback Loop (Spam Complaints)\n  keywords: \ntitle: Google Feedback Loop (Spam Complaints)\ngroup: delivery-optimization\nweight: 0\nlayout: page\nzendesk_id: 202604713\nnavigation:\n  show: true\n---\n\nSendGrid does automatically suppress any spam complaint address reported through traditional feedback loops. However, some webmail providers, notably Gmail, do not provide a traditional feedback loop out of privacy concerns. Rather, they provide an anonymous, aggregate report directly to us about concerning senders.\n\nThis matters to you because senders with high spam complaints will often see their mail broadly throttled or blocked during future email campaigns if this remains an unresolved issue. Since Gmail’s reporting is anonymous, you won’t know specifically who flagged your mail as spam, and you likely won’t know this is an issue until SendGrid reaches out to you.\n\nIf you receive a report from us about Google spam complaints, or even from traditional feedback loops, we have a few best practices to help you resolve the issue:\n\n1. If you don’t have opt-in, don’t send any more to those lists. It’s against our [Terms of Service](https://sendgrid.com/policies/email/), and considered to be [spam](https://www.spamhaus.org/consumer/definition/) anyway by the email community.\n2. If your list is opt-in, track who’s actually engaging with your email, as measured by click and open tracking. Many customers have this data in their own CRM, or you may prefer to use our own Click and Open Tracking apps, coupled with the [Event Webhook]({{root_url}}/for-developers/tracking-events/getting-started-event-webhook/) to consume this data. For recipients who don’t engage with your email, after a certain period of time that you determine to be appropriate based on your customer base and business model, stop sending to them. This tends to be a period between a few weeks and 3 months, depending on your sending frequency.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n\n\nIf you receive a report from us about spam complaints, use this as an opportunity to implement better list acquisition and maintenance.\n\n\n<call-out>\n\nLooking for customized expert advice to improve your email program? Our team of email experts can help you create a plan to ensure you're optimizing your email delivery and engagement, and avoiding future issues. Learn more on our [Expert Services](https://sendgrid.com/solutions/expert-services/?utm_source=docs) page.\n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/sending-email/group-unsubscribes.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Group Unsubscribes\ngroup: tracking\nseo:\n  title: Group Unsubscribes\n  description: Allow recipients to unsubscribe from specific types of email you send, rather than everything you send, and stay out of the spam folder.\n  keywords: Group suppressions, Group unsubscribes, Group email unsubscribe, Group email suppression\nnavigation:\n  show: true\n---\n\nA group unsubscribe happens when a recipient indicates that they would like to opt out from a specific type of email that you send via the [Unsubscribe Groups link](#group-unsubscribe-substitution-tag) from within your email. The list provided here can be filtered by email address or date.\n\n## \tSearching Group Unsubscribes by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the unsubscribe dates you would like to search between. Your recipient list will refresh, showing the recipients who unsubscribed between these dates.\n\n## \tDownload Group Unsubscribes as CSV\n\n*To download your Group Unsubscribe list as a CSV:*\n\n1. Navigate to the Unsubscribe Groups page and locate the list you want to download.\n1. Click the action menu next to the list.\n1. Select **Export**. The file will download in your browser right away.\n\n## \tRemoving Recipients From The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list.\n\n ### \tGroup Unsubscribe Substitution Tag\n\nWhen you add the `<%asm_group_unsubscribe_url%>` tag to your email, we will replace that tag with the text \"Unsubscribe From This List\", wherever the tag is found in your email. This link will allow your recipients to unsubscribe from the unsubscribe group that you attached to this email.\n\nAlternatively, you can use the `<%asm_group_unsubscribe_raw_url%>` tag which will be replaced with only the group unsubscribe URL without the hyperlinked text \"Unsubscribe From This List\".\n\n<call-out>\n\nWhen using our ASM Global or Group Unsubscribe tags, you must pass an unsubscribe group in your API or X-SMTPAPI request for the unsubscribe link to populate.\n\n</call-out>\n\n## \tUsing the API\n\nYou can manage your Global Unsubscribes via the [Group Suppressions API](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups/retrieve-all-suppression-groups-associated-with-the-user).\n\n## \tAdditional Resources\n\n- [Global unsubscribes vs. Group Unsubscribes]({{root_url}}/ui/sending-email/index-suppressions/#suppressions-vs-unsubscribes)\n- [Global Unsubscribes]({{root_url}}/ui/sending-email/global-unsubscribes/)\n- [Invalid Emails]({{root_url}}/ui/sending-email/invalid-emails/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/how-to-implement-dmarc.md",
    "content": "---\nseo:\n  title: How to Implement DMARC\n  description: How to Implement DMARC\n  keywords: security, secure, dmarc, spf, dkim, sender verification, wizard, rua, reject, quarantine\ntitle: How to Implement DMARC\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nDomain-based Message Authentication, Reporting and Conformance (DMARC) was created to tell a participating receiving email server what to do with a message that fails both [SPF]({{root_url}}/glossary/spf/) and [DKIM]({{root_url}}/glossary/dkim/) validation. In other words, what to do if a message claims to be from you, but isn't. If SPF, DKIM, and email validation are new concepts to you, see [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/) for a full explanation.\n\n## Why you should deploy DMARC\n\nDeploying DMARC for your email systems is a powerful way to help prevent malicious entities from potentially spoofing or otherwise tarnishing your reputation as a trustworthy email sender. DMARC isn't for everyone. If you own a small domain, you're probably OK without it. If you have ever had problems with phishing, or if you operate a finance-related business, implementing DMARC may be a good decision.\n\nDMARC, in conjunction with a dedicated IP (included in Pro or higher accounts), is a great start to getting industry-supported peace of mind.\n\n<call-out>\n\nTwilio SendGrid now offers additional DMARC enforcement and monitoring options in partership with [Valimail](https://go.valimail.com/TwilioSendGrid.html). Click [here](https://sendgrid.com/blog/twilio-launches-partnership-with-valimail-dmarc-solutions-to-deploy-sophisticated-anti-phishing-technologies-at-scale/) for more information.\n\n</call-out>\n\n## Reading DMARC reports\n\nThe DMARC aggregate and forensic reports are designed to be machine readable and can be difficult for humans to make sense of. You will also need to utilize a DMARC report monitoring service to collect the reports and present the information in a meaningful way that leads to actionable insights. [Return Path's Email Brand Monitor](https://www.validity.com/products/returnpath/) is one, and [Agari](https://www.agari.com/dmarc/) is another.\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n### Do you want expert help to get your email program started on the right foot?\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n</call-out-link>\n\n## The 5 phases of implementation:\n\n1. Deploy DKIM & SPF by setting up reverse DNS for your SendGrid IP.\n2. Ensure proper DKIM and SPF signing for your authenticated domain.\n3. Publish a DMARC record with your DNS registrar, then monitor the results.\n4. Analyze the feedback you receive, and adjust your mail streams as needed.\n5. Escalate your DMARC policy tags from `p=none` to `p=quarantine` to `p=reject` as you gain experience.\n\n### 1. Deploy DKIM and SPF by setting up reverse DNS for your SendGrid IP\n\nStart by setting up reverse DNS for your account. This ensures that emails sent through your SendGrid account will be properly signed using DKIM and SPF for your unique domain. For more information on completing this process, see [How to set up reverse DNS]({{root_url}}/ui/account-and-settings/how-to-set-up-reverse-dns/).\n\n### 2. Ensure proper DKIM and SPF signing for your authenticated domain\n\nSend yourself some test emails if you're unsure of this step. You're looking to verify that the DKIM and SPF signatures in your email headers align to the domain you've authenticated your SendGrid account with.\n\n#### Examples of a passing DKIM and SPF check\n\n![A passing SPF and DKIM check summary from the Twilio domain]({{root_url}}/img/dkim_spf_pass_1.png)\n![A passing SPF and DKIM check in the headers of an email from the Twilio domain]({{root_url}}/img/dkim_spf_pass_2.png)\n\nAs long as both DKIM and SPF are passing, you’re in business!\n\n### 3. Publish a DMARC record with your DNS registrar, then monitor the results\n\nWithin your DNS registrar, you'll need to create a TXT resource record that receivers can use to determine your DMARC preferences. This is done within the DNS registrar of the domain host—likely the same place you created the DNS records for the authenticated domain. This record is made at the root level for the domain, not the subdomain.\n\n#### A simple DMARC record\n\n    \"v=DMARC1; p=none; pct=100; rua=mailto:dmarc.rua@customdomain.com\"\n\nFor details about DMARC records, see the [DMARC Records]({{root_url}}/ui/sending-email/dmarc/#dmarc-records) section of [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/) where you'll find detailed explanations of every tag in a DMARC record.\n\n<call-out>\n\nAlways start out using the `p=none` policy. You can move to `p=quarantine` or `p=reject` when you better understand your sending reputation.\n\n</call-out>\n\n### 4. Analyze the feedback you receive and adjust your mail streams as needed\n\nIf unqualified mail gets sent to, and received by, recipients participating in DMARC, the recipient will generate reports for these messages and send them back to the `mailto:` address specified in your DMARC record. These reports will give you the information required to evaluate and tune your mail streams, helping you determine exactly what services are sending mail on behalf of your domain.\n\nBelow is a sample report with only one record, showing the results for 2 pieces of mail.\nPlease note that the listed SPF and DKIM `auth_results` are raw results, regardless of the `s=` alignment. For help understanding all the tags in a DMARC record, see the [DMARC Records]({{root_url}}/ui/sending-email/dmarc/#dmarc-records) section of [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/).\n\n<call-out>\n\nThe filename is formatted as:  \nfilename = receiver \"!\" policy-domain \"!\" begin-timestamp \"!\" end-timestamp \".\" extension\n\nExample: receiver.org!sender.com!1335571200!1335657599.zip\n\n</call-out>\n\n#### Sample DMARC report\n\n    <?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n    <feedback>\n        <report_metadata>\n            <org_name>receiver.com</org_name>\n            <email>noreply-dmarc-support@receiver.com</email>\n            <extra_contact_info>http://receiver.com/dmarc/support</extra_contact_info>\n            <report_id>9391651994964116463</report_id>\n            <date_range>\n                <begin>1335571200</begin>\n                <end>1335657599</end>\n            </date_range>\n        </report_metadata>\n        <policy_published>\n            <domain>sender.com</domain>\n            <adkim>r</adkim>\n            <aspf>r</aspf>\n            <p>none</p>\n            <sp>none</sp>\n            <pct>100</pct>\n        </policy_published>\n        <record>\n            <row>\n                <source_ip>72.150.241.94</source_ip>\n                <count>2</count>\n                <policy_evaluated>\n                    <disposition>none</disposition>\n                    <dkim>fail</dkim>\n                    <spf>pass</spf>\n                </policy_evaluated>\n            </row>\n            <identifiers>\n                <header_from>sender.com</header_from>\n            </identifiers>\n            <auth_results>\n                <dkim>\n                    <domain>sender.com</domain>\n                    <result>fail</result>\n                    <human_result></human_result>\n                </dkim>\n                <dkim>\n                    <domain>sender.net</domain>\n                    <result>pass</result>\n                    <human_result></human_result>\n                </dkim>\n                <spf>\n                    <domain>sender.com</domain>\n                    <result>pass</result>\n                </spf>\n            </auth_results>\n        </record>\n    </feedback>\n\n<call-out>\n\nAggregate reports are sent as a ZIP attachment, so be sure the address you’re defining is able to accept attachments in this file type.\n\n</call-out>\n\n### 5. Escalate your DMARC policy tags from `p=none` to `p=quarantine` to `p=reject` as you gain experience\n\nNow that you’ve tested and tweaked your mail streams to determine exactly who and what is sending mail for your domain, you can adjust your policy setting.\n\nUntil now you should have been using the `p=none` policy to get reports of any errant behavior, and you should have a good idea of where email is coming from. The next step is to adjust the policy on your DMARC record to start controlling how receivers handle email claiming to be from your domain.\n\n**p=none** - Get reports of infractions, but no action is taken by recipients as far as processing the messages themselves.\n\n**p=quarantine** - Unqualified mail goes directly to spam, but can be recovered. This is useful when you’re fairly certain you know all the locations where mail is coming from but want to \"softfail\" any messages that are unqualified until you’re 100% sure.\n\n**p=reject** - Unqualified mail is completely deleted by the recipient mail server, never to be seen again. Use this setting when you’re absolutely sure you know every server and service that is sending email for your domain, signing is in place for each of these services, and you want any service claiming otherwise to be completely denied\n\n<call-out>\n\nGet started on the right foot. Be confident that your account is optimized and set up for success now and as your email program continues to grow with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).\n\n</call-out>\n\n## Additional Resources\n\n- [Everything about DMARC]({{root_url}}/ui/sending-email/dmarc/)\n- [DMARC.org](https://dmarc.org/)\n- [DMARC.org Frequently Asked Questions](https://dmarc.org/wiki/FAQ)\n- [DMARC specification](https://dmarc.org/resources/specification/)\n- [Returnpath quickstart download](https://returnpath.com/downloads/authenticating-email-dmarc-spf-dkim-quick-start-guide/)\n- [Agari](https://www.agari.com/dmarc/)\n- [SPF record validator](https://www.kitterman.com/spf/validate.html)\n- [DMARC record validator](https://kitterman.com/dmarc/assistant.html)\n"
  },
  {
    "path": "content/docs/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates.md",
    "content": "---\nlayout: page\nweight: 100\ntitle: How to send an email with Dynamic Transactional Templates\ngroup: transactional-email\nnavigation:\n  show: false\nseo:\n  title: How to send an email with Dynamic Transactional Templates\n  override: true\n  description:\n---\n\n## Before you begin\n\nBefore you create and send an email using a dynamic transactional template you need to do the following:\n\n- Create a SendGrid account\n- Create an [API Key]({{root_url}}/ui/account-and-settings/api-keys/)\n- Add an [unsubscribe group]({{root_url}}/ui/sending-email/group-unsubscribes/) (optional)\n\n## Design a dynamic transactional template\n\n1. Open the [Dynamic Transactional Templates](https://sendgrid.com/dynamic_templates) page and click **Create Template**.\n2. Add a unique template name and then click **Save**.\n3. To begin editing your new template, click **Add Version**.\n4. Select an editor and click **Continue**.\n5. Design your template. For more information on using Handlebars, see [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/).\n\n## Unsubscribe modules for dynamic transactional templates\n\nIf you want to create a static unsubscribe module for a dynamic transactional template, you can copy the contents of an unsubscribe module into a text module and then replace the sender name and address substitution tags with the desired information or handlebars syntax as shown below.\n\nFor sample templates that include examples of receipts, password resets, account activations, newsletters, and sale notifications, check out the [dynamic-template section of our email template's GitHub repo](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates).\n\nThe cURL calls on this page use the [receipt example template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/receipt).\n\n<call-out type=\"warning\">\n\nTo send mail using Dynamic Templates, you must use the [Web API mail.send](https://sendgrid.com/docs/for-developers/sending-email/v3-mail-send-faq/). SMTP sends do not support Dynamic Templates.\n\n</call-out>\n\n## Send a transactional email\n\n_To send a dynamic transactional email:_\n\nIn order to send a dynamic transactional email using cURL, set your call up to look something like this:\n\n```\ncurl -X \"POST\" \"https://api.sendgrid.com/v3/mail/send\" \\\n     -H 'Authorization: Bearer <<YOUR_API_KEY>>' \\\n     -H 'Content-Type: application/json' \\\n     -d '{\n   \"from\":{\n      \"email\":\"example@.sendgrid.net\"\n   },\n   \"personalizations\":[\n      {\n         \"to\":[\n            {\n               \"email\":\"example@sendgrid.net\"\n            }\n         ],\n         \"dynamic_template_data\":{\n            \"total\":\"$ 239.85\",\n            \"items\":[\n               {\n                  \"text\":\"New Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/8dda1131320a6d978b515cc04ed479df259a458d5d45d58b6b381cae0bf9588113e80ef912f69e8c4cc1ef1a0297e8eefdb7b270064cc046b79a44e21b811802.png\",\n                  \"price\":\"$ 79.95\"\n               },\n               {\n                  \"text\":\"Old Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/3629f54390ead663d4eb7c53702e492de63299d7c5f7239efdc693b09b9b28c82c924225dcd8dcb65732d5ca7b7b753c5f17e056405bbd4596e4e63a96ae5018.png\",\n                  \"price\":\"$ 79.95\"\n               },\n               {\n                  \"text\":\"Blue Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/00731ed18eff0ad5da890d876c456c3124a4e44cb48196533e9b95fb2b959b7194c2dc7637b788341d1ff4f88d1dc88e23f7e3704726d313c57f350911dd2bd0.png\",\n                  \"price\":\"$ 79.95\"\n               }\n            ],\n            \"receipt\":true,\n            \"name\":\"Sample Name\",\n            \"address01\":\"1234 Fake St.\",\n            \"address02\":\"Apt. 123\",\n            \"city\":\"Place\",\n            \"state\":\"CO\",\n            \"zip\":\"80202\"\n          }\n      }\n   ],\n   \"template_id\":\"[template_id]\"\n}'\n```\n\nIt is important to note 2 sections of this call when using dynamic templates:\n\nIn order to send dynamic content, you need to specify a JSON blob containing the dynamic data your template will use in the `dynamic_template_data` object. The Handlebars script you write will refer to the values in your JSON blob by referencing the JSON key, check out [these examples]({{root_url}}/for-developers/sending-email/using-handlebars/#handlebarjs-reference). This Handlebars templating can be used in the text, html, and subject lines of your template.\n\n```\n         \"dynamic_template_data\":{\n            \"total\":\"$ 239.85\",\n            \"items\":[\n               {\n                  \"text\":\"New Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/8dda1131320a6d978b515cc04ed479df259a458d5d45d58b6b381cae0bf9588113e80ef912f69e8c4cc1ef1a0297e8eefdb7b270064cc046b79a44e21b811802.png\",\n                  \"price\":\"$ 79.95\"\n               },\n               {\n                  \"text\":\"Old Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/3629f54390ead663d4eb7c53702e492de63299d7c5f7239efdc693b09b9b28c82c924225dcd8dcb65732d5ca7b7b753c5f17e056405bbd4596e4e63a96ae5018.png\",\n                  \"price\":\"$ 79.95\"\n               },\n               {\n                  \"text\":\"Blue Line Sneakers\",\n                  \"image\":\"https://marketing-image-production.s3.amazonaws.com/uploads/00731ed18eff0ad5da890d876c456c3124a4e44cb48196533e9b95fb2b959b7194c2dc7637b788341d1ff4f88d1dc88e23f7e3704726d313c57f350911dd2bd0.png\",\n                  \"price\":\"$ 79.95\"\n               }\n            ],\n            \"receipt\":true,\n            \"name\":\"Sample Name\",\n            \"address01\":\"1234 Fake St.\",\n            \"address02\":\"Apt. 123\",\n            \"city\":\"Place\",\n            \"state\":\"CO\",\n            \"zip\":\"80202\"\n         }\n```\n\nIn addition to specifying the dynamic template data, you need to specify the template ID. The template ID is 64 characters with one dash (d-uuid). If you forget your template ID and want to access it from the API, use the following curl call to retrieve all of your transactional templates:\n\n```\ncurl --request GET \\\n  --url 'https://api.sendgrid.com/v3/templates?generations\\%5C=legacy&generations\\%5C=dynamic' \\\n  --header 'Authorization: Bearer <<YOUR_API_KEY>>' \\\n  --header 'Content-Type: application/json'\n```\n\nYou can also copy your template ID from the app and paste it into your call.\n\n![]({{root_url}}/img/dynamic_template_id.png 'Dynamic Template ID')\n\n## Additional Resources\n\n- [Mail Send with Dynamic Templates](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send#handlebars)\n- [Unsubscribe Groups]({{root_url}}/ui/sending-email/group-unsubscribes/)\n- [Using Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/how-to-send-email-with-marketing-campaigns.md",
    "content": "---\nlayout: page\nweight: 99\ntitle: How to Send Email with new Marketing Campaigns\ngroup: marketing-campaigns\norder: 1\nnavigation:\n  show: true\nseo:\n  title: How to Send Email with Marketing Campaigns\n  override: true\n  description: Send your first email using the new Marketing Campaigns tool.\n---\n\n<call-out>\n\nThis page refers to the new Marketing Campaigns product. If you’re using legacy Marketing Campaigns, your workflow will be a little different and your screen won’t look the same as the screenshots.\n\n</call-out>\n\n<iframe src=\"https://player.vimeo.com/video/305551346\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n<call-out>\n\nIf you want to send email programmatically using Twilio SendGrid's Email API, see the [API reference]({{root_url}}/api-reference/) or the [SMTP Reference]({{root_url}}/for-developers/sending-email/getting-started-smtp/).\n\n</call-out>\n\n## Before you send your first email with Marketing Campaigns\n\n<call-out type=\"warning\">\n\nBefore you begin, go to your SendGrid [account settings](https://app.sendgrid.com/settings/account) to verify that your timezone and account email address are correct. Verifying your account information ensures that when you upload contacts, you receive notifications and that we deliver scheduled email at the right time. You can also add additional email addresses to receive account notifications by going to the Marketing page and selecting **Notifications**. From Notifications, you can add a different email address to which we will send important account notifications, like contact export activity.\n\n</call-out>\n\n### Change your time zone\n\nYour time zone is set at the account level, you’ll need to navigate to your account settings to change it.\n\n1. Near the bottom of the left-hand navigation, select **Settings**.\n1. Click **Account Details**, or go [here](https://app.sendgrid.com/settings/account).\n1. Locate the _Timezone_ field under **Your Account**, and correct it if necessary.\n\n### Add a sender\n\nSpecifying a [sender]({{root_url}}/ui/sending-email/senders/) in Marketing Campaigns is required by CAN-SPAM regulations, and provides identity information about where the emails are coming from in each email you send.\n\nWhen you add a sender, you need to specify the following information:\n\n- **From name** - the name of the person or company you wish to send email from.\n- **From email** - the email of the person or company you wish to send email from.\n- **Reply to email** - the email address of the person or company you want recipients to reply to. (Can also be a role address.)\n- **Company address** - the physical location of the business you’re sending email on behalf of.\n- **City** - the city of the business you're sending email on behalf of.\n- **Nickname** - the nickname is for your reference only; this field will not be displayed to recipients.\n\n<call-out>\n\nIf your email domain doesn't match one of your [authenticated]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) domains, you'll need to verify this email address before using this sender. We'll send this email address a verification email after you save this sender.\n\n</call-out>\n\n### Create Notifications\n\nBy default, notifications about your account's Marketing Campaigns activity, CSV upload summaries, sender verifications, and list or segment exports will send to the email you signed up with on your parent account. You can also opt in to receive email notifications from SendGrid to up to 10 email addresses by following the instructions [here]({{root_url}}/ui/account-and-settings/notifications/).\n\n## Add Contacts\n\nMarketing Campaigns offers a number of ways to add contacts to lists, including:\n\n- [**CSV Upload**]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#upload-a-csv/)\n\n- [**Signup Forms**]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#create-a-signup-form/)\n\n![]({{root_url}}/img/sign-up-form.png 'Sign Up Form')\n\n- [**Manually Adding a Contact**]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#add-manually)\n\n- [**Contact Management APIs**](https://sendgrid.api-docs.io/v3.0/contacts/)\n\n## Add an Unsubscribe Group\n\n[Unsubscribe Groups]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/) provide your recipients with an alternative to opting out of all email that you send, by giving them the opportunity to specify the kinds of email that they would no longer like to receive.\n\n1. Navigate to **Marketing** and click **Unsubscribe Groups**.\n1. Click **Add Unsubscribe Groups** if you do not already have any unsubscribe groups, or click **Create New Group** to add a new group.\n1. Enter the Group Name and Group Description for your Unsubscribe Group.\n\n<call-out type=\"warning\">\n\nThe Group Name as well as the Group Description are public-facing and will be visible to your recipients.\n\n</call-out>\n\n![]({{root_url}}/img/unsubscribe-group-example.png 'Alt text')\n\n4. Select the checkbox if you want the Unsubscribe Group to display on the unsubscribe preferences page.\n5. Click **Save Unsubscribe Group**.\n6. Find your newly created Unsubscribe Group, click the action menu, and then click **Preview**.\n\n## Create a Single Send\n\n1. From the left-hand navigation, select **Marketing**.\n1. Select **Single Sends**.\n1. To create a new one-to-many email, click **Create Single Send**.\n1. Select the template that you want to use for your email.\n   <br> You can select a blank template, a custom template that you have already created, or one of SendGrid's responsive pre-built templates. For more information, see [Working with Marketing Campaigns Email Designs]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/).\n\n<call-out>\n\nYou can also create a template from an existing Single Send by selecting the action menu next to the email you'd like to reuse and selecting **Create Template**.\n\n</call-out>\n\n5. Select an editor.\n   <br> You can choose between the **Design Editor** and the **Code Editor**.\n\n![]({{root_url}}/img/choose-editor.png)\n\n<call-out>\n\nThe [**Design Editor**]({{root_url}}/ui/sending-email/editor/#the-design-editor) offers users powerful drag & drop editing tools, making it possible to build beautiful emails using a library of content modules like text boxes,images, buttons and more. For those familiar with HTML, there are options to edit the HTML of individual modules, drag in a custom code module, or to import an entire HTML email with drag & drop markup.\n\nThe [**Code Editor**]({{root_url}}/ui/sending-email/editor/#the-code-editor) provides users who are importing, editing, or crafting custom HTML a robust, IDE-like environment, featuring side-by-side code and preview panes, syntax highlighting, error flagging and image management.\n\n</call-out>\n\nInside the Design Editor, you use the **Settings**, **Tags** and **Build** tabs to design and configure your email.\nInside the Code Editor, you can click the left **Settings** tab to expand the settings window, and then you can configure your email using the **Settings** and **Tags** tabs.\n\n![]({{root_url}}/img/design-editor-preview.png 'Design Editor Preview')\n\n6. Define key settings like _From Sender_, _Email Subject_, _Preheader_, _Recipients_, and _Scheduling_ by filling in the fields in the **Settings** tab.\n\n<call-out type=\"warning\">\n\nWhen selecting segments, make sure you are limiting your selection to 10 segments.\n\n</call-out>\n\n<call-out>\n\nIf you have dedicated IPs, you can set up [IP Pools]({{root_url}}/ui/account-and-settings/ip-pools/) that allow you separate your traffic and potentially enhance your deliverability by protecting your sender reputation. To utilize IP pools for Single Sends, navigate to **Settings** and from the IP Pool drop-down, select the IP pool you wish to use.\n\n</call-out>\n\n7. Add your custom content by clicking the **Build** tab in the Design Editor, or by editing the HTML code in the Code Editor.\n\n![]({{root_url}}/img/build-tab.png 'Build tab')\n\n<call-out>\n\nMake sure to include the [{{{unsubscribe}}}]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/) tag to test and send your campaign.\n\nFor more information about customizing your campaign, see [Using the Design Editor]({{root_url}}/ui/sending-email/editor/#the-design-editor) or [Using the Code Editor]({{root_url}}/ui/sending-email/editor/#the-code-editor).\n\n</call-out>\n\n## Sending your First Email\n\n<iframe src=\"https://player.vimeo.com/video/385339044\" width=\"640\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n1. As you're editing your email, you can see what it looks like by clicking **Preview** from within the design editor, or, from the code editor simply toggle between **Desktop**, **Mobile**, and **Plain text**. You can also preview from the Single Sends index page by hovering over the action menu and clicking **Preview**.\n2. You can test your email by sending it to yourself and up to 10 other recipients. We'll automatically append \"Test - \" to the subject line so your recipients know it's a test and not the real send. From **Settings**, click **Test Your Email** and enter the email addresses to send your test to.\n3. For more robust, automated testing, we offer [Email Testing]({{root_url}}/ui/sending-email/email-testing/) for both Automation and Single Sends so you can see what your email looks like across different operating systems, browsers, and inboxes.\n4. With your email fully tested and ready to go, click **Send** or **Schedule**. You'll have the chance to do a final review of settings before confirming your send!\n\n## Additional Resources\n\n- [Sending with Email API]({{root_url}}/for-developers/sending-email/api-getting-started/)\n- [Campaign Statistics]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats/)\n- [Getting Started with Automation]({{root_url}}/ui/sending-email/getting-started-with-automation/)\n- [Reading your invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/image-editor.md",
    "content": "---\nlayout: page\nweight: 81\ntitle: Image Editor\ngroup: building-email\nnavigation:\n  show: true\nseo:\n  title: Image Editor\n  override: true\n  description: Twilio SendGrid Marketing Campaigns' image editor allows you to crop, flip, and filter images to help you create the perfect design without the need for any other tools.\n---\n\nTwilio SendGrid’s Marketing Campaigns provides a built-in image editing tool that allows you to crop, flip, and filter your photos. This article provides an overview of the editor and its features with additional tips to make your images look their best.\n\n<call-out>\n\nBecause the Image Editor is available within the [Design Library](https://mc.sendgrid.com/design-library/your-images), you can edit images you send with the Email API as well as Marketing Campaigns.\n\n</call-out>\n\n## Image Library\n\nYou can upload new images and access existing images in the Marketing Campaigns Image Library. Supported file types include .jpg, .gif, and .png. To access the Image Library, navigate to [Design Library > Your Images](https://mc.sendgrid.com/design-library/your-images) in the sidebar navigation of the SendGrid App. You can also access the Image Library while editing a Single Send or Automation email by adding an image into your content and clicking “Edit Image.”\n\n![The Image Library landing page in the SendGrid App. Here you can upload new images or select existing images to edit.]({{root_url}}/images/mc-image-library-landing-page.png 'The Image Library landing page')\n\nTo upload an image, you can either drag an image onto the page where it says, \"Drag and drop your images here, or choose images to upload.\" If you click the \"choose images to upload\" link, a system dialog will open, allowing you to browse for images on your computer.\n\n![Upload a new image to the Image Library]({{root_url}}/images/mc-image-library-upload-new-image.png 'Upload a new image to the Image Library')\n\nThe Image Library displays all images you previously uploaded. You can click any of these images to load a sidebar overlay that displays the image's details. You will also have the option to delete the image, edit the image, or copy the image URL.\n\n![A sidbar modal showing an image's details and allowing you to delete the image, edit the image, or copy the image's URL]({{root_url}}/images/mc-image-library-image-detail-modal.png 'Image details with options to delete or edit an image')\n\n## Image Editor\n\nTo access the image editor, open the [Image Library](https://mc.sendgrid.com/design-library/your-images/) and upload a new image or select a pre-existing image that you would like to edit. With an image selected, the detail menu mentioned above should load. Select \"Edit Image\" from this menu.\n\n![The edit button highlighted inside the image details menu]({{root_url}}/images/mc-image-library-image-edit-image-button.png 'Select edit to load the Image Editor')\n\n<call-out>\n\nYou can also access the Image Editor by editing images already placed in your Single Sends and Automations designs. For more on Email Design, see [Working with Marketing Campaigns Email Design]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/)\n\n</call-out>\n\nOnce in the Image Editor, you will have three primary actions available, \"Transform,\" \"Filter,\" and \"Adjust.\" Each category contains multiple actions that can be performed on your image. More details about these actions is provided below.\n\nWhen saving edits to your images, a new image will be saved to your Image Library. This allows you to modify an image without overwriting your original photo. You can select \"Cancel\" at any time to abandon your edits without saving.\n\n<call-out>\n\nYou can save images in either the JPG or PNG format. If your image must support transparency, save the file in PNG format. JPG does not support transparency.\n\n</call-out>\n\n![The Image Editor landing page shows the top level editor actions on the left and an image preview on the right]({{root_url}}/images/mc-image-editor-landing-page.png 'The Image Editor landing page')\n\n<call-out>\n\nImages cannot be larger than 4MB.\n\n</call-out>\n\n### Transform\n\nThe transformation actions include cropping, flipping, and rotating an image.\n\n#### Crop\n\n<call-out>\n\nCropping an image can change its composition to help communicate your story. Common guidelines for framing and cropping images include the [rule of thirds](https://en.wikipedia.org/wiki/Rule_of_thirds) and the [golden ratio](https://en.wikipedia.org/wiki/Golden_ratio#Applications_and_observations).\n\n</call-out>\n\n- Freeform: crop the image to any desired width and height\n- Landscape: crop the image with a fixed 4:3 aspect ratio\n- Portrait: crop the image with a fixed 3:4 aspect ratio\n\n#### Flip and rotate\n\n- Rotate: rotate the image 90 degrees clockwise\n- Flip Horizontally\n- Flip Vertically\n\n### Filter\n\nThe provided filters can help quickly alter a photo to create a look and feel without manual adjustments.\n\n### Adjust\n\nThe adjustment actions allow you to manually alter multiple image settings. These manual adjustments can be used to modify an unedited photo or to further refine a look after you have applied a filter.\n\n<call-out>\n\nAltering an image's color balance, contrast, and saturation is a powerful way to control your messaging. [Color theory](https://www.smashingmagazine.com/2010/01/color-theory-for-designers-part-1-the-meaning-of-color/) is the way designers and artists use color to communicate.\n\n</call-out>\n\n- Hue: adjust the image's color balance\n- Saturation: adjust the intensity of the hues in the image\n- Brightness: raise or lower the overall luminosity of the image\n- Contrast: adjust the difference between the least and most intense image tones\n- Opacity: control the image's transparency\n- Blur: apply blur to the image\n- Sepia: apply a sepia tone to the image\n- Grayscale: convert the image to grayscale (this is similar to desaturating the image)\n"
  },
  {
    "path": "content/docs/ui/sending-email/index-suppressions.md",
    "content": "---\nlayout: page\nweight: 100\ntitle: Suppressions Overview\ngroup: tracking\nseo:\n  title: SendGrid Suppressions Overview\n  description: SendGrid will suppress emails that your recipients unsubscribe from or that recipient email servers reject.\n  keywords: suppressions, unsubscribes, email suppressions, email unsubscribes\nnavigation:\n  show: true\n---\n\n## Suppressions vs. Unsubscribes\n\nAn unsubscribe is the action an email recipient takes when they opt-out of an email list. Typically, this is done by clicking the unsubscribe link in the email.\n\nA suppression is the action the sender takes by no longer sending to an email address when a recipient has opted out of an email list or when the recipient’s email server or provider has rejected emails sent to that address.\n\nThis is an important distinction, because from the point of view of your recipients, you as the SendGrid customer are the sender. We have made this distinction in order to clearly define the difference between an action a recipient takes and an action SendGrid takes on your behalf.\n\n<call-out type=\"warning\">\n\nEach email you attempt to send to a suppressed address will consume one email from your account.\n\n</call-out>\n\n## Managing Unsubscribes\n\nManaging unsubscribes is key to getting maximum email delivery. If your recipients have an easy way to tell you that they’d like to stop receiving your email, instead of using the spam button, it will give you valuable insights without affecting your reputation.\n\nSendGrid has three different ways of processing unsubscribes depending on how you’re sending mail. If you use [Subscription Tracking]({{root_url}}/ui/sending-email/subscription-tracking/), recipients can unsubscribe from all of the emails you’re sending. As a transactional mail user, you also have the option to create unsubscribe groups for your transactional templates using Advanced Suppression Management. Alternatively, if you’re sending Marketing Campaigns, recipients can unsubscribe from specific types of emails that they’d rather not receive anymore, also known as [Unsubscribe Groups]({{root_url}}/ui/sending-email/unsubscribe-groups/).\n\nIf you are sending Transactional email through the SendGrid API or SMTP and have the Subscription Tracking setting turned on, an unsubscribe option will be added to the footer of every email that gets sent through your account. A user who clicks the unsubscribe link will be added to your global unsubscribe list and **any** future attempts to send email to those users will be suppressed, unless they’re removed. You can also manage this list manually, adding and removing addresses via the UI or with the use of API calls.\n\nThe Subscription Tracking setting also has a number of options for customization, such as a replacement tag that allows you to place the unsubscribe text somewhere in the body of the email, the ability to reword the unsubscribe message, and the ability to add a custom landing page.\n\nIf using Advanced Suppression Management in place of Subscription Tracking, an ASM tag must be included in the template.\n\n- We will replace the tag with the text \"Unsubscribe From All Emails\" if you include `<%asm_global_unsubscribe_url%>`\n- We will replace the tag with the unsubscribe URL but **without** the hyperlinked tag if you include  \n  `<%asm_global_unsubscribe_raw_url%>`\n- We will replace the tag with the text \"Unsubscribe from this list\" if you include `<%asm_group_unsubscribe_url%>`\n- We will replace the tag with only the group unsubscribe URL **without** the hyperlinked text if you include\n  `<%asm_group_unsubscribe_raw_url%>`\n\n## Different Types of Suppressions\n\nSendGrid automatically suppresses emails sent to users for a variety of reasons in order to aid our customers in having the best possible reputation they can have by attempting to prevent unwanted mail.\n\n**[Blocks]({{root_url}}/ui/sending-email/blocks/)** - The recipient's email server rejects the message for a reason related to the message, not the recipient address. This may be due to your Sending IP, or the message content. Since these are message-specific issues, future messages to these addresses are _not_ suppressed.\n\n**[Bounces]({{root_url}}/ui/sending-email/bounces/)** - The recipient’s email server rejects the message, or sends the message back to SendGrid, due to an issue with the recipient address.\n\n**[Invalid Emails]({{root_url}}/ui/sending-email/invalid-emails/)** - The recipient address does not exist at the mail server you sent to.\n\n**[Spam Reports]({{root_url}}/glossary/spam-reports/)** - The recipient marks your email as spam.\n\n**[Global Unsubscribes]({{root_url}}/ui/sending-email/global-unsubscribes/)** - When a user unsubscribes from everything you might email them.\n\n**[Group Unsubscribes]({{root_url}}/ui/sending-email/group-unsubscribes/)** - When a user unsubscribes from a specific group of your emails.\n\n## Bypass suppressions\n\nBypass filters allow you to disregard unsubscribe groups and suppressions to ensure that an email is delivered to all recipients, whether or not they are on a suppression or unsubscribe list. It is important to respect unsubscribes, and these filters should be used only when it is absolutely necessary to deliver a message to recipients who have unsubscribed from your emails. For example, you may use these filters to deliver messages that you are legally required to send to all recipients or important security messages like a password reset.\n\n### Bypass list management\n\nBoth the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/smtp-filters/#filter-bypass_list_management) and the [v3 Mail Send API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) accept the `bypass_list_management` filter. By setting the `bypass_list_management` filter to `true`, your message will bypass all unsubscribes and suppressions in **all** lists.\n\n### Bypass filters and v3 Mail Send\n\nThe v3 Mail Send API provides three filters in addition to `bypass_list_management`. These additional filters allow you to bypass a single list. You can also pass multiple bypass filters to the v3 Mail Send API to target a combination of lists; however, the `bypass_list_management` filter cannot be combined with any other bypass lists. When using the `bypass_list_management` filter, you are disregarding all lists, and any more granular bypass settings will be ignored.\n\nEach filter should be sent via the `mail_settings` field as an object with a single boolean field called `\"enable\"`. When a filter is set to `true`, Twilio SendGrid will disregard or _bypass_ the unsubscribe or suppression status of the addresses in the list, delivering the message to the recipients. See the [v3 Mail Send API reference](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) for examples.\n\n- Bypass spam management\n  - By setting the `bypass_spam_management` filter to `true`, your message will bypass the spam report list. The bounce and global unsubscribe lists will be checked and respected.\n- Bypass bounce management\n  - By setting the `bypass_bounce_management` filter to `true`, your message will bypass the bounce list. The spam report and global unsubscribe lists will be checked and respected.\n- Bypass unsubscribe management\n  - By setting the `bypass_unsubscribe_management` filter to `true`, your message will bypass the global unsubscribe list. The spam report and bounce lists will be checked and respected. Note that this bypass filter is applied to global unsubscribes only; group unsubscribes will be checked and respected.\n\n## Additional resources\n\n- [Unsubscribe Groups]({{root_url}}/ui/sending-email/unsubscribe-groups/)\n- [Create and Manage Unsubscribe Groups]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/invalid-emails.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Invalid Emails\ngroup: delivery-optimization\nseo:\n  title: Invalid Emails\n  description: When an email is malformed or a mailbox provider says the email is invalid, SendGrid will keep these reports for you.\n  keywords: invalid emails, malformed emails\nnavigation:\n  show: true\n---\n\nAn invalid email occurs when you attempt to send email to an address that is formatted in a manner that does not meet internet email format standards or the email does not exist at the recipient's mail server. Examples include addresses without the “@” sign or addresses that include certain special characters and/or spaces. This response can come from our own server or the recipient mail server.\n\nBefore you send, SendGrid does a check against the format of the email address to attempt to verify its validity. If the recipient server checks the address and doesn't find it, they will send back a 550 bounce to say that this is an invalid email address.\n\n<call-out>\n\nInvalid drop events are retained for 30 days.\n\n</call-out>\n\n## Searching Invalid Emails by Date\n\nIn the top right corner, you will see a calendar icon. Click this and choose the dates you would like to search between. Your recipient list will refresh, showing the invalid email address reports from between those dates.\n\n## Removing Recipients From The List\n\nWhen you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list.\n\n## Download Invalid Emails as CSV\n\nYou can download your list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away.\n\n## Additional Resources\n\n- [Recipient Subscription Preferences]({{root_url}}/ui/sending-email/recipient-subscription-preferences/)\n- [Spam Reports]({{root_url}}/ui/sending-email/spam/)\n- [Invalid Emails API](https://sendgrid.api-docs.io/v3.0/invalid-emails-api)\n"
  },
  {
    "path": "content/docs/ui/sending-email/ip-warmup-for-the-new-marketing-campaigns-experience.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: IP Warmup with Marketing Campaigns\ngroup: delivery-optimization\nnavigation:\n  show: true\nseo: \n  title: IP Warmup with Marketing Campaigns\n  keywords: IP, warmup, deliverability, new Marketing Campaigns\n  override: true\n  Description: Directions for warming up a dedicated IP address using the new Marketing Campaigns experience.\n---\n\n## What is IP warming? \n\nIP warming is the practice of gradually increasing the volume of mail sent with a dedicated IP address according to a predetermined schedule. This gradual process helps to establish a reputation with inbox providers (Gmail, Yahoo, etc.) as a legitimate email sender. If you immediately begin sending large amounts of mail, you will risk having your messages blocked by inbox providers.\n\nIf you’re using an Advanced Marketing Campaigns plan, or if you have a dedicated IP as part of your Email API plan, this article will help you identify the right warmup strategy for your email program. \n\n## How to know if you have a dedicated IP \n\nThe Marketing Campaigns Advanced package, as well as Email API Pro and Premier packages, all include a dedicated IP. With any of these packages, you’re also able to purchase additional IPs. To view your IPs, navigate to **Settings** and click **IP Addresses**.\n\n<call-out>\n\nIf you have existing dedicated IPs from your Email API package that are already warmed up, you still need to warm up your new Advanced Marketing Campaigns dedicated IP. \n\n</call-out>\n\nIf you’ve been sending through the Basic Marketing Campaigns package and you’re on an Essentials Email API plan, you’ve been sending on a shared IP. This means when you upgrade to a package that includes a dedicated IP, you’ll still need to go through the warmup process. Inbox providers expect your traffic to come from shared IPs, so when you begin sending over your new IP inbox providers will see this as a new, “cold” mailstream. \n\n## How to schedule IP warmup with Marketing Campaigns\n\nDepending on the maximum daily volume you plan to send, a warmup can take anywhere from a few days to a few weeks. Our general recommendation is to send no more than 50 emails on your new IP address on your first day of sending. From there, you’ll want to double your volume every concurrent day you send until you’ve reached the maximum daily volume you plan on sending. At that point, inbox providers will be more familiar with your sender reputation, and you will fully warmup your IP. \n\nYou can use the Marketing Campaign’s scheduling and contact management tools to create a warmup schedule. First, you’ll want to split up your contacts into lists, where the number of contacts in each list is associated with a day of warmup. For example, if 800 messages per day was your maximum daily send volume, you’d want to create contact lists of 50, 100, 200, 400, and 800. You’d send to the list of 50 on day one, the list of 100 on day two, and so on. \n\n*To upload these lists:*\n\n1. Navigate to the **Marketing** tab. \n1. Select **Contacts**. \n1. Create a new list titled “Day 1” and [upload]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#add-contacts) your first group of 50 contacts to this list.\n\n<call-out>\n\nEnsure that you [format your contact lists correctly]({{root_url}}/ui/managing-contacts/formatting-a-csv/) before continuing.\n\n</call-out>\n\nContinue creating new lists for each day of your warmup and upload the associated number of contacts for each day. When you finish, you should have a list for every day in your warmup with the number of contacts in each day doubling. \n\nNext, you’ll want to create a template for your warmup campaign. \n\n *To create a template:*\n\n1. Navigate to **Marketing** and then select **Templates**. \n1. Click **Create Template** and select the [editor]({{root_url}}/ui/sending-email/editor/) you want to use to create your template. \n1. Once you’ve finished creating your template, exit out of the editor and hover over the action menu next to the template and select **Create Single Send**.\n1. Add the “Day 1” list to your Single Send recipients by navigating to **Recipients**, and then selecting **Schedule**.  \n1. Click **Send Immediately** to change it to a day you'd like to begin the warmup. \n\nAfter you schedule your first send, you can navigate back to your template and repeat steps 3 and 4 above, making sure you update the list used for Day 2 and choose the next day in the scheduling menu. Repeat this process until you have a campaign for every single day in your warmup. \n\nCongrats! You’re all set to successfully warm up your new IP address with marketing mail!\n\n## Sending with multiple dedicated IPs \n\nIf you have multiple dedicated IPs, whether from your previous Email API package, your Advanced Marketing Campaigns plan, or from purchasing additional IPs, your Marketing Campaigns sends will be sent “round-robin” across all IPs on your account on a per-email basis. This means if you send a Single Send to 100 recipients, the 100 emails well send equally across each IP you have. \n\nIf you wish to send a Single Send or Automation email from a specific IP address, you can do so by creating an [IP Pool]({{root_url}}/ui/account-and-settings/ip-pools/). Once your IP Pool is created, you can select it as you draft your email by navigating to Settings, clicking the IP Pool drop-down, and selecting the IP pool you wish to use. \n\n<call-out type=\"warning\">\n\nTo optimize your IP reputation, we recommend you do not send your marketing and transactional (Email API) emails from the same IP. To avoid this, [create a subuser account]({{root_url}}/ui/account-and-settings/subusers/#create-a-subuser). \n\n</call-out>\n"
  },
  {
    "path": "content/docs/ui/sending-email/legacy-newsletter-sunset.md",
    "content": "---\nlayout: page\nweight: 100\ngroup: building-email\ntitle: Legacy Newsletter Sunset\nhideFeedback: false\nshowTitle: false\nbreadcrumbs: true\nnavigation:\n  show: false\nseo:\n  title: Legacy Newsletter Sunset\n  description: Assets to help you migrate from Legacy Newsletter to Marketing Campaigns\n---\n<header class=\"page-header\"><h1>Legacy Newsletter Sunset</h1></header>\n\n<call-out type=\"warning\">\n\nLegacy Newsletter has been retired.\n\n</call-out>\n\nYour email marketing needs can now be met by [Marketing Campaigns](https://sendgrid.com/solutions/email-marketing/), which offers a best in class editing experience,\ncontact segmentation for powerful targeting, and actionable analytics to help you measure and improve your results.\n\nReady to give Marketing Campaigns a try? You can upload your first [2,000 contacts](https://app.sendgrid.com/login?redirect_to=%2Fmarketing_campaigns%2Fui%2Fwelcome) for free today.\n\n<iframe src=\"https://player.vimeo.com/video/185514373\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n## \tAdditional Resources\n\n* [Marketing Campaigns Overview]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n* [Adding Contacts]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/)\n* [Segmenting your contacts]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/list-unsubscribe.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: List-Unsubscribe\ngroup: tracking\nseo:\n  title: List-Unsubscribe\n  description: Include the List-Unsubscribe header to provide your recipients with an unsbuscribe link next to the From address used to deliver mail.\n  keywords: unsubscribe, delivery, reputation, tracking\nnavigation:\n  show: true\n---\n\n[List-Unsubscribe](https://sendgrid.com/blog/list-unsubscribe/) is a small piece of text that can be inserted in the header section of your email. The List-Unsubscribe header will insert an “unsubscribe” button, or link, next to the From address at the top of your email. A recipient can click this link to notify you that they would like to unsubscribe from your emails.\n\n```json\n{\n  \"List-Unsubscribe\": \"<mailto:unsubscribeexampexample@example.com>, <http://www.unsubscribe.example.com/>\"\n}\n```\n\n![List-Unsubscribe Email Example]({{root_url}}/img/list_unsubscribe_1.png \"List-Unsubscribe Email Example\")\n\n<call-out type=\"warning\">\n\nIt is important to note that the list-unsubscribe header is not a complete replacement for the standard unsubscribe functionality that should be included in the body of your email. For more information on adding unsubscribe links to the body of your email, see our [Unsubscribe Groups documentation]({{root_url}}/ui/sending-email/unsubscribe-groups/).\n\n</call-out>\n\n### SendGrid’s Subscription Tracking\n\nIf you enable SendGrid’s [subscription tracking](https://app.sendgrid.com/settings/tracking) feature, SendGrid will automatically insert the List-Unsubscribe header in all of your text and HTML emails— placing an unsubscribe link in all of your emails.\n\nAlternatively, you can place the substitution tag [unsubscribe] anywhere in the body of your email to specify the exact location where you want the unsubscribe link to appear. You may customize this tag and the message inserted during the substitution. For more information, see our [subscription tracking documentation](https://sendgrid.com/docs/ui/account-and-settings/tracking/).\n\nIt is possible to use the List-Unsubscribe header even if you do not want to use subscription tracking. This is useful for users who want to provide their recipients an easy way to unsubscribe from their emails without relying on SendGrid’s tracking features. Continue reading below for an explanation of the List-Unsubscribe header, and how you can use it when sending email via SendGrid.\n\n## How does the List-Unsubscribe header work?\n\nThe List-Unsubscribe header provides two methods of unsubscribing users: an email unsubscribe, and a web unsubscribe. One, or both, of these methods may be used.\n\n### Email Unsubscribe: mailto\n\nThe mailto portion of the List-Unsubscribe header allows you to specify an email address that will receive the unsubscribe request. In other words, when a recipient clicks the “unsubscribe” link in your email, the recipient’s mail client will send an email to this address.\n\n**It is your responsibility to receive and process these generated emails**.\n\n### Web Unsubscribe: http\n\nThe http portion of the List-Unsubscribe header allows you to specify a URL that will receive a POST whenever someone clicks the unsubscribe link in your email.\n\n<call-out type=\"warning\">\n\nFailure to honor your recipients’ unsubscribe requests may do more than damage your sender reputation. To learn more about deliverability and compliance, see our [2019 Email Deliverability Guide](https://sendgrid.com/blog/sendgrids-2019-email-deliverability-guide/).\n\n</call-out>\n\n## Which method should I use?\n\nYou must include at least the **mailto** portion of the List-Unsubscribe header, since some services only support this portion (iOS, for example). However, many inbox providers and mail clients honor both methods. To ensure that the greatest number of your recipients have the ability to unsubscribe from your emails, thus protecting your reputation as a sender, we recommend including both **mailto** and **http**.\n\nNot honoring your recipients’ unsubscribe requests could not only harm your sender reputation, but could also violate legislation laid out in [CAN-SPAM](https://sendgrid.com/docs/glossary/can-spam/), [CASL](https://sendgrid.com/blog/canadian-anti-spam-law-need-know/), and other legislation. For more information about deliverability best practices and compliance, please visit our [Deliverability Overview](https://sendgrid.com/docs/ui/sending-email/deliverability/).\n\n## Examples\n\n### Using List-Unsubscribe with v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"example@example.com\"\n        }\n      ],\n      \"subject\": \"Your subject line here\"\n    }\n  ],\n  \"from\": {\n    \"email\": \"example@example.com\"\n  },\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello, World!\"\n    }\n  ],\n  \"headers\": {\n    \"List-Unsubscribe\": \"<mailto:unsubscribeexampexample@example.com>, <http://www.unsubscribe.example.com>\"\n  }\n}\n```\n\n### Using List-Unsubscribe with v2 Mail Send\n\n```\napi_user=your_sendgrid_username&\napi_key=your_sendgrid_password&\nto=destination@example.com&\ntoname=Destination&\nsubject=Example_Subject&\ntext=testingtextbody&\nfrom=info@domain.com&\n\"headers\": {\"List-Unsubscribe\": \"<mailto:unsubscribeexampexample@example.com>, <http://www.unsubscribe.example.com>\"}\n```\n\n### List-Unsubscribe with SMTP\n\n```json\n{\n  \"List-Unsubscribe\": \"<mailto:unsubscribeexampexample@example.com>, <http://www.unsubscribe.example.com/>\"\n}\n```\n"
  },
  {
    "path": "content/docs/ui/sending-email/migrating-from-legacy-marketing-campaigns.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Migrating from legacy Marketing Campaigns\ngroup: marketing-campaigns\nnavigation:\n  show: false\nseo:\n  title: Migrating from legacy Marketing Campaigns\n  keywords:\n  override:\n  description: Use this guide to migrate from legacy to the new Marketing Campaigns experience.\n---\n\n## What does Marketing Campaigns offer?\n\nThe new Marketing Campaigns builds on the existing, well-loved workflows for building, targeting, sending, and measuring email marketing campaigns with three new features: Automation, Email Testing, and Signup Forms.\n\n### Automation\n\nCreate a recurring email or series of emails that send automatically whenever a contact joins a list or segment. Choose when each email sends, and whether a contact should exit the automation if they no longer meet the entry criteria. [Learn More]({{root_url}}/ui/sending-email/getting-started-with-automation/).\n\n### Email Testing\n\nHave confidence your emails are flawless with integrated email testing. See how emails render across the inboxes, browsers, and device types that matter to your business, ensure links within your email are valid, and know how your email will perform against the most powerful spam filters. [Learn More]({{root_url}}/ui/sending-email/email-testing/).\n\n### Signup Forms\n\nCapture new signups and add them directly to your contacts in the new Marketing Campaigns. These forms can be embedded directly on your website or shared via a Twilio SendGrid-hosted URL. [Learn More]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#create-a-signup-form).\n\n### Familiar features and functionality from legacy\n\nThese new features build on the functionality you’re used to in legacy Marketing Campaigns. This means after a few migration steps, you’ll be up and running quickly thanks to familiar workflows you already know.\n\nAll features from legacy Marketing Campaigns will be carried over to Marketing Campaigns, though there are a few that will not be available immediately. You can track those items on our [coming soon to Marketing Campaigns page]({{root_url}}/ui/sending-email/coming-soon-to-new-marketing-campaigns/).\n\n<call-out>\n\nWhat you’re used to as “Campaigns” in legacy Marketing Campaigns is now called “Single Sends” in Marketing Campaigns.\n\n</call-out>\n\n## Why aren’t you migrating my account automatically?\n\nMarketing Campaigns has been re-built from the ground up on a new platform, which brings benefits like increased speed, scale, and stability. However, because it’s an entirely new product, it is not connected to the legacy Marketing Campaigns, and we’re not yet able to automatically move your assets and data.\n\nTo support you in migrating your legacy Marketing Campaigns account to Marketing Campaigns, we’re providing you with a billing grace period. During this grace period, you won’t be charged for legacy Marketing Campaigns contact storage. The grace period covers the month you upgrade to a Basic or Advanced package and 1 month after you upgrade.\n\n## Choosing a new Marketing Campaigns plan\n\n### How is the pricing different for the new plans?\n\n**Legacy Marketing Campaigns Pricing**\n\nWith the legacy offering, you selected a base Email API plan to cover all email sends whether via Email API or Marketing Campaigns. Next, you paid \\$10 per 10,000 contacts you **stored** in Marketing Campaigns.\n\nAny emails you sent using Marketing Campaigns were deducted from your base Email API plan allotment. If you sent over your plan allotment, you were charged overages per additional email.\n\n**New Marketing Campaigns Pricing**\n\nWith the new Marketing Campaigns, you choose a Marketing Campaigns package, either Basic or Advanced. Basic starts at $15/mo and Advanced starts at $60/mo.\n\nThe package includes an allotment of both contacts you can upload and emails you can send. If you send over your allotment of emails or **upload** more contacts you will be charged an additional fee per email or contact. **Deleting contacts does not reset the total count for contacts uploaded**.\n\nAny emails you send via new Marketing Campaigns are deducted from your Marketing Campaigns package, not from your Email API plan.\n\n### What are the new package options?\n\nThere are three new packages for Marketing Campaigns, Free, Basic, and Advanced. For complete pricing and feature detail, please visit our [pricing page](https://sendgrid.com/pricing/). To upgrade your current page, go to **Settings** and then select **Your Products**.\n\n<call-out>\n\nYou have access to the Free plan by default, allowing you to explore new Marketing Campaigns risk-free today!\n\n</call-out>\n\n**Free**\n\nTry it out! Send up to 6,000 emails to 2,000 contacts per month.\n\n- Automation\n- Single Sends for one-time campaigns\n- Segmentation\n- Ticket Support\n- 3 Email Testing Credits per month\n- 1 Signup Form\n\n**Basic**\n\nStarting at \\$15/month for 5,000 contacts and 15,000 email sends\n\n- Single Sends for one-time campaigns\n- Segmentation\n- Ticket, Chat & Phone Support\n- 10 Email Testing Credits per month with the option to purchase more\n- 5 Signup Forms\n- 1 Teammate\n- Access to Expert Services\n\n**Advanced**\n\nStarting at \\$60/month for 10,000 contacts and 50,000 email sends\n\n- Automation\n- Single Sends for one-time campaigns\n- Segmentation\n- Ticket, chat, and phone Support\n- 60 Email Testing Credits per month with the option to purchase more\n- 15 Signup Forms\n- 1,000 Teammates\n- Access to Expert Services\n- Subuser Management\n- Dedicated IP included; option to purchase more IPs\n\n### What should I consider in choosing a new package?\n\nTo decide the best package for your needs, Basic or Advanced, consider the features you’d like included in your Marketing Campaigns package, your historical usage with legacy Marketing Campaigns, and what access to add-ons you need.\n\n_Features you’d like to access_\n\nChoose **Advanced** if you’d like any of the following features. A complete summary of the feature set for each Marketing Campaigns package can be found on [our pricing page](https://sendgrid.com/pricing/).\n\n- Automation\n- Greater allotment of monthly Email Testing credits\n- Greater allotment of Signup Forms\n- Dedicated IPs\\*\n- Greater allotment of Teammates\\*\n- Ability to create or manage subusers\\*\n\n<call-out>\n\n\\*These features are also available on the Pro and Premier Email API packages. If you have access via your Email API package, you can also use these features for your Marketing Campaigns sending.\n\n</call-out>\n\nChoose **Basic** if following features meet your needs. A complete summary of the feature set for each Marketing Campaigns package can be found on [our pricing page](https://sendgrid.com/pricing/).\n\n- Single Sends for one-time campaigns\n- Ticket, Chat, and Phone Support\n- 10 Email Testing Credits per month with the option to purchase more\n- 5 Signup Forms\n- 1 Teammate\n- Access to Expert Services\n\n_Historical usage_\n\nReview how many contacts you store in legacy Marketing Campaigns as a starting point, then consider if or how you may grow your audience. Do the same for in considering your legacy Marketing Campaigns sending volume by adding up the number of delivered emails across your campaigns. Remember, the new Marketing Campaigns packages also include email sends, so if you only send via Marketing Campaigns, you’ll potentially no longer need to subscribe to an Email API plan.\n\n<call-out type=\"warning\">\n\n**Please note:** Downgrading from a paid Basic or Advanced Marketing Campaigns plan to a Free account will permanently delete all contacts associated with that account. You will need to reimport any contacts that you would like to use with your Free account.\n\n</call-out>\n\n_Add-ons you need_\n\nThere are some add-ons that are only available with certain package types.\n**Additional dedicated IPs** can only be purchased if you have either a Pro or Premier Email API plan or an Advanced Marketing Campaigns plan.\n**Email Activity Feed** is only available if you’re on a paid Email API plan.\n\n### Do I need to change my Email API plan?\n\nYou don’t need to change your Email API plan. However, depending on your feature needs and usage, it may make sense to review your plan and make an adjustment. To start, consider how many emails you typically send through Email API vs. Marketing Campaigns when making your decision.\n\n_Example_:\n\nYou currently have a **Pro 300K Email API plan** and store **45,000 contacts** in Marketing Campaigns. **Net cost is \\$369.00** ($249.00 + $120).\n\nIn an average month, you send 90,000 emails via Email API, and 150,000 emails through Marketing Campaigns.\n\nYou want to use the new Advanced Marketing Campaigns features, including Automation.\n\nIn this scenario, you might choose to change your Email API plan to **Pro 100K** and choose the **Marketing Campaigns Advanced 50K plan. Net cost will be \\$339.95** ($89.95 + $250). You can send 100,000 emails via Email API and 250,000 emails using Marketing Campaigns.\n\n## How do I upgrade my Marketing Campaigns plan?\n\n1. Navigate to **Settings**, click **Account Details**, and then **Your Products**.\n1. Review your current plan details as well as your usage this month. It’s helpful to have a sense of how many emails you’re sending and how many contacts you store.\n\n<call-out>\n\nYou can review prior usage by navigating to **Invoices** under **Plan & Billing**, and checking your invoices there. Take a look at [Reading your Invoice]({{root_url}}/ui/account-and-settings/reading-your-invoice/) to learn more about reading and understanding your invoices.\n\n</call-out>\n\n3. Click **Upgrade Plan** to choose your new Marketing Campaigns plan.\n4. By default, your plan will be Free 2K. To select a new plan, start by deciding whether you want Basic or Advanced features.\n5. Next, choose the right tier of contact storage and volume of emails that you’ll send using Marketing Campaigns in a given month.\n\n<call-out>\n\nNeed a higher tier of contact storage or email volume? Simply scroll to the bottom of the page to request custom pricing. Today, we support storing up to 1M contacts.\n\n</call-out>\n\n6. Click **Select** to review your plan choice. You’ll see your new Marketing Campaigns plan monthly price, as well as the prorated price you’ll pay for the current month.\n7. Click **Confirm**.\n\n<call-out>\n\nNo change will be made to your legacy Marketing Campaigns account as a result of buying a new Marketing Campaigns package. You'll have **through** the next complete month to migrate your account to avoid being charged for both versions, as outlined below.\n\n</call-out>\n\nTo support your migration effort, you’ll have a billing grace period through the next complete billing cycle to migrate your contacts from legacy Marketing Campaigns to new Marketing Campaigns. During this grace period, which **includes the month you upgrade and the month following your upgrade**, you will not be charged for contact storage in legacy Marketing Campaigns.\n\n<call-out type=\"warning\">\n\nIf you have more than 2,000 contacts in legacy Marketing Campaigns at the end of the billing grace period, you’ll be charged \\$10 per 10,000 legacy Marketing Campaigns contacts moving forward.\n\n</call-out>\n\n## Migrate your contacts\n\nYou can choose to migrate all of your contacts to new Marketing Campaigns, or you can migrate specific lists and segments. You can do this via the UI by exporting from legacy and importing to new Marketing Campaigns or you can use the Contact Management APIs.\n\nWhile you can download the contacts who are on a segment at the time you export and add them to All Contacts or a list, you cannot migrate the segment logic you’ve built. You’ll need to re-create [segments]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/) you’d like to use in new Marketing Campaigns.\n\n_Migrate contacts using the UI_:\n\n1. Navigate to **Contacts** in legacy Marketing Campaigns.\n1. Find the list or segment of contacts you wish to export.\n1. Hover over the action menu and select the **Export** icon.\n1. Once the export is completed, a download link will be sent to the email(s) you either signed up with, or have set to receive [notifications]({{root_url}}/ui/account-and-settings/notifications/).\n1. Navigate to **Contacts** in new Marketing Campaigns.\n\n<call-out>\n\nBefore uploading your CSV, make sure it is formatted correctly by comparing it to this [template]({{root_url}}/assets/example.csv).\n\n</call-out>\n\n6. Click **Add Contacts** and then select **Upload CSV**.\n7. Choose whether to add your contacts to All Contacts, to an existing list, or to a new list you create.\n8. Upload your CSV file by dragging it into or clicking the CSV upload area.\n   Make sure all of the column headers you wish to import are mapped to custom fields.\n\n<call-out>\n\nIf there are any column headers you have not made custom fields for yet, you can click on **Select a Field**, and then scroll down the drop-down menu and click **Create New** [**Custom Field**]({{root_url}}/ui/sending-email/custom-fields/).\n\n</call-out>\n\n9. Once the CSV file has finished processing, a download link will be sent to the email(s) you either signed up with, or have set to receive [notifications]({{root_url}}/ui/account-and-settings/notifications/).\n\n<call-out type=\"warning\">\n\nIf you add contacts to any lists being used as the entry criteria for a live [automation]({{root_url}}/ui/sending-email/getting-started-with-automation/), all contacts you add to that list will be entered into the automation.\n\nIf you add contacts to a list that you’d like to use as the entry criteria for an Automation in the future, note that the automation will only trigger to contacts who are added to the entry criteria list _after_ you set the automation live.\n\n</call-out>\n\n10. Once you have migrated your contacts to the new Marketing Campaigns, please [delete your contacts from the legacy Marketing Camapigns]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#delete-all-contacts) to ensure you are no longer charged for contact storage in legacy Marketing Campaigns.\n\n## Migrate your content\n\nYou may have pre-existing images, templates, or campaigns that you’d like to re-use in Marketing Campaigns. You can transfer your assets into new Marketing Campaigns by following the steps below.\n\n### Templates\n\n1. Navigate to **Templates** in legacy Marketing Campaigns.\n1. Select **Custom**.\n1. Locate the template you wish to transfer into new Marketing Campaigns.\n1. Click the action menu and then select **Export HTML**. The template HTML instantly downloads to the folder specified on your computer.\n\n<call-out type=\"warning\">\n\nImages embedded in your templates or past campaigns will continue to populate from your legacy Marketing Campaigns image library. To ensure no images break in the future when legacy Marketing Campaigns is deprecated, consider updating links to pull images from your new Marketing Campaigns image library.\n\n</call-out>\n\n5. Navigate to **Design Library** in new Marketing Campaigns and select **Your Email Designs**.\n6. Click **Create Email Design**, and then select either the **Design Editor** or the **Code Editor**.\n7. If you’re using the **Design Editor**, navigate to **Build**, select **Advanced** and then click **Import Drag & Drop HTML**. If you’re using the **Code Editor**, paste in the HTML into the HTML editor.\n\n<call-out>\n\nSwitching from a template made in the Code Editor into a Design Editor can cause some unwanted changes. Sticking to the editor you started with can help keep this transfer smooth and prevent any formatting issues.\n\n</call-out>\n\n8. Paste the HTML you copied from the downloaded file into the code editor and then click **Save** if you are using the **Code Editor**. Click **Update** and then **Save** if you are using the **Design Editor** .\n\nMake sure that you are using the new [substitution tags]({{root_url}}/ui/sending-email/editor/#using-substitution-tags). For example, instead of using `[%first_name%]`, you will now use `{{first_name}}`.\n\n![]({{root_url}}/img/substitution-tag-comparison.png 'substitution tag comparison')\n\n<call-out>\n\nMake sure that your unsubscribe tags and groups are also up to date. You can learn more about how to format these tags [here]({{root_url}}/ui/sending-email/create-and-manage-unsubscribe-groups/).\n\n</call-out>\n\n### Campaign designs\n\nYou may have email designs from campaigns that you’d like to re-use in new Marketing Campaigns that aren’t saved as a standalone template. You can do so by exporting the email content from these campaigns and importing them as a template in new Marketing Campaigns.\n\n_To navigate your campaign designs_:\n\n1. Navigate to **Campaigns** in legacy Marketing Campaigns.\n   1 Locate the campaign you wish to migrate and hover over the action menu until the icons appear. Select the **Export HTML** icon. The campaign HTML downloads to the folder specified on your computer.\n1. Navigate to the Automation or Single Sends dashboard.\n1. Click into the Automation you want to edit and find the email you want to add the exported HTML to. For Single Sends, click directly into the email you want to add the exported HTML to.\n1. Hover over the action menu and select **Add Email Content**.\n1. Select **Blank Template**.\n1. Select either the **Code Editor** or **Design Editor**.\n1. If you’re using the **Design Editor**, navigate to **Build**, select **Advanced** and then click **Import Drag & Drop HTML**. If you’re using the **Code Editor**, paste in the HTML.\n1. Paste the HTML you copied from the downloaded file into the code editor and then click **Save** if you are using the **Code Editor** and **Update** and then **Save** if you are using the **Design Editor** .\n\n<call-out>\n\nCalled Campaigns in legacy Newsletter, Single Sends is the new name for one-time, targeted marketing emails.\n\n</call-out>\n\n### Images\n\nExporting images from your library is a manual process at this time, so we recommend only following the steps below for images that you don’t have saved elsewhere. For images you want to download from legacy Marketing Campaigns, you’ll start by accessing your image library. Start by navigating to the editor either from Templates or from a draft campaign. Select your editor of choice, then follow the instructions below:\n\n**Design Editor:**\n\n_To export your images_:\n\n1. From the **Design Editor**,Open the **Build** tab, then select **Add Modules** and drag an image module into your content.\n1. Find an image you’d like to export and select it. This will open the Image Details tab.\n1. Copy the Image Source URL and paste it into a browser window, then right click on the image to save it locally to your computer. You can then upload the image you’d like to add to your new draft by following [these steps]({{root_url}}/ui/sending-email/editor/#uploading-images).\n\n**Code Editor:**\n\n_To export your images_:\n\n1. From the **Code Editor**, click the image icon in the top right corner of the code window to pull up the image library.\n1. Find an image you’d like to export, and then copy the Image Source URL and paste it into a browser window.\n1. Right click on the image to save it locally to your computer.\n1. You can then upload the image you’d like to add to your new draft by following [these steps]({{root_url}}/ui/sending-email/editor/#adding-images).\n\n## Update API Keys and Teammates\n\nAs a separate product, you'll need to add permissions for new Marketing Campaigns to any API Keys or Teammates who you'd like to have access to new Marketing Campaigns.\n\n### API Keys\n\n1. Click on **Settings** in the lefthand navigation, and then **API Keys**.\n1. Select the API key (or keys) that you'd like to add Marketing permissions to.\n1. Click the action menu and select Edit API Key.\n1. Select the **Marketing** dropdown and enable the **Marketing** and/or **Automation** toggles, granting permission.\n1. Click Update to save your changes.\n\n### Teammates\n\n1. Click on **Settings** in the lefthand navigation, and then **Teammates**.\n1. Find the Teammate (or teammates) whom you'd like to give new Marketing Campaigns permissions to.\n1. Click the action menu and select Edit.\n1. If the radio button for \"Invite as Admin\" is selected, the Teammate already has access to new Marketing Campaigns.\n1. If not, and to enable feature-specific access, including new Marketing Campaigns Single Sends and/or Automation, click \"Invite as Restricted Access\".\n1. Select the **Marketing** dropdown and enable the **Marketing** and/or **Automation** toggles, granting permission.\n1. Click Update to save your changes.\n\n## Create notifications\n\nNotifications are not carried over from legacy to new Marketing Campaigns. Please designate which email addresses you’d like to be alerted to any new Marketing Campaigns activity such as CSV uploads, etc.\n\n1. Navigate to **Notifications** in new Marketing Campaigns and then click **Add Email**.\n1. Enter the name and email of the person or account who you want to receive any notification emails.\n1. Click **Save**. The name and email will display on the **Notifications** page.\n\n## Review Senders and Unsubscribe Groups\n\nSenders and Unsubscribe Groups are carried over from legacy Marketing Campaigns. You don’t need to make any changes, but now is a good opportunity to make any adjustments you’ve had in mind.\n\n## Export data you wish to reference\n\nData and statistics are not carried over from legacy to new Marketing Campaigns. You can choose to export and save data for your reference in the future.\n\n<call-out type=\"warning\">\n\nYou will have access to legacy Marketing Campaigns for a period of time allowing you to reference past campaign creative and stats. However, you’ll need to delete your contacts from legacy Marketing Campaigns to avoid being charged for contact storage.\n\n</call-out>\n\n### Campaign Stats\n\n_To download aggregate stats for a given campaign_:\n\n1. Navigate to **Campaigns** in legacy Marketing Campaigns.\n1. Select the campaign name you wish to export your data from.\n1. Click **Export CSV** in the upper right corner. A CSV file containing your data will download to the folder specified on your computer.\n\n_To download a list of all contacts who opened or clicked links within your campaign_:\n\n1. Navigate to **Campaigns** in legacy Marketing Campaigns.\n1. Find the Campaign you wish to export your data from, and click the linked **Unique Opens** or **Unique Clicks** data.\n\n![]({{root_url}}/img/unique-clicks-data.png)\n\n3. Click **Export CSV** in the upper right corner. A CSV file containing your data will download to the folder specified on your computer.\n   Once the CSV file has finished processing, a link to download the CSV will be sent to the email(s) you have set to receive notifications about new Marketing Campaigns activity.\n\n### Contact Engagement History\n\nTo download data about individual contacts, including when they were last sent an email, and when they last opened or clicked an email:\n\n1. Navigate to **Contacts** in legacy Marketing Campaigns.\n1. Find the list or segment of contacts you wish to export.\n1. Hover over the action menu and select the **Export** icon.\n1. Once the export is completed, a download link will be sent to the email(s) you have specified to receive [notifications]({{root_url}}/ui/account-and-settings/notifications/) about legacy Marketing Campaigns.\n\n## Updating integrations to the new Marketing Campaigns APIs\n\nLike legacy Marketing Campaigns, the new Marketing Campaigns experience offers APIs so you can programmatically manage your marketing emails. Today, you can manage contacts and Single Sends, with additional APIs for Segmentation and Automation [coming soon]({{root_url}}/ui/sending-email/coming-soon-to-new-marketing-campaigns/).\n\nTake a look at the table below for links to the API reference pages for legacy and new Marketing Campaigns respectively. The third column describes the action required to update your integrations from legacy to new Marketing Campaigns\n\n### Updating Campaign API integrations\n\n<table>\n  <tr>\n    <th><span style=\"font-weight:bold\">Legacy Marketing Campaigns</span></th>\n    <th><span style=\"font-weight:bold\">New Marketing Campaigns</span></th>\n    <th><span style=\"font-weight:bold\">Action Required</span></th>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/create-a-campaign\">Create a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/create-single-send\">Create Single Send</a></td>\n    <td><li>Update endpoint</li><br><li>New Marketing Campaigns requires template ID as opposed to explicitly defined HTML content</li><br><li>Duplication of past campaigns is possible with a 'source' query string</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/retrieve-all-campaigns\">Retrieve all Campaigns</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/get-all-single-sends\">Get All Single Sends</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/retrieve-a-single-campaign\">Retrieve a single campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/get-single-sends-by-id\">Get Single Send by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/delete-a-campaign\">Delete a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/delete-single-sends-by-id\">Delete Single Send by ID</a><br><br>NEW <a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/bulk-delete-single-sends\">Bulk Delete Single Sends</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/update-a-campaign\">Update a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/update-single-send\">Update Single Send</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/send-a-campaign\">Send a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/schedule-campaign\">Schedule Single Send</a></td>\n    <td><li>Update endpoint and HTTP verb</li><br><li>To send immediately set \"send_at\" set to \"now\"</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/schedule-a-campaign\">Schedule a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/schedule-campaign\">Schedule Single Send</a></td>\n    <td><li>Update endpoint</li><br><li>Send at time now in ISO 8601 as opposed to a UNIX timestamp</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/update-a-scheduled-campaign\">Update a Scheduled Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/schedule-campaign\">Schedule Single Send</a></td>\n    <td><li>Update endpoint and HTTP verb</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/view-scheduled-time-of-a-campaign\">View Scheduled Time of a Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/get-single-sends-by-id\">Get Single Send by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/campaigns-api/unschedule-a-scheduled-campaign\">Unschedule a Scheduled Campaign</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/single-sends/delete-single-send-schedule\">Delete Single Send Schedule</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n</table>\n\n### Updating Contacts API integrations\n\n<table>\n  <tr>\n    <th><span style=\"font-weight:bold\">Legacy Marketing Campaigns</span></th>\n    <th><span style=\"font-weight:bold\">New Marketing Campaigns</span></th>\n    <th><span style=\"font-weight:bold\">Action Required</span></th>\n  </tr>\n  <tr>\n    <td></td>\n    <td><span style=\"font-weight:bold\">Lists</span></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/create-a-list\">Create a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/create-list\">Create List</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/retrieve-all-lists\">Retrieve all Lists</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/get-all-lists\">Get All Lists</a></td>\n    <td><li>Update endpoints</li><br><li>'page_token' new method of pagination</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/delete-multiple-lists\">Delete Multiple Lists</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/delete-a-list\">Delete a List</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/retrieve-a-single-list\">Retrieve a Single List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/get-a-list-by-id\">Get a List by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/update-a-list\">Update a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/update-list\">Update List</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/delete-a-list\">Delete a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/delete-a-list\">Delete a List</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/retrieve-all-recipients-on-a-list\">Retrieve all Recipients on a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-all-contacts\">Get All Contacts</a></td>\n    <td><li>Update endpoint<br><li>List(s) a contact is on returns in Get All Contacts call</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/add-a-single-recipient-to-a-list\">Add a Single Recipient to a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact\">Add or Update a Contact</a></td>\n    <td><li>Update endpoint and HTTP verb<br><li>List ID(s) added in JSON payload</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/delete-a-single-recipient-from-a-single-list\">Delete a Single Recipient from a Single List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/lists/remove-contacts-from-a-list\">Remove Contacts from a List</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-lists/add-multiple-recipients-to-a-list\">Add Multiple Recipients to a List</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact\">Add or Update a Contact</a></td>\n    <td><li>Update endpoint and HTTP verb</li><br><li>List ID(s) added in JSON payload</li></td>\n  </tr>\n  <tr>\n    <td></td>\n    <td><span style=\"font-weight:bold\">Recipients</span></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/add-recipients\">Add Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact\">Add or Update a Contact</a></td>\n    <td><li>Update endpoint and HTTP verb</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/get-recipient-upload-status\">Get Recipient Upload Status</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/import-contacts-status\">Import Contact Status</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/update-recipient\">Update Recipient</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact\">Add or Update a Contact</a></td>\n    <td><li>Update endpoint and HTTP verb</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/delete-recipients\">Delete Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/delete-contacts\">Delete Contacts</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/retrieve-recipients\">Retrieve Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-all-contacts\">Get All Contacts</a></td>\n    <td><li>Update endpoint</li><br><li>'page_token' new method of pagination</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/retrieve-a-single-recipient\">Retrieve a Single Recipient</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-a-contact-by-id\">Get a Contact by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/delete-a-recipient\">Delete a Recipient</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/delete-contacts\">Delete Contacts</a></td>\n    <td><li>Update endpoint</li><br><li>Contact ID passed in JSON payload</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/retrieve-the-lists-that-a-recipient-is-on\">Retrieve the Lists that a Recipient is on</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-a-contact-by-id\">Get a Contact by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/retrieve-the-count-of-billable-recipients\">Retrieve the Count of billable Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-total-contact-count\">Get Total Contact Count</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/retrieve-a-count-of-recipients\">Retrieve a Count of Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/get-total-contact-count\">Get Total Contact Count</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-recipients/Create_Search%20with%20conditions\">Search Recipients</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts/search-contacts\">Search Contacts</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td></td>\n    <td><span style=\"font-weight:bold\">Custom Fields</span></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-custom-fields/create-a-custom-field\">Create a Custom Field</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/create-custom-field-definition\">Create Custom Field Definition</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-custom-fields/retrieve-all-custom-fields\">Retrieve all Custom Fields</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/get-all-field-definitions\">Get All Field Definitions</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-custom-fields/retrieve-a-custom-field\">Retrieve a Custom Field</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/get-all-field-definitions\">Get All Field Definitions</a><br><br>NEW <a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/update-custom-field-definition\">Update Custom Field Definition</a><br></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-custom-fields/delete-a-custom-field\">Delete a Custom Field</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/delete-custom-field-definition\">Delete Custom Field Definition</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-custom-fields/retrieve-reserved-fields\">Retrieve Reserved Fields</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/custom-fields/get-all-field-definitions\">Get All Field Definitions</a></td>\n    <td><li>Update endpoint</li><br><li>Reserved fields defined in array \"reserved_fields\"</li></td>\n  </tr>\n  <tr>\n    <td></td>\n    <td><span style=\"font-weight:bold\">Segments</span></td>\n    <td></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/create-a-segment\">Create a Segment</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/segments/create-segment\">Create Segment</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/retrieve-all-segments\">Retrieve all Segments</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/segments/get-list-of-segments\">Get List of Segments</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/retrieve-a-segment\">Retrieve a Segment</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/segments/get-segment-by-id\">Get Segment by ID</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/update-a-segment\">Update a Segment</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/segments/update-segment\">Update Segment</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/delete-a-segment\">Delete a Segment</a></td>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/segments/delete-segment\">Delete Segment</a></td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n  <tr>\n    <td><a href=\"https://sendgrid.api-docs.io/v3.0/contacts-api-segments/retrieve-recipients-on-a-segment\">Retrieve Recipients on a Segment</a></td>\n    <td>Coming soon</td>\n    <td><li>Update endpoint</li></td>\n  </tr>\n</table>\n\n## Using the APIs to migrate contacts and content to new Marketing Campaigns\n\nYou can leverage the APIs to programmatically manage much of your migration to new Marketing Campaigns by following the guidance below.\n\n### Contacts\n\n**Recreate Lists**\n\nUse the legacy Marketing Campaigns API call [Retrieve all Lists](https://sendgrid.api-docs.io/v3.0/contacts-api-lists/retrieve-all-lists) to determine the list names to recreate in the new Marketing Campaigns. Then, use new Marketing Campaigns API call [Create List](https://sendgrid.api-docs.io/v3.0/lists/create-list) in the new experience. The values this call returns, particularly `‘id’`, are necessary for the recipient migration API.\n\n**Recreate Custom Fields**\n\nUse the legacy Marketing Campaigns API call to [Retrieve all Custom Fields](https://sendgrid.api-docs.io/v3.0/contactdb/custom_field) to determine the custom field necessary to recreate in new Marketing Campaigns. Use new Marketing Campaigns API call to create [Custom Field](https://sendgrid.api-docs.io/v3.0/custom-fields/create-custom-field-definition) in the new Marketing Campaigns API. Pass in the corresponding `‘name’` and `‘field_type’` from the legacy Marketing Campaigns GET call. The values this call returns, particularly `‘id’`, are necessary for the recipient migration API.\n\n**Migrate Recipients**\n\nUse the legacy Marketing Campaigns API call to [Retrieve all Recipients](https://sendgrid.api-docs.io/v3.0/contactdb/recipients) to recreate in new Marketing Campaigns. We recommend using pagination and iterating through all of the pages until you receive a `404 ‘no pages’` error. You will receive a response to return all contacts. The values this call returns, particularly `‘id’`, will be necessary for the recipient migration API. Iterate through all the recipients to get lists this recipient is on. Store the list(s) you wish to add your recipients onto in the new Marketing Campaigns, otherwise, recipients will add onto `‘All Contacts’` by default. Custom Field values and list(s) a recipient is on uses this data and calls [add contacts](https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact) to the new experience. It is important to note:\n\n1. Custom Fields pass as an object with key value pairs as\n\n   `{ “id_1” : “value_1”, “id_2” : “value_2” }`\n\n   and **not** as the name of the new Marketing Campaigns Custom Field.\n\n2. This call allows for batching of recipients. It is recommended to add at least 1,000 recipients per API request.\n3. You can omit `‘list_ids’` if your recipient is not uploaded to any lists, as it is optional.\n\n## FAQs\n\n**What happens if I choose not to migrate?**\n\nNothing will happen to your legacy Marketing Campaigns account until the product is discontinued. At this time, no date has been set for the deprecation of Legacy Marketing Campaigns.\n\n**How long will legacy Marketing Campaigns be available?**\n\nAt this time no date has been set for the deprecation of Legacy Marketing Campaigns. If and when this occurs, we will be sure to communicate this news well in advance to ensure you have time to plan accordingly.\n\n**Once I’ve switched to new Marketing Campaigns, can I go back to using legacy Marketing Campaigns?**\n\nYes, you can choose to upload contacts to legacy Marketing Campaigns and keep using it until the product is deprecated. At this time, there is no planned date to deprecate legacy Marketing Campaigns. Note, if you did not use legacy Marketing Campaigns prior to the launch of new Marketing Campaigns, you’ll need to speak to Support to gain access.\n\n**What is the additional value of the new Marketing Campaigns vs. the legacy product?**\n\nMoving forward, all innovation for our marketing platform will happen on new Marketing Campaigns, so it’s important you migrate to see these benefits over time.\n\nIn addition to offering faster performance, increased scale, and improved stability, the new Marketing Campaigns also offers net-new functionality.\n\n_Automation_\n\nCreate a recurring email or series of emails that send automatically whenever a contact joins a list. Choose when each email sends, and whether a contact should exit the automation if they no longer meet the entry criteria. [Learn More]({{root_url}}/ui/sending-email/getting-started-with-automation/).\n\n_Email Testing_\n\nHave confidence your emails are flawless with integrated email testing. See how emails render across the inboxes, browsers, and device types that matter to your business, ensure links within your email are valid and know how your email will perform against the most powerful spam filters. [Learn more]({{root_url}}/ui/sending-email/email-testing/).\n\n_Signup Forms_\n\nCapture new signups and add them directly to your new Marketing Campaigns contacts. These forms can be embedded directly on your website or shared via a Twilio SendGrid-hosted URL. [Learn more]({{root_url}}/ui/managing-contacts/create-and-manage-contacts/#create-a-signup-form).\n\n_Familiar features and functionality from legacy_\n\nThese new features build on the functionality you’re used to in legacy Marketing Campaigns. This means after a few simple migration steps, you’ll be up and running quickly thanks to familiar workflows you already know.\n\n**Can I try the new Marketing Campaigns for free?**\n\nYes! By default, you have access to the new Marketing Campaigns Free package in your account. It gives you access to all features, including Automation, so you can test fully. If you do not see the new Marketing Campaigns in your account, please contact support as you may need to make a change to your account due to an outdated plan type.\n\n**What happens to my legacy Marketing Campaigns account if I try new Marketing Campaigns?**\n\nThere is no impact to your legacy Marketing Campaigns account by testing or upgrading to new Marketing Campaigns. When you upgrade to either the new Basic or Advanced package, you’ll be given a grace period to support your migration from legacy to new Marketing Campaigns. During this time, you will not be charged for contact storage in legacy Marketing Campaigns.\n\nOnce the grace period has ended, you’ll be charged for any contacts over the free allotment of 2,000 in your legacy Marketing Campaigns storage.\n\n**I don’t see the new Marketing Campaigns in my account. What should I do?**\n\nIf you do not see the new Marketing Campaigns in your account, please contact support to troubleshoot why you do not have access.\n\n**I have more than 200,000 contacts. What should I do?**\n\nTo purchase a new Marketing Campaigns package above the Advanced 200K plan, please [contact our sales team](https://sendgrid.com/contact-us-form/).\n\n**Are there services to help me with migration?**\n\nYes. There is a paid service where our experts will help get you quickly and successfully migrated to the new Marketing Campaigns. They’ll review your email marketing program, provide migration support, and teach you what you need to know to hit the ground running with the new Marketing Campaigns. [Learn more about this migration service](https://go.sendgrid.com/Marketing-Campaigns-Launch.html).\n\n**I have dedicated IP(s) I’ve already warmed up. What happens to them?**\n\nNo changes will be made to your existing dedicated IPs unless you lose access by downgrading your Email API plan to Essentials or Free. If you choose an Advanced Marketing Campaigns plan, you’ll be granted a new, additional dedicated IP address. This will need to be [warmed up]({{root_url}}/ui/sending-email/ip-warmup-for-the-new-marketing-campaigns-experience/) to ensure a positive sender reputation.\n\nEmail that you send from new Marketing Campaigns will be sent across all dedicated IPs you have for your account or subuser. You can choose to assign specific IPs to individual [subusers]({{root_url}}/ui/account-and-settings/subusers/#adding-subusers-to-dedicated-ip-addresses) to segment your sending across specific IP addresses.\n"
  },
  {
    "path": "content/docs/ui/sending-email/migrating-from-legacy-templates.md",
    "content": "---\nlayout: page\nweight: 90\ngroup: transactional-email\ntitle: Migrating from Legacy Transactional Templates\nnavigation:\n  show: true\nseo:\n  title: Migrating from Legacy Transactional Templates\n  override: true\n  description: Migrating from legacy transactional templates to dynamic transactional templates utilizing handlebars syntax.\n  keywords: transactional email templates, email template, dynamic content, personalization, handlebars\n---\n\nIf you have transactional templates you want to use with handlebars syntax, you need to migrate your legacy templates to the new dynamic templates page.\n\n<call-out>\n\nThe original template you copy won't be modified and remains active in any API or SMTP calls. To use the new template, update the template ID parameter in your code.\n\n</call-out>\n\n*To convert a legacy transactional template:*\n\n1. Navigate to the [legacy templates](https://sendgrid.com/templates) page.\n1. Create a version of the template you wish to migrate or select the actions menu on the template version and select **Edit**. The template opens in the editor and a green banner appears at the top of the page specifying that the template you are editing is a legacy template.\n1. Select **Copy as New Template**.\n1. Give the template a new name and click **Copy as New Template**.\n1. Once the template is successfully copied over, click **Continue**. The template opens in the editor and you are prompted to replace any existing substitution tags with handlebars syntax.\n1. To replace any existing substitution tags, click **Replace your substitution tags**.\n1. Enter the opening and closing characters of your substitution tags and click **Replace**.\n1. The module replaces all of the substitution tags in your template with handlebars.\n   For example,{{your_tag_here}}.\n\n## Additional resources\n\n- [How to send an email with dynamic transactional templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)\n- [Using handlebars]({{root_url}}/ui/sending-email/using-handlebars/)\n- [Mail send with dynamic transactional templates](https://sendgrid.api-docs.io/v3.0/transactional-templates/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/old-editor-sunset.md",
    "content": "---\nlayout: page\nweight: 11\ngroup: building-email\ntitle: Old Editor Sunset\nnavigation:\n  show: false\nseo:\n  title: Marketing Campaigns - Old Editor Sunset\n  override: true\n  description: On 16 April 2018, the old Marketing Campaigns editor is going away.\n---\n<call-out type=\"warning\">\n\nOn 16 April 2018, SendGrid will be discontinuing the old Marketing Campaigns editor. At that time, all campaigns will be opened and edited in the powerful new Marketing Campaigns experience.\n\nSome maintenance may be required when moving an old campaign in the new editor for the first time. We strongly encourage you to move any remaining campaigns into the new editor by 16 April, 2018 to ensure your sending is not interrupted when the deprecation occurs.\n\n</call-out>\n\n## \tAdditional Details\n\n ### \tWhy is the old editor going away?\n\nMarketing Campaigns was built to empower Marketers to send beautiful messages that recipients love. In August 2017, SendGrid announced a [new, updated editing experience for Marketing Campaigns]({{root_url}}/ui/sending-email/editor/). The new experience was built on the success of the old editor and is focused on supporting your unique worflow. Since August, thousands of users have discovered the power, flexibility, and speed of the new editors.\n\nThe new Marketing Campaigns editors offer a markedly better experience for crafting email campaigns. They feature increased stability, more powerful features, and a streamlined, flexible workflow that saves time. With the vast majority of users already taking advantage of the new experience, our team is dedicated to investing fully in the new Marketing Campaigns editors going forward.\n\n ### \tHow do I know if I'm using the old or new editor?\n\nIt’s likely that you’re already using the new Marketing Campaigns editing experience. Since August 2017, the only way to still access the old editor has been to duplicate a campaign that was originally created in that editor. If you’re using the old editor, you will notice a bar at the top of the screen that tells you that you’re in the old experience.\n\n ### \tI am still using the old editor. What do I need to do?\n\nUntil 16 April 2018, if you duplicate a campaign that was originally created within the old editor, you will notice an alert banner at the top of the app. You can click the button within the alert to begin moving your campaign into the new editing experience.\n\nOn 16 April 2018, if you duplicate a campaign that was originally created within the old editor, it will require you to open the campaign in one of the [new editors]({{root_url}}/ui/sending-email/editor/). While many campaigns will move over seamlessly, it’s possible that – depending how you’ve edited your campaign in the past – you’ll need to make a few tweaks or take a few moments to rebuild a template in the new editor. Rest assured, creating templates in the new editor is quick and easy – in most cases, taking only a few minutes. That said, if you have any issues at all, our [support team is available](https://support.sendgrid.com/)!\n\n ### \tI use both Design and Code. Why do I need to choose one?\n\nGood news! If you like to build your campaigns visually, but like to roll up your sleeves to edit some code to make it perfect, the Design Editor will a great option for you. While it's called the \"Design Editor,\" this experience still features a number ways to access and edit HTML. Each visual drag and drop module in the new builder features one-click access to your HTML content. To access, click the action menu at the top of the blue bar in each drag-and-drop module and then select the `< >` icon to get to your code. Learn more about the [new editing experience]({{root_url}}/ui/sending-email/editor/).\n\n<call-out>\n\nIf you’ve edited code in your current template but want to use it with the new visual, drag and drop editor, you will need to add our [Drag-&-Drop Markup]({{root_url}}/ui/sending-email/editor/#importing-custom-html-with-drag--drop-markup).\n\n</call-out>\n\n ### \tI moved my campaign to the new editor, but something looks weird.\n\nDepending on how you created and edited your campaign in the old experience, some maintenance may be required when moving an old campaign in a new editor for the first time. This is due to some improvements that we made with the new experience – particularly around how HTML is handled and protected.\n\nWhile these improvements offer far greater stability and speed for the long term, we know that these initial changes can be a bit frustrating. To help, we've identified 2 possible scenarios when migrating a campaign into the new editor, with some details on how to resolve these issues, below:\n\n**I have a custom coded template, but want to use the Design Editor:**\n<br>If you get custom code from your designer or developer and want to use it with our powerful new drag-and-drop Design editor, you can! First, our Design editor needs to be able to understand what kind of content blocks are in your email, and how it should group your content. To do this, you (or your developer) will need to add some of our [Drag and Drop Markup]({{root_url}}/ui/sending-email/editor/#importing-custom-html-with-drag--drop-markup) to the code.\n\n**When I opened the new editor, my entire email got dropped into one big code module:**\n<br>If you created a campaign using drag-and-drop modules in the old editor, but then edited some of the code yourself, this can cause the Design editor to view your email as a single block of code. If this is the case, we recommend that you take a few minutes to rebuild the campaign in the new drag-and-drop editor. This will ensure that your campaigns are stable, clean, and any bugs from the old editor aren't copied over into the new experience.\n\n## \tWe're here to help\n \tWe're excited for all of the new value that you're going to experience with the new editor. As always, if you have any questions or concern, our [Support team](https://support.sendgrid.com) is standing by to help.\n"
  },
  {
    "path": "content/docs/ui/sending-email/recipient-subscription-preferences.md",
    "content": "---\nlayout: page\nweight: 0\ntitle: Recipient Subscription Preferences\ngroup: tracking\nseo:\n  title: Recipient Subscription Preferences\n  description: When your users unsubscribe they will see a very specific page where they can manage their subscriptions with your emails.\n  keywords: unsubscribe page, suppression page, recipient unsubscribe\nnavigation:\n  show: true\n---\n\nEmails that are sent with an unsubscribe group specified will have 2 links at the bottom of the email: an “Email Preferences” link and an “Unsubscribe” link.\n\nIf you do not specify an unsubscribe group when sending an email, the unsubscribe link will act as a global unsubscribe. This means that the recipient will no longer get any emails at all, including potentially important emails like password resets. To avoid this, create unsubscribe groups.\n\n## \tThe unsubscribe link\n\nWhen a recipient clicks the Unsubscribe link, they will be asked to confirm their choice and then will be added to the Global Unsubscribe list.\n\n## \tThe email preferences link\n\nIf you choose not to use substitution tags, your emails will automatically have an Email Preferences link, which when clicked will show recipients their personalized Email Preferences page. From here, recipients will be able to see all of your Unsubscribe Groups and their descriptions. They will then be able to choose whether or not they want to receive those types of emails.\n\n ### \tManage email preferences\n\nYou can also choose to manually add the `<%asm_preferences_url%>` tag to your email. We will automatically replace that tag with the text \"Manage Email Preferences\" wherever the tag is found in your email. This will allow your recipients to see your Unsubscribe Groups in a Subscription Preference page and then choose which groups they are interested in.\n\nAlternatively, you can use the `<%asm_preferences_raw_url%>` substitution tag. This will be replaced with just the URL pointing to your Subscription Preference page without the hyperlinked text \"Manage Email Preferences\".\n\nFor more substitution tags, please see our [transactional templates]({{root_url}}/ui/sending-email/create-and-edit-transactional-templates/#adding-unsubscribe-links-to-a-template).\n\n## \tAdditional resources\n\n- [Spam reports]({{root_url}}/ui/analytics-and-reporting/spam-reports/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/sender-verification.md",
    "content": "---\nlayout: page\ntitle: Single Sender Verification\ngroup: sending-email\nnavigation:\n  show: false\nseo:\n  title: Single Sender Verification\n  override: true\n  description: Understanding the difference between Domain Authentication and verifying a Single Sender.\n---\n\nTo protect your sending reputation and to uphold legitimate sending behavior, we require customers to verify their Sender Identities. This article will walk you through all the necessary steps to verify a Single Sender, one of two methods of verifying a [Sender Identity]({{root_url}}/for-developers/sending-email/sender-identity/).\n\n### Adding a Sender\n\n1. Under Settings in the navigation bar, click **Sender Authentication**.\n2. Proceed with **Single Sender Verification** by selecting **Get Started** under **Verify an Address**.\n\n![Sender Auth Page]({{root_url}}/img/sender-verification-sender-auth-page.png 'Sender Auth Page')\n\n3. You will be taken to the **Single Sender Verification** page. Under **Create your First Sender**, click **Create New Sender** to load a form modal.\n\n![Sender Management]({{root_url}}/img/sender-verification-sender-management-page.png 'Sender Management')\n\n![Create New Sender]({{root_url}}/img/sender-verification-form-modal.png 'Create New Sender')\n\n4. Fill in all of the fields in the form modal and then click **Create**.\n\n#### Form Fields\n\n- **From Name** - This is a user-friendly name that is displayed to your recipient when they receive their email.\n- **From Email Address** - This will display to the user as the email address that sent this email. We will send the verification email to the address you enter in this field. If you have not received your verification email after some time, please refer back to the Sender settings and confirm that the \"From\" email is a valid address.\n- **Reply To** - If your user hits reply in their email, the reply will go to this address.\n- **Company Address**, **City**, **State**, **Zip Code**, **Country** - Your business address.\n- **Nickname** - A label for your sender identity to help you identify it more quickly. This label is not visible to your recipients.\n\n<call-out>\n\nWhen filling the \"From Email Address\" field, you may notice a warning when entering an address at `yahoo.com`, `aol.com`, `gmail.com`, and some other domains. This warning indicates you should not use the address as your verified Single Sender because your messages will likely fail a DMARC check. For more details, see our comprehensive [DMARC page]({{root_url}}/ui/sending-email/dmarc/).\n\n</call-out>\n\n5. Check the inbox of the email address that you entered and click the link in the email to verify the Sender address.\n\nIf, for any reason, you need to resend the verification email, click the action menu on the **Single Sender Verification** page and select **Resend Verification**. We will deliver a new confirmation email to the address you are attempting to verify.\n\n![Resend Verification]({{root_url}}/img/sender-verification-resend-verification.png 'Resend Verification')\n\n<call-out>\n\nIf you have an [authenticated domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) and your sender email address matches that domain exactly, your sender identity will be verified automatically.\n\n</call-out>\n\nYou will now see a page confirming the verification of your address. Click **Return to Single Sender Verification** to add more addresses or make any changes to the address you just verified. Congratulations, you are now ready to send email with SendGrid.\n\n![Sender Verified]({{root_url}}/img/sender-verification-sender-verified-page.png 'Sender Verified')\n"
  },
  {
    "path": "content/docs/ui/sending-email/senders.md",
    "content": "---\nlayout: page\nweight: 70\ntitle: Senders\ngroup: marketing-campaigns\nnavigation:\n  show: true\nseo:\n  title: Senders\n  override: true\n  description: Manage your sender contact information\n---\n\n<iframe src=\"https://player.vimeo.com/video/366851411\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n##     Adding a Sender\n\nYou are required to include your contact information, including a physical mailing address, inside every promotional email you send in order to comply with the U.S. CAN-SPAM Act, CASL, and other anti-spam laws of the countries your recipients live in.\n\n*To add a Sender:*\n\n1. Navigate to **Marketing** and then click **Senders**.\n1. In the top right corner of the Sender Management page, click **Create New Sender**.\n1. Fill in all of the fields on the page and then click **Save**.\n\n    * **From Name** - This is a user-friendly name that is displayed to your recipient when they receive their email.\n    * **From Email Address** - This will display to the user as the email address who sent this email. We will send the verification email to the address you enter in this field. If you have not received your verification email after some time, please refer back to the Sender settings and confirm that the \"From\" email is a valid address. \n    * **Reply To** - If your user hits reply in their email, the reply will go to this address.\n    * **Company Address, City, State, Zip Code, Country** - The address of your business. CAN-SPAM regulations require this information in every email you send.\n    * **Nickname** - A label for your sender identity to help you identify it more quickly. This is not visible to your recipients.\n<br></br>\n1. Check the inbox of the email address that you entered and click the link in the email to verify the Sender email.\n\nIf, for any reason, you need to resend the verification email, click the action menu on the Sender Management page and select **Resend Verification**.\n\n![]({{root_url}}/img/email-validation-clicking.gif \"Clicking on the action menu and then selecting Resend Verification\")\n\n<call-out type=\"warning\">\n\nYou must verify the email address associated with your sender identity before you can edit it or use it to schedule a Single Send or set an Automation.\n\n</call-out>\n\n<call-out>\n\nYou may create up to 100 unique senders.\n\n</call-out>\n\n<call-out>\n\nIf you have an [authenticated domain]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) and your sender email address matches that domain exactly, your sender identity will be automatically verified.\n\n</call-out>\n\n<call-out type=\"warning\">\n\nOnce you schedule a Single Send or set an Automation, you cannot delete the sender identity associated with the Single Send or Automation.\n\n</call-out>\n\n<call-out-link linktext=\"IMPLEMENTATION SERVICES\" img=\"/img/expert-insights-promo1.png\" link=\"https://sendgrid.com/solutions/email-implementation/\">\n\n### Do you want expert help to get your email program started on the right foot?\n\n\nSave time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.\n\n</call-out-link>\n\n##     Adding Sender Information to a Single Send or Automation Email\n\nTwilio SendGrid’s pre-built email templates come with an Unsubscribe module containing your Sender information by default. For templates or emails that you build yourself, you can insert your sender identity information into your campaigns using the following tags within your campaign or template content:\n\n1. **{{sender_name}}** - The sender's name.\n\n1. **{{sender_address}}** - The sender's street address.\n\n1. **{{sender_city}}** - The sender's city.\n\n1. **{{sender_state}}** - The sender's state.\n\n1. **{{sender_zip}}** - The sender's zip.\n\n1. **{{sender_country}}** - The sender's country.\n\n*To add tags to your email:*\n\n1. In the Design editor, navigate to the **Build** tab and drag a Text module into your campaign body. If you’re using the Code Editor, click the gear icon on the left to open the **Settings** bar.\n1. Navigate to the **Tags** tab.\n1. Select the copy icon next to the tag you want to add to your campaign.\n1. Paste the tag into your text module.\n\nTo show your sender's full address and information in the footer of the email, Twilio SendGrid recommends adding the tags as shown:\n\n```\n{{Sender_Name}}\n\n{{Sender_Address}}\n\n{{Sender_City}}\n\n{{Sender_State}\n\n{{Sender_Zip}}\n```\n\nWhen successfully completed, your tags should change as shown below when your email enters your recipient’s mailbox.\n\n\n![]({{root_url}}/img/sender-tag-comparison.png \"Alt text\")\n\n## Additional Resources\n\n- [How to set up domain authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)\n- [Troubleshooting Sender Authentication]({{root_url}}/ui/account-and-settings/troubleshooting-sender-authentication/)\n- [Custom Fields]({{root_url}}/ui/managing-contacts/custom-fields/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/single-sends.md",
    "content": "---\nlayout: page\nweight: 85\ntitle: Single Sends\ngroup: managing-contacts\nnavigation:\n  show: true\nseo:\n  title: Single Sends\n  override: true\n  description: Exclude contacts from a Single Send based on list or segment membership.\n---\n\nA Single Send is a one-time non-automated email message delivered to a list or segment of your audience. You can schedule a Single Send or send it immediately. Unlike an [Automation]({{root_url}}/glossary/automated-email/), a Single Send is not part of a series of related messages that are designed to work in sequence.\n\nSingle Sends can be used to deliver promotional offers, engagement campaigns, newsletters, announcements, legal notices, policy updates, and more.\n\n## Single Send features\n\n### Design and Code Editors\n\nTwilio SendGrid Single Sends leverage our Design and Code Editors, allowing you to create templates quickly and easily without sacrificing the ability to customize your designs. Twilio SendGrid also provides a library of pre-built designs that you can duplicate and modify.\n\nSee our dedicated [Design and Code Editor page]({{root_url}}/ui/sending-email/editor/) for more on working with email designs.\n\n### Search and filter your Single Sends\n\nAfter creating multiple Single Sends, you can modify and delete them as needed. To make managing multiple Single Sends easier, Twilio SendGrid offers search functionality, enabling you to find a Single Send quickly by name.\n\nYou can also filter your search results by status — \"Draft,\" \"Scheduled,\" or \"Triggered\" — and any categories you have added to your Single Sends.\n\nWhen filtering by multiple categories, Marketing Campaigns will return results matching any of the categories specified. For example, if you filter by the categories \"Newsletter,\" \"Promotion,\" and \"BOGO,\" Marketing Campaigns will return Single Sends matching one _or_ more of those categories.\n\n### A/B Testing\n\nA/B testing, also known as split testing, is a powerful way to optimize engagement with your email. A/B tests allow you to create multiple versions of a Single Send and deliver each to a subset of your audience. Based on the performance of each variant, a _winner_ is selected that can be sent to the rest of your contacts.\n\nWhen working with A/B tests, you can\n\n* Clone variations of A/B tests\n* Delete variations of A/B tests\n* Manually select the winner of an A/B test\n\nSee our dedicated [A/B Testing page]({{root_url}}/ui/sending-email/a-b-testing/) to learn how to create and manage your A/B tests.\n\n### Exclude lists and segments\n\nYou can exclude up to 5 segments and 50 lists from a Single Send. Twilio SendGrid will omit any contacts who are on one of your excluded segments or lists from the send.\n\n### Send tests\n\nSingle Sends are integrated with Twilio SendGrid's Email Testing feature. Email Testing allows you to check not only whether or not your messages will be rendered properly across mail clients but also how likely a message is to perform well across spam filters.\n\nFor more about testing, see our dedicated [Email Testing page]({{root_url}}/ui/sending-email/email-testing/).\n\n### The Single Sends API\n\nFor those who want to manage their Single Sends programmatically, Twilio SendGrid provides the [Single Sends API]({{root_url}}/api-reference/).\n\n## Work with Single Sends \n\n### Create a Single Send\n\n_To create a new Single Send_\n\n1. From the left-hand navigation, select **Marketing**.\n2. Select **Single Sends** and click **Create Single Send**.\n3. Select a template from **Your Email Designs** or one of the pre-built **SendGrid Email Designs**.\n   <br> For more information about our designs, see [Working with Marketing Campaigns Email Designs]({{root_url}}/ui/sending-email/working-with-marketing-campaigns-email-designs/).\n\n<call-out>\n\nYou can also create a template from an existing Single Send by selecting the action menu next to the email you'd like to reuse and selecting **Create Template**.\n\n</call-out>\n\n4. Select an editor. You can choose between the **Design Editor** and the **Code Editor**.\n   - Inside the Design Editor, the **Settings**, **Tags** and **Build** tabs allow you to design and configure your email.\n   - Inside the Code Editor, you can click the left **Settings** tab to expand the settings window, and then you can configure your email using the **Settings** and **Tags** tabs.\n\n![]({{root_url}}/img/design-editor-preview.png 'Design Editor Preview')\n\n5. Click **Save**. Your Single Send is now created. Next, you will need to edit the Single Send's settings.\n\n### Single Send required settings\n\nThe **Settings** tab allows you to configure all the essential information about your Single Send, including the sender and recipients. To completely prepare a Single Send's settings, you must define the following fields.\n\n- **From Sender**: The publicly visible sender of your Single Send. This email address should be one of your verified senders. See our [sender verification documenation]({{root_url}}/ui/sending-email/sender-verification/) for more information about setting up a verified sender.\n- **Email Subject**: The email's subject line. This field can be A/B tested.\n- **Recipients**: The segments or lists you want to send the email to.\n\n<call-out type=\"warning\">\n\nThere is a limit of 10 segments per Single Send.\n\nSee our [segmentation documentation]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/) for more information about managing your contacts and building Single Sends based on engagement data.\n\n</call-out>\n\n- **Scheduling**: A Single Send can be sent immediately or scheduled in advance. If you select **Specify a Date and Time**, **Date** and **Time** fields will be displayed where you can set a future send time.\n\n### Single Send optional settings\n\nIn addition to the settings necessary to send your messages, Single Sends provide optional settings that allow you to more precisely manage how you target your audience with each message.\n\n#### Exclude contacts from a Single Send\n\n_To exclude a segment or list from your Single Send_\n\n1. Navigate to **Marketing** and select **Single Sends**.\n2. Create a new Single Send or open existing Single Send.\n3. Once the Single Send is open, in the **Settings** tab scroll to the **Recipients** header.\n4. Toggle **Exclude specific recipients** to **ON**.\n5. This will display an **Exclude** drop-down menu.\n6. The drop-down menu will load all of your **Lists** and **Segments**. Select any lists or segments you wish to exclude from the Single Send.\n  <br /> You can include as many as 5 segments and 50 lists.\n\n![Exclude recipients from a Single Send]({{root_url}}/img/single-sends-exclude-recipients.png 'Exclude recipients')\n\nThe contacts associated with your selected lists or segments will be excluded from the Single Send.\n\n#### Send from a specific IP Pool\n\nIf you have dedicated IPs, you can set up [IP Pools]({{root_url}}/ui/account-and-settings/ip-pools/) that allow you to separate your traffic and potentially enhance your deliverability by protecting your sender reputation.\n\n_To utilize IP pools for Single Sends_\n\n1. navigate to **Settings** and from the IP Pool drop-down and select the IP pool you wish to use.\n\n### Single Sends additional tabs\n\nFor more thorough information about working with the other tabs used to configure a Single Send, please visit the dedicated documentation for each tab listed below.\n\n* [Design and Code Editor documentation]({{root_url}}/ui/sending-email/editor/).\n* [Tags]({{root_url}}/ui/sending-email/editor/#substitution-tags).\n* [A/B Testing](/{{root_url}}/ui/sending-email/a-b-testing/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/spam-traps.md",
    "content": "---\nseo:\n  title: Spam Trapped\n  canonical: https://sendgrid.com/blog/spam-traps-what-they-are-and-why-you-should-pay-attention-to-them/\n  description: Spam Trapped\n  keywords: spam, role, address, trap, honey, pot, double, segmentation, opt-in, bad, old, spam traps, purchased, lists\ntitle: Spam Trapped\ngroup: tracking\nweight: 0\nlayout: page\nzendesk_id: 200182968\nnavigation:\n  show: true\n---\n\n **What Spam Traps Are & Why You Should Pay Attention To Them** :\n\nSpam Traps are simply ways to identify and monitor spam. Creating them is as easy as taking an email address or even an entire domain that hasn’t been subscribed to any emails and sending an email to it. Since they haven’t subscribed to any mail, it will be considered spam.\n\nThere are a wide variety of spam traps. Sources for spam traps are usually old addresses that were used as role addresses (sales@ info@ support@) in domain registrations or email addresses that were once valid but have been reassigned for trapping spam. This type of spam trap has once opted in to receive email and was likely published on a page somewhere online. (This is not that case for dictionary attackers since they generate millions of randomized addresses at common domains i.e. example@example.com, example@example.com and so on.)\n\nSpam traps are so important because so many large ISPs, spam filter providers and Domain Name System [deny lists]({{root_url}}/glossary/deny-list/) use them. In short, sending an email to a spam trap can lead directly to being blocked by the organization that set up the trap. Remember that blocks can ruin a business’s reputation and halt further email deliverability.\n\n\n<call-out-link linktext=\"EXPERT INSIGHTS\" img=\"/img/expert-insights-promo2.png\" link=\"https://sendgrid.com/solutions/expert-insights/\">\n\n\n### Looking for more visibility into your email performance?\n\n\nSend better email with Expert Insights. Our detailed monthly reports will enable you to understand your email reputation and recipient engagement and repair issues with expert how-to steps.\n\n\n</call-out-link>\n\n\n**How a Spam Trap Ended Up on a List** :\n\n The first medium to avoid is **bad list sources**. This includes any list that has not opted in to receiving a company’s messages such as purchased lists. Avoid unsolicited lists to ensure a business’s reputability. Chances are (99.99%) there is a spam trap included in these lists.\n\nThe second critical aspect to pay attention to is **list contamination**. List contamination is when an email address that is a spam trap was added deliberately or accidentally to an unconfirmed list. (This is a list with single opt-in or notified opt-in)  To avoid list contamination make sure to check the correct spelling of the list’s email addresses and take advantage of double opt-in for every list.\n\nThe last important tool in avoiding spam traps is the **age of the list**. Like previously mentioned, spam traps are sometimes sourced in outdated email addresses that are no longer valid. Going for long periods of time (over one year) without sending mail to an address can lead to getting caught in a spam trap. To prevent this type of spam trap, [clean out old addresses]({{root_url}}/ui/managing-contacts/managing-contact-list/).\n\n\n\n**How to Remove Spam Traps from Lists** :\n\n\n\nRemoving a spam trap is tricky business not to mention time consuming. It is inefficient and expensive to throw out a whole list and one way to avoid this is [list segmentation]({{root_url}}/ui/managing-contacts/segmenting-your-contacts/). Identify clean list segments that are free of any possible spam traps. If an address has not opened any emails for over six months, it may be a spam trap and should be sent one last [confirmatory email]({{root_url}}/glossary/reconfirmation/). Clean list segments need not be sent a confirmatory email.\n\nWhy not repermission the whole list? Because confirming every subscriber’s consent to receive emails isn’t ideal. Subscribers who want to continue to receive mail may not re-subscribe because they did not notice the email or just forgot to reconfirm.\n\nTo escape the woes that come with list reconfirmation, remember to ensure thorough and routine list maintenance. This will save time, reputation, and a big headache.\n"
  },
  {
    "path": "content/docs/ui/sending-email/spam.md",
    "content": "---\nseo:\n  title: Google Feedback Loop (Spam Complaints)\n  description: Google Feedback Loop (Spam Complaints)\n  keywords:\ntitle: Google Feedback Loop (Spam Complaints)\ngroup: tracking\nweight: 0\nlayout: page\nzendesk_id: 202604713\nnavigation:\n  show: true\n---\n\nSendGrid does automatically suppress any spam complaint address reported through traditional feedback loops. However, some webmail providers, notably Gmail, do not provide a traditional feedback loop out of privacy concerns. Rather, they provide an anonymous, aggregate report directly to us about concerning senders.\n\n\n\nThis matters to you because senders with high spam complaints will often see their mail broadly throttled or blocked during future email campaigns if this remains an unresolved issue. Since Gmail’s reporting is anonymous, you won’t know specifically who flagged your mail as spam, and you likely won’t know this is an issue until SendGrid reaches out to you.\n\n\n\nIf you receive a report from us about Google spam complaints, or even from traditional feedback loops, we have a few best practices to help you resolve the issue:\n\n1. If you don’t have opt-in, don’t send any more to those lists. It’s against our [Terms of Service](http://sendgrid.com/email_policy), and considered to be [spam](http://www.spamhaus.org/consumer/definition/) anyway by the email community.\n2. If your list is opt-in, track who’s actually engaging with your email, as measured by click and open tracking. Many customer have this data in their own CRM, or you may prefer to use our own [Click](https://sendgrid.com/docs/ui/analytics-and-reporting/click-tracking-html-best-practices/) and [Open Tracking](https://sendgrid.com/docs/ui/account-and-settings/tracking/) apps, coupled with the [EventKit](https://sendgrid.com/docs/for-developers/tracking-events/event-kit/) to consume this data. For recipients who don’t engage with your email, after a certain period of time that you determine to be appropriate based on your customer base and business model, stop sending to them. This tends to be a period between a few weeks to 3 months, depending on your sending frequency.\n\nIf you receive a report from us about spam complaints, use this as an opportunity to implement better list acquisition and maintenance.\n\n\n\n"
  },
  {
    "path": "content/docs/ui/sending-email/ssl-vs-tls.md",
    "content": "---\nseo:\n  title: SSL vs. TLS\n  description: SSL vs. TLS\n  keywords:\ntitle: SSL vs. TLS\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\nTLS (Transport Layer Security) and SSL (Secure Sockets Layer) are protocols that provide data encryption and authentication between applications and servers sending data across an insecure network, such as your email. The terms SSL and TLS are often used interchangeably or in conjunction with each other (TLS/SSL), but one is, in fact, the predecessor of the other — SSL 3.0 served as the basis for TLS 1.0 which, as a result, is sometimes referred to as SSL 3.1. With this said, _is there a practical difference between the two?_\n\nPeople used to believe that TLS v1.0 was marginally more secure than SSL v3.0, its predecessor. However, SSL v3.0 is getting very old and recent developments, such as the [POODLE](https://en.wikipedia.org/wiki/POODLE) vulnerability, have shown that SSL v3.0 is now completely insecure (especially for websites using it). Even before the POODLE was set loose, the US Government had already mandated that SSL v3 not be used for sensitive government communications or for HIPAA-compliant communications. As a result of POODLE, SSL v3 is being disabled on websites all over the world and for many other services as well.\n\nSSL v3.0 is effectively “dead” as a useful security protocol. Places that still allow its use for web hosting are placing their “secure websites” at risk; organizations that allow the use of SSL v3 to persist for other protocols (for example, IMAP) should take steps to remove that support at the soonest software update maintenance window.\n\nSubsequent versions of TLS — v1.1 and v1.2 — are _significantly more secure_ and fix many vulnerabilities present in SSL v3.0 and TLS v1.0. The newer TLS versions, if properly configured, prevent attacks and provide many stronger ciphers and encryption methods. SendGrid supports TLS v1.1 and higher.\n\n**Should You Be Using SSL or TLS?**\nThe IETF deprecated both SSL 2.0 and 3.0 (in 2011 and 2015, respectively). Over the years the deprecated SSL protocols continue to reveal vulnerabilities (for example, POODLE, DROWN). Most modern browsers show a degraded user experience (for example, a line through the padlock or https in the URL bar, or security warnings) when they encounter a web server using the old protocols. For these reasons, you should disable SSL 2.0 and 3.0 in your server configuration, leaving only TLS protocols enabled.\n\n**Certificates are not the same as protocols**\nBefore anyone starts worrying that they need to replace their existing SSL Certificates with TLS Certificates, it’s important to note that certificates are not dependent on protocols. That is, you don’t need to use a TLS Certificate vs. an SSL Certificate. While many vendors tend to use the phrase “SSL/TLS Certificate”, it may be more accurate to call them “Certificates for use with SSL and TLS\", since your server configuration determines the protocols, and not the certificates themselves.\n\nIt’s likely you will continue to see certificates referred to as SSL Certificates because at this point that’s the term more people are familiar with, but we’re beginning to see increased usage of the term TLS across the industry. SSL/TLS is a common compromise until more people become familiar with TLS.\n\n**Are SSL and TLS Any Different Cryptographically?**\nIn truth, the answer to this question is yes, but you can say the same about the historical versions of SSL 2 and 3 or the TLS versions 1 with 1.1, 1.2 or 1.3. SSL and TLS are both about the same protocol but because of the version differences, SSL 2 was not interoperable with version 3, and SSL version 3 not with TLS version 1. You could argue that Transport Layer Security (TLS) was just a new name for SSL v4 - essentially, we are talking about the same protocol.\n\nEach newly released version of the protocol came and will come with improvements and new or deprecated features. SSL version one was never released, version two did but had some significant flaws, SSL version 3 was a rewrite of version two (to fix these flaws) and TLS version 1 an improvement of SSL version 3. Since the release of TLS 1.0 the changes have been less significant, but never less important.\n\nIt’s worth noting here that SSL and TLS simply refer to the handshake that takes place between a client and a server. The handshake doesn’t actually do any encryption itself, it just agrees on a shared secret and type of encryption that is going to be used.\n\n## Additional Resources\n\n[Configuring ports with SendGrid]({{root_url}}/for-developers/sending-email/getting-started-smtp/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/subscription-tracking.md",
    "content": "---\nseo:\n  title: Unsubscribe via Subscription Tracking\n  description: Unsubscribe via Subscription Tracking\n  keywords: subscription, page, landing, replacement, tag, text, unsubscribe, unsub, html, click_tracking, body, <% %>\ntitle: Unsubscribe via Subscription Tracking\ngroup: tracking\nweight: 0\nlayout: page\nzendesk_id: 200181498\nnavigation:\n  show: true\n---\n\n## What does it do?\n\n- Automatically add an unsubscribe link to the bottom of your emails.\n- Customize the unsubscribe link that is added automatically\n- Create a replacement tag that will allow you to put the unsubscribe link anywhere you would like using HTML.\n- Automatically incorporates the [list-unsubscribe](https://sendgrid.com/blog/list-unsubscribe/) header in your emails.\n\n## How do I enable Subscription Tracking?\n\nFrom your Account Overview page, visit the sidebar menu and click “Settings”. From there, select \"Tracking\". Locate the Subscription Tracking option and click on the arrow on the right side and click on the \"Off/On\" button.\n\n![]({{root_url}}/images/unsub_tracking.gif) \n\n## How do I just add an unsubscribe link?\n\nJust enable the setting! Once enabled, we'll add the default unsubscribe link to the bottom of your emails.\n\n## How do I change what the link says?\n\nAssuming that you have the setting enabled already, go into the app’s settings. To add your own wording, edit the text within the “Unsubscribe Content” boxes.\n\n### HTML Body Unsubscribe\n\nThe first box to edit is for HTML formatted emails.\n\nNotice that the words “click here” are wrapped with a <% %> symbols. This tells our system to link the words within the symbols to the unsubscribe URL. These will be the words that will be “clickable” in order to unsubscribe.\n\nIn this example, people will click \"click here\" in order to unsubscribe. \n\n![]({{root_url}}/images/html_body_unsubscribe.png)\n\n \n\n### Plain Text Unsubscribe\n\nChange the Plain Text content as well. There won’t be any clickable wording here though, since that is an HTML feature. The symbols <% %> will insert the unsubscribe URL. Users viewing the email in Plain Text will be able to click that URL in order to unsubscribe from your emails. \n\n![]({{root_url}}/images/Screen_Shot_2015-05-26_at_11.38.37_AM.png)\n\n Note: It is important to have the <% %> symbols in the plain text body version in order for the links to be added.\n\n \n\n## I don't want my unsubscribe links at the bottom!\n\nThis requires adding a HTML code snippet to the body of your email using the Replacement Tag field within the Subscription app’s settings. Set a replacement tag within the replacement tag field. {i.e. [unsubscribe]}\n\n  ![]({{root_url}}/images/Screen_Shot_2015-05-26_at_11.39.15_AM.png)\n\nDoing this will allow you to use that tag within the html. This tag will get replaced with the unsubscribe URL. So, to create your unsubscribe link, just use some simple HTML. \n\n### For example:\n\n    <p>If you would like to stop receiving these emails <a href=”[unsubscribe]”>click here</a></p>\n\n\n## What is a landing page?\n\nThis section allows you to create a page that appears once the unsubscribe link is clicked. So, once a recipient clicks the unsubscribe link, they will get redirected to this landing page you have created. \n\n![]({{root_url}}/images/Screen_Shot_2015-05-26_at_11.39.02_AM.png)\n\n\n \n\n"
  },
  {
    "path": "content/docs/ui/sending-email/substitution-and-section-tags.md",
    "content": "---\nseo:\n  title: Substitution and Section Tags\n  description: Substitution and Section Tags\n  keywords: substitution, section\ntitle: Substitution and Section Tags\ngroup: building-email\nweight: 0\nlayout: page\nzendesk_id: 204382358\nnavigation:\n  show: true\n---\n\n## Simple Name Substitution\n\nThis example will show you how to create a name substitution for your emails. We will be using the tag `-name-` in this example. In this example, the tag `-name-` will get replaced with the name of the recipient.\n\n#### Email Content\n\n```\nHello -name-,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello -name-,<br /></p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\"john@domain.com\", \"jane@domain.com\", \"matt@domain.com\"],\n  \"sub\": {\n    \"-name-\": [\"John\", \"Jane\", \"Matt\"]\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john@domain.com\",\n          \"name\": \"John\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-name-\": \"John\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane@domain.com\",\n          \"name\": \"Jane\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-name-\": \"Jane\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt@domain.com\",\n          \"name\": \"Matt\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-name-\": \"Matt\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello -name-,\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"Hello -name-,\"\n    }\n  ]\n}\n```\n\n#### Example Outcome:\n\njohn@domain.com\n\n#### Text\n\n```\nHello John,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello John,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\njane@domain.com\n\n#### Text\n\n```\nHello Jane,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Jane,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt@domain.com\n\n#### Text\n\n```\nHello Matt,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Matt,<br /></p>\n  </body>\n</html>\n```\n\n## First Name and Last Name Substitutions\n\nThis example will show you how to create a first name and last name substitution for your emails. We will be using the tags `-first_name-` and `-last_name-` in this example. In this example the tag `-first_name-` will get replaced with the first name of the recipient and the tag `-last_name-` will get replaced with the last name of the recipient.\n\n#### Text\n\n```\nHello -first_name-  -last_name-,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello -first_name- -last_name-,<br /></p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\n    \"john.smith@domain.com\",\n    \"jane.williams@domain.com\",\n    \"matt.johnson@domain.com\"\n  ],\n  \"sub\": {\n    \"-first_name-\": [\"John\", \"Jane\", \"Matt\"],\n    \"-last_name-\": [\"Smith\", \"Williams\", \"Johnson\"]\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john.smith@domain.com\",\n          \"name\": \"John Smith\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-first_name-\": \"John\",\n        \"-last_name-\": \"Smith\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane.williams@domain.com\",\n          \"name\": \"Jane Williams\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-first_name-\": \"Jane\",\n        \"-last_name-\": \"Williams\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt.johnson@domain.com\",\n          \"name\": \"Matt Johnson\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-first_name-\": \"Matt\",\n        \"-last_name-\": \"Johnson\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello -first_name- -last_name-,\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"Hello -first_name- -last_name-,\"\n    }\n  ]\n}\n```\n\n#### Example Outcome:\n\njohn.smith@domain.com\n\n#### Text\n\n```\nHello John Smith,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello John Smith,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\njane.williams@domain.com\n\n#### Text\n\n```\nHello Jane Williams,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Jane Williams,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt.johnson@domain.com\n\n#### Text\n\n```\nHello Matt Johnson,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Matt Johnson,<br /></p>\n  </body>\n</html>\n```\n\n## Simple Greeting Section with Name Substitution\n\n<call-out type=\"warning\">\n\nDue to low usage, the Section Tags feature has been deprecated. It will be fully removed on 06/22/2020. Click [here]({{root_url}}/ui/account-and-settings/retired-mail-settings/) for more information.\n\n</call-out>\n\nThis example will show you how to create a section as a greeting with a name substitution. We will be using the tags `-warm_welcome-`, `-greeting-` and `-name-` in this example. In this example, we have created a greeting using the section tag `-warm_welcome-`. The `-warm_welcome-` tag is replaced with the `-greeting-` substitution which calls the section `\"Hello -name-,\"`. The `-name-` tag in `\"Hello -name-,\"` is then replaced with the recipient's name.\n\n#### Text\n\n```\n-warm_welcome-\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>-warm_welcome-<br /></p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\"john@domain.com\", \"jane@domain.com\", \"matt@domain.com\"],\n  \"sub\": {\n    \"-name-\": [\"John\", \"Jane\", \"Matt\"],\n    \"-warm_welcome-\": [\"-greeting-\", \"-greeting-\", \"-greeting-\"]\n  },\n  \"section\": {\n    \"-greeting-\": \"Hello -name-,\"\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john@domain.com\",\n          \"name\": \"John\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-name-\": \"John\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane@domain.com\",\n          \"name\": \"Jane\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-name-\": \"Jane\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt@domain.com\",\n          \"name\": \"Matt\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-name-\": \"Matt\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"-warm_welcome-\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"<html>\\n  <head></head>\\n  <body>\\n    <p>-warm_welcome-<br>\\n    </p>\\n   </body>\\n</html>\"\n    }\n  ],\n  \"sections\": {\n    \"-greeting-\": \"Welcome -name-,\"\n  }\n}\n```\n\n#### Example Outcome:\n\n    john@domain.com\n\n#### Text\n\n```\nHello John,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello John,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\njane@domain.com\n\n#### Text\n\n```\nHello Jane,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Jane,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt@domain.com\n\n#### Text\n\n```\nHello Matt,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Matt,<br /></p>\n  </body>\n</html>\n```\n\n## Greeting Section with First & Last Name Substitutions\n\nThis example will show you how to create a section with first name and last name substitution for your emails. We will be using the tags `-warm_welcome-`, `-greeting-`, `-first_name-` and `-last_name-` in this example. In this example, we have created a greeting using the section tag `-warm_welcome-`. The `-warm_welcome-` tag is replaced with the `-greeting-` substitution which calls the section `\"Hello -first_name- -last_name-,\"`. The `-first_name-` and `-last_name-` tags in `\"Hello -first_name- -last_name-,\"` is then replaced with the recipients first and last names.\n\n#### Text\n\n```\n-warm_welcome-\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>-warm_welcome-<br /></p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\n    \"john.smith@domain.com\",\n    \"jane.williams@domain.com\",\n    \"matt.johnson@domain.com\"\n  ],\n  \"sub\": {\n    \"-first_name-\": [\"John\", \"Jane\", \"Matt\"],\n    \"-last_name-\": [\"Smith\", \"Williams\", \"Johnson\"],\n    \"-warm_welcome-\": [\"-greeting-\", \"-greeting-\", \"-greeting-\"]\n  },\n  \"section\": {\n    \"-greeting-\": \"Hello -first_name- -last_name-,\"\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john.smith@domain.com\",\n          \"name\": \"John Smith\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-first_name-\": \"John\",\n        \"-last_name-\": \"Smith\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane.williams@domain.com\",\n          \"name\": \"Jane Williams\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-first_name-\": \"Jane\",\n        \"-last_name-\": \"Williams\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt.johnson@domain.com\",\n          \"name\": \"Matt Johnson\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-first_name-\": \"Matt\",\n        \"-last_name-\": \"Johnson\",\n        \"-warm_welcome-\": \"-greeting-\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"-warm_welcome-\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"<html>\\n  <head></head>\\n  <body>\\n    <p>-warm_welcome-<br>\\n    </p>\\n   </body>\\n</html>\"\n    }\n  ],\n  \"sections\": {\n    \"-greeting-\": \"Welcome -first_name- -last_name-,\"\n  }\n}\n```\n\n#### Example Outcome:\n\n    john.smith@domain.com\n\n#### Text\n\n```\nHello John Smith,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello John Smith,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\njane.williams@domain.com\n\n#### Text\n\n```\nHello Jane Williams,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Jane Williams,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt.johnson@domain.com\n\n#### Text\n\n```\nHello Matt Johnson,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Matt Johnson,<br /></p>\n  </body>\n</html>\n```\n\n## Three Different Greeting Sections with First & Last Name Substitutions\n\nThis example will show you how to create three different sections, each with first name and last name substitution for your emails. We will be using the tags `-warm_welcome-`, `-greeting01-`, `-greeting02-`, `-greeting03-`, `-first_name-` and `-last_name-` in this example. In this example, we have created three different greetings using the section tag `-warm_welcome-`. The `-warm_welcome-` tag is replaced with either `-greeting01-`, `-greeting02-` or `-greeting03-` substitution. This will call one of the three sections. In each of these sections, there is the `-first_name-` and `-last_name-` tags which will get replaced with the recipients first and last names.\n\n#### Text\n\n```\n-warm_welcome-\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>-warm_welcome-<br /></p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\n    \"john.smith@domain.com\",\n    \"jane.williams@domain.com\",\n    \"matt.johnson@domain.com\"\n  ],\n  \"sub\": {\n    \"-first_name-\": [\"John\", \"Jane\", \"Matt\"],\n    \"-last_name-\": [\"Smith\", \"Williams\", \"Johnson\"],\n    \"-warm_welcome-\": [\"-greeting01-\", \"-greeting02-\", \"-greeting03-\"]\n  },\n  \"section\": {\n    \"-greeting01-\": \"Welcome -first_name- -last_name-,\",\n    \"-greeting02-\": \"Hello -first_name- -last_name-,\",\n    \"-greeting03-\": \"Dear -first_name- -last_name-,\"\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john.smith@domain.com\",\n          \"name\": \"John Smith\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-first_name-\": \"John\",\n        \"-last_name-\": \"Smith\",\n        \"-warm_welcome-\": \"-greeting01-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane.williams@domain.com\",\n          \"name\": \"Jane Williams\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-first_name-\": \"Jane\",\n        \"-last_name-\": \"Williams\",\n        \"-warm_welcome-\": \"-greeting02-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt.johnson@domain.com\",\n          \"name\": \"Matt Johnson\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-first_name-\": \"Matt\",\n        \"-last_name-\": \"Johnson\",\n        \"-warm_welcome-\": \"-greeting03-\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"-warm_welcome-\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"<html>\\n  <head></head>\\n  <body>\\n    <p>-warm_welcome-<br>\\n    </p>\\n   </body>\\n</html>\"\n    }\n  ],\n  \"sections\": {\n    \"-greeting01-\": \"Welcome -first_name- -last_name-,\",\n    \"-greeting02-\": \"Hello -first_name- -last_name-,\",\n    \"-greeting03-\": \"Dear -first_name- -last_name-,\"\n  }\n}\n```\n\n#### Example Outcome:\n\njohn.smith@domain.com\n\n#### Text\n\n```\nWelcome John Smith,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Welcome John Smith,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\njane.williams@domain.com\n\n#### Text\n\n```\nHello Jane Williams,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Hello Jane Williams,<br /></p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt.johnson@domain.com\n\n#### Text\n\n```\nDear Matt Johnson,\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>Dear Matt Johnson,<br /></p>\n  </body>\n</html>\n```\n\n## Three Confirmation Sections and Substitutions\n\nThis example will show you how to create three different sections for confirmation emails. We will be using the tags `-name-`, `-confirmations-`, `-confirmation_001-`, `-confirmation_002-`, `-confirmation_003-` and `-order_id-` in this example. In this example, we have created three different confirmations using the section tag `-confirmations-`. The `-confirmations-` tag is replaced with either `-confirmation_001-`, `-confirmation_002-` or `-confirmation_003-` substitution. This will call one of the three sections. In each of these sections, there is the `-order_id-` tag which will get replaced with the recipient's order id.\n\n#### Text\n\n```\nHello -name-,\n-confirmations-\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello -name-,<br />\n      -confirmations-\n    </p>\n  </body>\n</html>\n```\n\n#### X-SMTPAPI Header\n\n```json\n{\n  \"to\": [\"john@domain.com\", \"jane@domain.com\", \"matt@domain.com\"],\n  \"sub\": {\n    \"-name-\": [\"John\", \"Jane\", \"Matt\"],\n    \"-confirmations-\": [\n      \"-confirmation_001-\",\n      \"-confirmation_002-\",\n      \"-confirmation_003-\"\n    ],\n    \"-order_id-\": [\"12345\", \"23456\", \"34567\"]\n  },\n  \"section\": {\n    \"-confirmation_001-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-.\",\n    \"-confirmation_002-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.\",\n    \"-confirmation_003-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. You can download your invoice as a PDF for your records.\"\n  }\n}\n```\n\n#### v3 Mail Send\n\n```json\n{\n  \"personalizations\": [\n    {\n      \"to\": [\n        {\n          \"email\": \"john@domain.com\",\n          \"name\": \"John\"\n        }\n      ],\n      \"subject\": \"Example 01\",\n      \"substitutions\": {\n        \"-name-\": \"John\",\n        \"-order_id-\": \"12345\",\n        \"-confirmations-\": \"-confirmation_001-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"jane@domain.com\",\n          \"name\": \"Jane\"\n        }\n      ],\n      \"subject\": \"Example 02\",\n      \"substitutions\": {\n        \"-name-\": \"Jane\",\n        \"-order_id-\": \"23456\",\n        \"-confirmations-\": \"-confirmation_002-\"\n      }\n    },\n    {\n      \"to\": [\n        {\n          \"email\": \"matt@domain.com\",\n          \"name\": \"Matt\"\n        }\n      ],\n      \"subject\": \"Example 03\",\n      \"substitutions\": {\n        \"-name-\": \"Matt\",\n        \"-order_id-\": \"34567\",\n        \"-confirmations-\": \"-confirmation_003-\"\n      }\n    }\n  ],\n  \"from\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"reply_to\": {\n    \"email\": \"sender@senddomain.com\",\n    \"name\": \"Sender\"\n  },\n  \"subject\": \"Example\",\n  \"content\": [\n    {\n      \"type\": \"text/plain\",\n      \"value\": \"Hello -name-,\\n-confirmations-\"\n    },\n    {\n      \"type\": \"text/html\",\n      \"value\": \"<html>\\n  <head></head>\\n  <body>\\n    <p>Hello -name-,<br>\\n\t    -confirmations-</p>\\n  </body>\\n</html>\"\n    }\n  ],\n  \"sections\": {\n    \"-confirmation_001-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-.\",\n    \"-confirmation_002-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.\",\n    \"-confirmation_003-\": \"Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. You can download your invoice as a PDF for your records.\"\n  }\n}\n```\n\n#### Example Outcome:\n\njohn@domain.com\n\n#### Text\n\n```\nWelcome John,\nThanks for choosing SendGrid. This email is to confirm that we have processed your order 12345.\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Welcome John,<br />\n      Thanks for choosing SendGrid. This email is to confirm that we have\n      processed your order 12345.\n    </p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\n    jane@domain.com\n\n#### Text\n\n```\nHello Jane,\nThanks for choosing SendGrid. This email is to confirm that we have processed your order 23456. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Hello Jane,<br />\n      Thanks for choosing SendGrid. This email is to confirm that we have\n      processed your order 23456. This invoice is to be paid by bank transfer\n      within 7 days from the date of your monthly statement.\n    </p>\n  </body>\n</html>\n```\n\n#### Example Outcome:\n\nmatt@domain.com\n\n#### Text\n\n```\nDear Matt,\nThanks for choosing SendGrid. This email is to confirm that we have processed your order 34567. You can download your invoice as a PDF for your records.\n```\n\n#### HTML\n\n```html\n<html>\n  <head></head>\n  <body>\n    <p>\n      Dear Matt,<br />\n      Thanks for choosing SendGrid. This email is to confirm that we have\n      processed your order 34567. You can download your invoice as a PDF for\n      your records.\n    </p>\n  </body>\n</html>\n```\n"
  },
  {
    "path": "content/docs/ui/sending-email/tls.md",
    "content": "---\nseo:\n  title: Does SendGrid support end-to-end TLS?\n  description: Does SendGrid support end-to-end TLS?\n  keywords: encryption, tls, encrypt, 587, enforce\ntitle: Does SendGrid support end-to-end TLS?\ngroup: delivery-optimization\nweight: 0\nlayout: page\nzendesk_id: 202523426\nnavigation:\n  show: true\n---\n\nBy default, our system is designed to opportunistically try outbound TLS v1.1 or higher when attempting to deliver email. This means that if your recipient's email server accepts an inbound TLS v1.1 or higher connection, we will deliver the email over a TLS encrypted connection. If the server does not support TLS, we will deliver the message over the default unencrypted connection.\n\nWe also offer the ability to _enforce TLS encryption_ when we attempt to deliver email to your recipients. The [Enforced TLS feature](https://sendgrid.api-docs.io/v3.0/settings-enforced-tls) specifies whether or not the recipient is required to support TLS v1.1 or higher or have a valid certificate before we deliver an email to them.\n"
  },
  {
    "path": "content/docs/ui/sending-email/universal-links.md",
    "content": "---\nseo:\n  title: Universal Links\n  description: Learn how to set up universal links with click tracking in your emails.\n  keywords: deep links, universal links, Google, android, Apple, iOS, app, click tracking\ntitle: Universal Links\ngroup: tracking\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n\n<call-out type=\"warning\">\n\nThe majority of this setup and management occurs outside of the SendGrid console. SendGrid support can only help with the steps that happen within your SendGrid account - like sender authentication setup. The setup options below are examples, and there are several more CDNs you could use to set up universal links.\n\n</call-out>\n\nMobile devices are increasingly becoming the preferred method of receiving, reading, and engaging with email. If you send an email containing a link to your website, but you also have a corresponding mobile application, it is possible to ensure that any recipients who click the link on their mobile device are taken directly to your app instead of their web browsers.\n\nThis is accomplished by using **universal links**. A universal link is a unique URL that can be configured to open a window in either the recipient's web browser, mobile browser, or mobile application depending on the device the recipient is using. SendGrid enables you to simply tag individual links that you would like to be converted to universal links, without sacrificing the ability to track clicks on those links.\n\n<call-out>\n\nThese links are sometimes referred to as \"deep links\" in the context of Google's Android OS. Apple uses the term \"universal links\".\n\nRegardless of the OS you are configuring your links for, we will use the term \"universal links\".\n\n</call-out>\n\nWhen setting up universal links for your app, it is important to ensure that you maintain the ability to track when users click those links. After configuring your universal links, we will explain [how to ensure that your universal links are tracked](#resolving-sendgrid-click-tracking-links).\n\n<call-out type=\"warning\">\n\n**Marketing Campaigns does not support universal links by default!** If you would like to include universal links in your campaign, you must ensure that you edit the HTML of your template to appropriately [flag your links as universal](#flagging-your-universal-links).\n\n</call-out>\n\n## \tRequirements\n\nThere are several requirements that you must complete before you can begin using universal links in your email:\n\n- Universal links for iOS require an \"apple-app-site-association\" JSON file.\n- Universal links for Android require that you set up a \"digital asset links\" JSON file, along with configuring intent filters in your Android app's manifest file.\n- Your **apple-app-site-association** and **digital asset links** files must be hosted on an HTTPS web server or content delivery network (CDN).\n- To ensure that your universal links register click tracking events, and to ensure that your recipient is taken to the correct page within your app, you must properly [resolve your links](#resolving-sendgrid-click-tracking-links).\n- You must complete the [link branding process]({{root_url}}/ui/account-and-settings/how-to-set-up-link-branding/) for your account. When branding your links, you must use the same domain that will be used for your universal links. (e.g. links.example.com)\n- On iOS, you must include your branded link subdomain in the \"Associated Domains\" for your app. You can customize your subdomain using the custom return path in advanced settings while setting it up. Using the example above, you'd need to add an entry for \"applinks:links.example.com\" like this:\n![]({{root_url}}/images/universal_links_ios.png)\n\n## \tWhat are \"apple-app-site-association\" and \"digital asset links\" files?\n\nTo keep your app secure, Google and Apple want to restrict which resources or websites are allowed to link directly to different pages within your app. This prevents bad actors from using universal links to gain access to sensitive information within your app.\n\nYour \"apple-app-site-association\" and \"digital asset links\" files serve as secure means of authenticating your universal links; they verify that your website is allowed to open up a page within your app.\n\n<call-out>\n\nYou must create your own digital asset links and apple-app-site-association files, and you must upload these files to a secure server.\n\n</call-out>\n\nBoth \"apple-app-site-association\" and \"digital asset links\" files are comprised of a series of JSON key/value pairs that associate external URLs with pages within your application.\n\n**For detailed instructions on how to configure an iOS \"apple-app-site-association\" file, please see [Apple's Developer Documentation](https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html).**\n\n**For detailed instructions on how to configure an Android \"digital asset links\" file, please visit [Google's Developer Documentation](https://developers.google.com/digital-asset-links/v1/getting-started).**\n\n\n ### \tExample apple-app-site-association file:\n\n```json\n{\n  \"applinks\": {\n    \"apps\": [],\n    \"details\": [\n      {\n        \"appID\": \"[YOUR APP ID HERE]\",\n        \"paths\": [\n          \"/uni/*\"\n        ]\n      }\n    ]\n  }\n}\n```\n\n<call-out>\n\nWhen configuring your universal links in iOS, you specify which paths you want to be handled by the app by using the `paths` argument in the `apple-app-site-association` file. You must flag your universal links with the attribute `universal=true` as documented [here](#flagging-your-universal-links). In your `apple-app-site-association`, by adding `[\"/uni/*\"]` into `paths`, it ensures your flagged universal links clicks are properly tracked by SendGrid and [are handled by the app appropriately](#resolving-sendgrid-click-tracking-links).\n\n</call-out>\n\n<call-out type=\"warning\">\n\n**Do not** append the JSON file extension to your apple-app-site-association file!\n\n</call-out>\n\n ### \tExample assetlinks.json file:\n\n```json\n[\n  {\n    \"target\": {\n      \"namespace\": \"android_app\",\n      \"package_name\": \"[YOUR APP’S PACKAGE NAME]\",\n      \"sha256_cert_fingerprints\": [\n        \"[YOUR APP FINGERPRINT HERE]\"\n      ]\n    },\n    \"relation\": [\n      \"delegate_permission/common.handle_all_urls\"\n    ]\n  }\n]\n```\n\n<call-out>\n\nWhen configuring your universal links in iOS, you specify which paths you want to be handled by the app by using the `paths` argument in the `apple-app-site-association` file. By specifying only the path `[\"/uni/*\"]`, and using the `universal=true` attribute on your links as documented below, only appropriate links will be handled by the app, and others will be opened in the phone's browser.\n\nAndroid requires that you specify these paths inside your app, rather than the assetlinks.json file. This is accomplished by adding intent filters for specific hosts and paths. Please visit [Google's Android Developer Documentation](https://developer.android.com/training/app-links/deep-linking) to learn how to add an intent filter to your app manifest that can handle your universal links.\n\n</call-out>\n\n\nOnce you have created and configured your Android and iOS configuration files, you will have to host them on a secure HTTPS server. Keep reading below to learn how you can host these files on either [Amazon CloudFront](https://aws.amazon.com/cloudfront/) or [NGINX](https://www.nginx.com/).\n\n## \tSetting Up Universal Links Using CloudFront\n\nAfter creating your iOS \"apple-app-site-association\" file and/or your Android \"digital asset links\" file, you need to host them on a secure content delivery network. The following instructions will guide you through setting up Amazon's CloudFront to host these files.\n\n1. Navigate to [Amazon CloudFront](https://aws.amazon.com/cloudfront/). Once you have created an account or are logged into your existing account, create a new **S3 bucket** and give it a unique name (e.g. links-example-com)\n\n2. Upload your \"apple-app-site-association\" file into the root of the new S3 bucket\n\n3. Under **Permissions** on the uploaded file, add a permission for **Everyone** to **Open/Download** (or **Read** in the new S3 UI), then hit **Save**\n\n4. Under **Metadata** on the uploaded file, change the **Content-Type** value to **application/json**, then hit **Save**\n\n    ![]({{root_url}}/images/universal_links_1.png)\n5. Create a new folder in the bucket called “.well-known”\n\n6. Inside of the \".well-known\" folder, upload the same \"apple-app-site-association\" file as in step 2\n\n7. As above, add a permission for **Everyone** to **Open/Download** (or **Read** in the new S3 UI) and change the Content-Type to “application/json”\n\n8. Inside of the “.well-known” folder, upload your “assetlinks.json”\n\n9. Repeat step 7 for your \"assetlinks.json\" file: add a permission for **Everyone** to **Open/Download** (or **Read** in the new S3 UI) and change the Content-Type to “application/json”\n\n10. Navigate to the **AWS Certificate Manager**\n\n11. Request a new certificate for the domain your link branding is configured for (e.g. links.example.com)\n\n12. AWS will send an email to the appropriate domain owners, requesting them to approve the certificate\n\n    ![]({{root_url}}/images/universal_links_2.png)\n13. Ensure that the certificate is approved and issued\n\n14. Navigate to AWS CloudFront\n\n15. Create a new Distribution that is a Web delivery method\n\n16. Under the **Origin Settings** section, set the fields as follows:\n\n    ![]({{root_url}}/images/universal_links_3.png)\n\n    * **Origin Domain Name:** sendgrid.net\n    * **Origin ID:** sendgrid.net\n    * **Origin SSL Protocols:** only TLSv1.2\n    * **Origin Protocol Policy:** HTTPS Only\n17. Under the **Default Cache Behavior Settings** section, set the fields as follows:\n\n    ![]({{root_url}}/images/cloudfront-cache-based.png)\n\n    * **Cache Based on Selected Request Headers:** All\n    * **Query String Forwarding and Caching:** Forward all, cache based on all\n18. Under the **Distribution Settings** section, set the fields as follows:\n\n    ![]({{root_url}}/images/universal_links_5.png)\n\n    * **Alternate Domain Names:** links.example.com\n    * **SSL Certificate:** Custom SSL Certificate, pointing to the appropriate ACM certificate\n19. Hit **Create Distribution**\n\n20. Once the distribution is created, click into **Distribution Settings**\n\n21. Under the **Origins** tab, create a new origin with the following details\n\n    ![]({{root_url}}/images/universal_links_6.png)\n\n    * **Origin Domain Name:** links-example-com.s3.amazonaws.com\n    * **Origin ID:** s3\n22. Click **Create**\n\n23. Under the **Behaviors** tab, create a new behavior with the following details\n\n    ![]({{root_url}}/images/universal_links_7.png)\n\n    * **Path Pattern:** apple-app-site-association\n    * **Origin:** s3\n    * **Viewer Protocol Policy:** HTTPS Only\n24. Click **Create**\n\n25. Create another behavior with the following details\n\n    * **Path Pattern:** .well-known/apple-app-site-association\n    * **Origin:** s3\n    * **Viewer Protocol Policy:** HTTPS Only\n26. Click **Create**\n\n27. Create a third behavior with the following details\n\n    * **Path Pattern:** .well-known/assetlinks.json\n    * **Origin:** s3\n    * **Viewer Protocol Policy:** HTTPS Only\n28. Hit **Create**\n\n29. Ensure that the **Behaviors** are sorted so that the **Default** is the last onNewIntent\n\n    ![]({{root_url}}/images/universal_links_8.png)\n30. Wait for the distribution to deploy\n\n31. Verify that the distribution serves up the expected files (do this without changing the real DNS to avoid causing any issues with existing links)\n\n    * https://links.example.com/apple-app-site-association\n    * https://links.example.com/.well-known/apple-app-site-association\n    * https://links.example.com/.well-known/assetlinks.json\n    * https://links.example.com/wf/click?upn=\n\n32. Verify behavior using [https://branch.io/resources/universal-links/](https://branch.io/resources/universal-links/)\n\n## \tSetting Up Universal Links Using NGINX\n\nAfter creating your iOS \"apple-app-site-association\" file and/or your Android \"digital asset links\" file, you need to host them on a secure content delivery network. The following instructions will guide you through setting up NGINX to host these files.\n\n1. Request a new certificate for the domain your link branding is configured for (e.g. links.example.com)\n\n2. Place the certificate chain into the file named **/etc/pki/tls/certs/links.example.com.crt**\n\n3. Place the private key into the file named **/etc/pki/tls/private/links.example.com.key**\n\n4. Create the following directory **/var/www/links.example.com**\n\n5. Create the file **/var/www/links.example.com/apple-app-site-association**, with the appropriate content for your apple-app-site-association file, as explained in [Apple's Developer Documentation](https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html).\n\n6. Create the directory **/var/www/links.example.com/.well-known**\n\n7. Create the file **/var/www/links.example.com/.well-known/apple-app-site-association**, with the appropriate content for your apple-app-site-association file\n\n8. Create the file **/var/www/links.example.com/.well-known/assetlinks.json**, with the appropriate content for your digital asset links file, as explained in [Google's Developer Documentation](https://developers.google.com/digital-asset-links/v1/getting-started#key-terms).\n\n9. Create the file **/etc/nginx/conf.d/links.example.com.conf**, with the following content:\n\n```\n\nserver {\n  listen 80;\n  listen 443 ssl;\n  server_name 'links.example.com';\n  ssl_certificate '/etc/pki/tls/certs/links.example.com.crt';\n  ssl_certificate_key '/etc/pki/tls/private/links.example.com.key';\n  location = /apple-app-site-association {\n    root '/var/www/links.example.com';\n    default_type 'application/json';\n  }\n  location = /.well-known/apple-app-site-association {\n    root '/var/www/links.example.com';\n    default_type 'application/json';\n  }\n  location = /.well-known/assetlinks.json {\n    root '/var/www/links.example.com';\n    default_type 'application/json';\n  }\n  location / {\n    proxy_pass 'https://sendgrid.net';\n    proxy_set_header 'Host' 'links.example.com';\n  }\n}\n\n```\n\n## \tFlagging Your Universal Links\n\n<call-out>\n\nIt is important to make sure that only the links within your email that point to your app are flagged as universal links.\n\n</call-out>\n\nIt is not unusual to include links to pages outside of your app alongside links to your app in the same email. Not all of these links should be treated as universal links. For example, if you have Facebook or Twitter links tagged as universal links, users will be taken to your app when they click those links instead of being taken to your Facebook and Twitter pages.\n\n**To flag links to your app as universal links, simply include the attribute `universal=\"true\"` within the HTML link of your email.**\n\n**SendGrid adds the `/uni/` parameter to flagged universal links**\n\nFor example:\n\n`<a href=\"links.example.com\" universal=\"true\">Link to your app!</a>`\n\nThis way, as long as your association file has the `paths` restricted to `/uni/*` as we recommend above, only the links that you want to be handled by your app will be.\n\nIf you exclude the `universal=\"true\"` attribute, your links will still function, but they will take your recipient to their mobile browser.\nIf you exclude the `/uni/*` path in your `apple-app-site-association`, the _all_ links for your authenticated domain will be forwarded for your app to handle, which may cause issues.\n\n## \tResolving SendGrid Click Tracking Links\n\n ### \tHandling Click Tracking Links In Your App\n\nNow that you've successfully set up your app to open SendGrid click tracking links, you'll want to ensure that your app handles them properly. The link your app receives will be the SendGrid encoded link, so you'll want to resolve the link in order to:\n\n1. Trigger the \"click\" event in your SendGrid account for statistics.\n2. Find the original URL to determine which part of your app the user should be taken to.\n\nThe following code examples help to illustrate what logic should be included within your own app to guarantee that your links are resolved, and tracked by SendGrid.\n\n ### \tResolving Links in iOS\n\nIf you have written your app for iOS, you can use `NSURLSession` resolve the link.\n\nFor example:\n\n#### Using Swift\n\n```\n\nfunc application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {\n    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {\n        guard let encodedURL = userActivity.webpageURL else {\n            print(\"Unable to handle user activity: No URL provided\")\n            return false\n        }\n        let task = URLSession.shared.dataTask(with: encodedURL, completionHandler: { (data, response, error) in\n            guard let resolvedURL = response?.url else {\n                print(\"Unable to handle URL: \\(encodedURL.absoluteString)\")\n                return\n            }\n            // Now you have the resolved URL that you can\n            // use to navigate somewhere in the app.\n            print(resolvedURL)\n        })\n        task.resume()\n    }\n    return true\n}\n\n```\n\n#### Using Objective-C\n\n```\n\n- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {\n    if (userActivity.activityType == NSUserActivityTypeBrowsingWeb) {\n        NSURL *encodedURL = userActivity.webpageURL;\n        if (encodedURL == nil) {\n            NSLog(@\"Unable to handle user activity: No URL provided\");\n            return false;\n        }\n        NSURLSession *session = [NSURLSession sharedSession];\n        NSURLSessionDataTask *task = [session dataTaskWithURL:encodedURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {\n            if (response == nil || [response URL] == nil) {\n                NSLog(@\"Unable to handle URL: %@\", encodedURL.absoluteString);\n                return;\n            }\n            // Now you have the resolved URL that you can\n            // use to navigate somewhere in the app.\n            NSURL *resolvedURL = [response URL];\n            NSLog(@\"Original URL: %@\", resolvedURL.absoluteString);\n        }];\n        [task resume];\n    }\n    return YES;\n}\n\n```\n\n ### \tResolving Links in Android\n\nIf you have written your app for Android, you can use `HttpURLConnection` to resolve the URL by setting `setInstanceFollowRedirects` to `false`.\n\nFor example:\n\n#### Using Java\n\n```java\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    onNewIntent(getIntent());\n}\n\nprotected void onNewIntent(Intent intent) {\n    String action = intent.getAction();\n    final String encodedURL = intent.getDataString();\n    if (Intent.ACTION_VIEW.equals(action) && encodedURL != null) {\n        Log.d(\"App Link\", encodedURL);\n        new Thread(new Runnable() {\n            public void run() {\n                try {\n                    URL originalURL = new URL(encodedURL);\n                    HttpURLConnection ucon = (HttpURLConnection) originalURL.openConnection();\n                    ucon.setInstanceFollowRedirects(false);\n                    URL resolvedURL = new URL(ucon.getHeaderField(\"Location\"));\n                    Log.d(\"App Link\", resolvedURL.toString());\n                }\n                catch (MalformedURLException ex) {\n                    Log.e(\"App Link\",Log.getStackTraceString(ex));\n                }\n                catch (IOException ex) {\n                    Log.e(\"App Link\",Log.getStackTraceString(ex));\n                }\n            }\n        }).start();\n    }\n}\n\n```\n"
  },
  {
    "path": "content/docs/ui/sending-email/unsubscribe-groups.md",
    "content": "---\nlayout: page\nweight: 90\ntitle: Unsubscribe Groups\ngroup: delivery-optimization\nseo:\n  title: Unsubscribe Groups\n  description: Suppression Manager helps you to define and manage unsubscribe groups to keep you out of the spam folder.\n  keywords: subscription manager, suppression manager, unsubscribe manager, unsubscribe manager\nnavigation:\n  show: true\n---\n\nWhen a user unsubscribes from a type of email being sent to them at the sender account level, SendGrid will suppress all of your attempts at sending this type of email to that user. This means that the contact information is still in your contact database or you can send this contact’s email via the API. Regardless, emails will not be sent to this contact’s email.\n\nFor example, if you had an outdated email list (not something we recommend by the way) and sent an email to that list, but a user on that list had previously unsubscribed from that type of email from you, they would not get the email because the email would never leave SendGrid. It would be suppressed from being sent. A contact’s emails will only be suppressed if they unsubscribe from that sender’s emails, unsubscribing from one sender’s list will have no effect on suppression lists owned by other senders.\n\n## Overview\n\nSuppression Management gives you the ability to create unsubscribe groups that represent types of email that you regularly send to your recipients.\n\n_For example: receipts, social notifications, and account alerts._\n\nYou can then give your recipients more control over the types of emails they want to receive by letting them opt out of messages from a certain group. This means getting the right messages to your recipient’s inbox, resulting in a stronger relationship with your recipients and a better sending reputation.\n\n<call-out>\n\nMake sure your group names and descriptions are customer friendly! Your customers will see these group names and descriptions when they unsubscribe from your emails.\n\n</call-out>\n\nAll of your groups will be visible on the [Suppression Management](https://app.sendgrid.com/suppressions/advanced_suppression_manager) page, along with the descriptions you defined when you created the groups. There are also [Suppression Management API](https://sendgrid.api-docs.io/v3.0/suppressions-suppressions) endpoints for managing your groups and suppressions.\n\n## Add An Unsubscribe Group\n\n<call-out>\n\nThere is a limit of 25 groups per user.\n\n</call-out>\n\nTo add a new group, click the “Create New Group” button at the top right of the page. Then, you will be asked to name your Unsubscribe Group and add the description. Click “Done” and you will see your new group in the list of all of your unsubscribe groups.\n\n### Default Groups\n\nDefault groups are those that are shown by default when a recipient chooses to unsubscribe from your emails. SendGrid will always show all of the default groups, so if you don’t want one of those groups to be displayed all the time, make sure that it is not set as a default group.\n\nYou can also specify which groups to display at send time by using the [`\"asm_groups_to_display\"` feature]({{root_url}}/for-developers/sending-email/suppressions#defining-asm-groups-to-display-on-the-manage-preferences-page) of the SMTP API.\n\n## Add Recipients to an Unsubscribe Group\n\nYou may want to preload an unsubscribe group or add recipients to an unsubscribe group if you are moving from another email provider or have customers request to be removed from a specific list. We provide 2 ways to do this, via CSV file or manually.\n\n### Upload a CSV To Add Unsubscribe Group Recipients\n\n<call-out type=\"warning\">\n\nThe emails should not be enclosed in quotes and should NOT be formatted like `fname lname <email@example.com>`\n\n</call-out>\n\n<call-out>\n\nThis CSV should have a list of email addresses in the first column. It can include a header row or extra columns, but this ancillary information will be ignored.\n\n</call-out>\n\nTo upload a CSV of recipients who should not receive this group’s emails, click the gear icon at the right of the Unsubscribe Group name. When you select “upload CSV” a window will pop out. Drag your CSV and click “Done”. SendGrid will consume your CSV file and add the emails it finds to your group. From that point on, any emails sent with this group will not go to the recipients in this list. To view which group a recipient is in, go to the [Group Unsubscribes](https://app.sendgrid.com/suppressions/group_unsubscribes) page and search by that recipient’s email address.\n\n### Manually Add Unsubscribe Group Recipients\n\nTo manually add a recipient who should not receive this group’s emails, click the gear icon at the right of the unsubscribe group name. When you select “manual add” a window will pop out with a form where you can enter a valid email address. Once you click “Done”, any emails sent with this unsubscribe group will not go to this recipient. To view which group a recipient is in, go to the [Group Unsubscribes](https://app.sendgrid.com/suppressions/group_unsubscribes) page and search by that recipient’s email address.\n\n## Export an Unsubscribe Group List\n\nIf you would like to see which recipients email addresses are in a group or if you would like to migrate one group to another, click the gear icon next to your group name and select “Export”. This will cause a CSV file to download to your browser.\n\n## Edit an Unsubscribe Group\n\nTo Edit an unsubscribe group, you can either choose “Edit Details” from the gear icon in your unsubscribe group list or you can click the name of your group and click the “Edit Details” button at the top of the screen. From there, you will be able to change the name and description of the group. Click “Save” to keep your changes.\n\n## Delete an Unsubscribe Group\n\n<call-out type=\"warning\">\n\nDeleting a group is permanent. It cannot be undone.\n\n</call-out>\n\nTo delete an unsubscribe group, select “Delete” and then “confirm” from the gear icon to the right of your group in the group list or click the name of your group and then click the “Delete” and then “Confirm” buttons.\n\n## Using the API\n\nWhen you use the [SendGrid API with unsubscribe groups](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups/retrieve-all-suppression-groups-associated-with-the-user), you can include the unsubscribe group ID with your mail send calls. To get the ID, go to your unsubscribe group list and you will find the ID in the “Group ID” column.\n\n## Additional Resources\n\n- [Bounces]({{root_url}}/ui/sending-email/bounces/)\n- [Group Unsubscribes](https://app.sendgrid.com/suppressions/group_unsubscribes)\n- [SendGrid API with unsubscribe groups](https://sendgrid.api-docs.io/v3.0/suppressions-unsubscribe-groups)\n"
  },
  {
    "path": "content/docs/ui/sending-email/warming-up-an-ip-address.md",
    "content": "---\nseo:\n  title: Warming Up an IP Address\n  description: Learn how to warmup your new dedicated IP address and why it's important.\n  keywords: warm, up, warmup, auto, automatic, manual API, v3, ip, pool, warmup, pools\ntitle: Warming Up an IP Address\ngroup: delivery-optimization\nweight: 0\nlayout: page\nnavigation:\n  show: true\n---\n<iframe src=\"https://player.vimeo.com/video/80755248\" width=\"700\" height=\"400\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n\n\nWhen you add a new dedicated IP address to your account, you need to warm it up. You also need to warmup your IP if you haven't sent on it in more than 30 days. [Warming up your IP]({{root_url}}/glossary/ip-warmup/) allows you to gradually send more emails over your new IP to establish a good [sender reputation]({{root_url}}/glossary/account-reputation-dashboard/).\n\nIP warming is the practice of gradually increasing the volume of mail sent with a dedicated IP address according to a predetermined schedule. This gradual process helps to establish a reputation with ISPs (Internet Service Providers) as a legitimate email sender.\n\nWhen an ISP observes email suddenly coming from a new or \"cold\" IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. Since ISPs treat email volume as a key determining factor when detecting spam, it is best to begin sending a low to moderate volume, eventually working your way up to larger volumes. This gives the receiving email providers a chance to closely observe your sending habits and record how your recipients engage with your email.\n\nA gradual warmup does not always guarantee a perfect sending reputation. It is still important to follow sending [best practices](https://sendgrid.com/blog/10-tips-to-keep-email-out-of-the-spam-folder/).\n\n<call-out>\n\nIt is much easier to establish a positive reputation as a new sender, than it is to repair an existing reputation.\n\n</call-out>\n\n## \tWarmup types\n\nThere are 2 ways to warmup your IP. If your dedicated IP is relatively new, or you've never had one before, you need to warmup your IP manually. If you are adding new dedicated IPs to existing warm IPs, you can automatically warmup your IP with the UI or the API. When your IP is being warmed up, your hourly sending limits are in the table below in the \"[Automated IP warmup hourly send schedule]({{root_url}}/ui/sending-email/warming-up-an-ip-address/#automated-ip-warmup-hourly-send-schedule)\" section. \n\n ### \tManually warmup your IP\n\nTo manually warmup your IP, you need to gradually send more and more email over your IP address at the rate in our suggested [IP Warmup Schedule]({{root_url}}/assets/IPWarmupSchedule.pdf). When sending through a new domain and IP address, you are inherently more susceptible for receiving blocks, deferrals, and other reputation-related email errors because recipient servers do not recognize your mail. It's important to build this reputation over time, which is why we recommend the throttling via IP warm-up as soon as you receive your new dedicated IP. This is a manual process for users with 1 IP and would involve that you segment your sending by breaking up contacts into smaller lists and scheduling your campaigns, as a suggestion. The goal with IP warm-up is to avoid and/or mitigate deliverability issues that come with lack of reputation such as blocks, deferrals, or bounces.\n\n<call-out>\n\nThe goal of warming up is to ramp up your sending volume to your anticipated “normal” levels. For example, if you have a Pro 100k account, you don't need to warmup to 2 million emails as that will exceed your account limits and is unnecessary if you're only sending 100,000 emails a month.\n\n</call-out>\n\n ### \tAutomated IP warmup\n \nIn order to take advantage of automated IP warmup, you need to have two or more IP addresses so you can warm up one automatically while the other (already warm IP) acts as an overflow for any emails that exceed the hourly limit. Automatic IP warmup allows Twilio SendGrid to throttle the number of emails for you, avoiding you damaging your sender reputation. \n\n*To set up automated IP warmup in the UI:*\n\n1. Go to [Settings > IP Addresses](https://app.sendgrid.com/settings/ip_addresses).\n2. Click the action menu for the IP you want to warmup. This brings up the **Edit Your Dedicated IP Address** screen.\n3. Select **Use Automated IP warmup**.\n4. Save the **Edit Your Dedicated IP Address** screen.\n\n ### \tAutomated IP warmup API\n\nYou can also put your IP address into warmup mode with our [Automated Warmup API](https://sendgrid.api-docs.io/v3.0/ip-warmup) - this automatically throttles traffic sent through your new IP according to our [warmup schedule]({{root_url}}/assets/IPWarmupSchedule.pdf). Any email requests that exceed this hourly limit will overflow to any other existing warm IPs on your account.\n\n<call-out type=\"warning\">\n\nWhen automatically warming up an IP, SendGrid limits the amount of email sent through that IP per hour. Any email requests that exceed this hourly limit will overflow to any other existing warm IPs on your account. If you do not have any other warm IPs, you should warmup your IP manually.\n\n</call-out>\n\n ### \tAutomated IP warmup hourly send schedule\n\n<table class=\"table table-striped table-bordered\">\n <tr>\n   <td>\n      Warmup Age (Days)\n   </td>\n   <td>\n      Hourly Email Limit\n   </td>\n</tr>\n<tr>\n   <td>\n      0\n   </td>\n   <td>\n      20\n   </td>\n</tr>\n<tr>\n   <td>\n      1\n   </td>\n   <td>\n      28\n   </td>\n</tr>\n<tr>\n   <td>\n      2\n   </td>\n   <td>\n      39\n   </td>\n</tr>\n<tr>\n   <td>\n      3\n   </td>\n   <td>\n      55\n   </td>\n</tr>\n<tr>\n   <td>\n      4\n   </td>\n   <td>\n      77\n   </td>\n</tr>\n<tr>\n   <td>\n      5\n   </td>\n   <td>\n      108\n   </td>\n</tr>\n<tr>\n   <td>\n      6\n   </td>\n   <td>\n      151\n   </td>\n</tr>\n<tr>\n   <td>\n      7\n   </td>\n   <td>\n      211\n   </td>\n</tr>\n<tr>\n   <td>\n      8\n   </td>\n   <td>\n      295\n   </td>\n</tr>\n<tr>\n   <td>\n      9\n   </td>\n   <td>\n      413\n   </td>\n</tr>\n<tr>\n   <td>\n      10\n   </td>\n   <td>\n      579\n   </td>\n</tr>\n<tr>\n   <td>\n      11\n   </td>\n   <td>\n      810\n   </td>\n</tr>\n<tr>\n   <td>\n      12\n   </td>\n   <td>\n      1,000\n   </td>\n</tr>\n<tr>\n   <td>\n      13\n   </td>\n   <td>\n      1,587\n   </td>\n</tr>\n<tr>\n   <td>\n      14\n   </td>\n   <td>\n      2,222\n   </td>\n</tr>\n<tr>\n   <td>\n      15\n   </td>\n   <td>\n      3,111\n   </td>\n</tr>\n<tr>\n   <td>\n      16\n   </td>\n   <td>\n      4,356\n   </td>\n</tr>\n<tr>\n   <td>\n      17\n   </td>\n   <td>\n      6,098\n   </td>\n</tr>\n<tr>\n   <td>\n      18\n   </td>\n   <td>\n      8,583\n   </td>\n</tr>\n<tr>\n   <td>\n      19\n   </td>\n   <td>\n      11,953\n   </td>\n</tr>\n<tr>\n   <td>\n      20\n   </td>\n   <td>\n      16,734\n   </td>\n</tr>\n<tr>\n   <td>\n      21\n   </td>\n   <td>\n      23,427\n   </td>\n</tr>\n<tr>\n   <td>\n      22\n   </td>\n   <td>\n      32,798\n   </td>\n</tr>\n<tr>\n   <td>\n      23\n   </td>\n   <td>\n      45,917\n   </td>\n</tr>\n<tr>\n   <td>\n      24\n   </td>\n   <td>\n      64,284\n   </td>\n</tr>\n<tr>\n   <td>\n      25\n   </td>\n   <td>\n      89,998\n   </td>\n</tr>\n<tr>\n   <td>\n      26\n   </td>\n   <td>\n      125,997\n   </td>\n</tr>\n<tr>\n   <td>\n      27\n   </td>\n   <td>\n      176,395\n   </td>\n</tr>\n<tr>\n   <td>\n      28\n   </td>\n   <td>\n      246,953\n   </td>\n</tr>\n<tr>\n   <td>\n      29\n   </td>\n   <td>\n      345,735\n   </td>\n</tr>\n<tr>\n   <td>\n      30\n   </td>\n   <td>\n      484,029\n   </td>\n</tr>\n<tr>\n   <td>\n      31\n   </td>\n   <td>\n      677,640\n   </td>\n</tr>\n<tr>\n   <td>\n      32\n   </td>\n   <td>\n      948,696\n   </td>\n</tr>\n<tr>\n   <td>\n      33\n   </td>\n   <td>\n      1,328,175\n   </td>\n</tr>\n<tr>\n   <td>\n      34\n   </td>\n   <td>\n      1,859,444\n   </td>\n</tr>\n<tr>\n   <td>\n      35\n   </td>\n   <td>\n      2,603,222\n   </td>\n</tr>\n</table>\n\n<call-out>\n\nIf you are sending transactional emails, you do not need to focus on a strict IP warmup schedule, as you cannot control the rate at which transactional emails will be triggered through the account. If you are sending marketing emails, you will need to follow some sort of IP warmup; this involves gradually increasing your sending day by day on this new IP. The slower you can warm up the better. This way, you can locate and fix any anomalies and issues that arise when you first begin sending, helping your deliverability long term.\n\n</call-out>\n\n## \tWhy don't other ESPs require IP warmup?\n\nSome email service providers do not offer dedicated IP addresses to their customers - they place all of their customers on shared IP groups by default. Warming up is not required for a shared IP group - SendGrid handles this automatically.\n\nHaving a dedicated IP allows you to control your own reputation completely, and prevents your sending from being impacted by the reputations of other SendGrid users.\n\n\n## \tAdditional Resources\n\n- [Adding a dedicated IP]({{root_url}}/ui/account-and-settings/dedicated-ip-addresses/)\n- [IP Access Management]({{root_url}}/ui/account-and-settings/ip-access-management/)\n- [SendGrid billing information]({{root_url}}/ui/account-and-settings/billing/)\n"
  },
  {
    "path": "content/docs/ui/sending-email/weblink.md",
    "content": "---\nlayout: page\nweight: 0\ngroup: marketing-campaigns\ntitle: The Weblink Substitution Tag\nseo:\n  title: The Weblink Substitution Tag\n  description: The Webklink tag is replaced with a link that will open the email in a Twilio SendGrid-hosted webpage. This feature makes it possible to view an email when an email client fails to open or properly render the message.\n  keywords: design, templates, browser, webpage, open in browser\nnavigation:\n  show: true\n---\n\nYour emails will likely be opened on a variety of email clients that all support different HTML and CSS features. Email clients may display messages incorrectly, and, in some cases, they may not open a message at all.\n\nInconsistent behavior across email clients is inconvenient at best, and it presents real barriers for recipients who rely on accessibility tools such as screen readers.\n\nThe Marketing Campaigns Weblink feature makes it possible for recipients to view your email in a Web browser where modern HTML and CSS, as well as accessibility features, are better supported.\n\n## Add Weblink to your design\n\nWeblink is a [Substitution Tag]({{root_url}}/ui/sending-email/editor/#using-substitution-tags); however, `{{Weblink}}` is not meant to be included in your design alone. The `{{Weblink}}` tag will be replaced by a URL. This means that you must add the `{{Weblink}}` tag as the URL to a link element — usually some text. For those familiar with HTML, `{{Weblink}}` is assigned to the `href` attribute of an anchor tag.\n\n```html\n<a href=\"{{Weblink}}\">Open this email in a Web browser</a>\n```\n\n### Design Editor\n\nWhen using the Design Editor, you can add a Weblink as the URL for any link in your design.\n\n#### Add the Weblink tag to text using a module's UI\n\n1. In a Text module, add an appropriate call to action such as, \"Open this email in a Web browser.\"\n2. Highlight this text and format it as a link using the **Text Module Styles** options.\n\n![Text Module Styles menu with the link icon highlighted]({{root_url}}/img/weblink_text_module_link_tool.png 'Text Module Styles')\n\n3. A modal will appear where you can add the `{{Weblink}}` tag. Select **CustomURL** as the **Link Type**, and type `{{Weblink}}` in the `Link URL` field.\n\n![A modal with two fields, a link type and the link URL]({{root_url}}/img/weblink_add_link_modal.png 'Add Link modal')\n\n4. Select **OK**, and your link will be included in any Single Send or Automation that uses the design.\n\n#### Add the Weblink tag using a module's code interface\n\nYou can also add a link by modifying the underlying HTML code for a drag-and-drop module.\n\n1. Select **Edit Module HTML** from above the module itself. The icon is an opening and closing bracket.\n\n![An opening and closing angle bracket that will open a code editor window for the module.]({{root_url}}/img/weblink_module_edit_html.png 'Edit Module HTML')\n\n2. A code editor will open where you can place an anchor tag. To achieve the same result as when using the UI, your code will look like the following example. Notice that the `{{Weblink}}` tag is placed inside the `href` attribute rather than a regular URL.\n\n```html\n<div style=\"font-family: inherit\">\n  <a href=\"{{Weblink}}\">Open this email in a Web browser</a>.\n</div>\n```\n\n![A module's code editor interface with {{Weblink}} assigned to an href attribute]({{root_url}}/img/weblink_module_code_window.png 'Edit Module HTML')\n\n### Code Editor\n\nWhen using the Code Editor to build your design, you can add `{{Weblink}}` as the `href` attribute for any anchor tag where the link should appear.\n\n![The Code Editor interface with {{Weblink}} assigned to an href attribute]({{root_url}}/img/weblink_code_editor.png 'Add {{Weblink}} to an anchor tag')\n\n## Test Weblink in your design\n\nWeblink URLs are generated after your email is scheduled to send. For this reason, you will not be able to test the Weblink directly from the Editors' **Preview** windows when building your Single Send or Automation. Instead, you can send a test email.\n\n1. Using either the Design or Code Editor, select your design's **Settings** tab. Then twirl open the **Test Your Email** menu.\n2. Add one of your [verified senders]({{root_url}}/ui/sending-email/sender-verification/) in the **From Address** field and at least one address with an inbox you can check in the **Email Addresses** field.\n3. Click the **Send Test Message** button.\n\n![The Editor's Settings tab with example email addresses in the Test Your Email fields]({{root_url}}/img/weblink_test_email.png 'Test Your Email')\n\n4. You should now be able to open the email from the inbox where you sent the message. The test message will contain a working Weblink wherever you placed it in your design.\n"
  },
  {
    "path": "content/docs/ui/sending-email/working-with-marketing-campaigns-email-designs.md",
    "content": "---\nlayout: page\nweight: 85\ntitle: Working with Marketing Campaigns Email Designs\ngroup: marketing-campaigns\nnavigation:\n  show: true\nseo:\n  title: Working with Marketing Campaigns Email Designs\n  override: true\n  description:\n---\n\n<call-out>\n\nThis page refers to the new Marketing Campaigns product. If you’re using legacy Marketing Campaigns, your workflow will be a little different and your screen won’t look the same as the screenshots.\n\n</call-out>\n\nTwilio SendGrid Marketing Campaigns provides a full set of design tools you can use to deliver professional looking templates that render beautifully across email clients.\n\nWe provide a collection of pre-built, responsive designs that you may begin using and customizing immediately, or you can create your own templates from scratch. Each Design is stored in the Marketing Campaigns Design Library and can be used to deliver [Single Sends]({{root_url}}/glossary/single-send) or [Automations]({{root_url}}/glossary/automated-email).\n\n## The Design Library\n\nYou can manage all of your Marketing Campaigns designs in the [Design Library](https://mc.sendgrid.com/design-library/your-designs). In addition to storing your current designs, you can browse and duplicate the pre-built [**SendGrid Email Designs**](https://mc.sendgrid.com/design-library/sendgrid-designs) and manage [**Your Images**](https://mc.sendgrid.com/design-library/your-images) from the Design Library as well.\n\n![The Design Library with each navigation tab highlighted and the \"Your Designs\" tab displayed]({{root_url}}/img/design_library_tabs.png 'The Design Library with \"Your Designs\" tab displayed.')\n\nFor more information about managing images with Marketing Campaigns, see the [Image Editor documentation]({{root_url}}/ui/sending-email/image-editor/).\n\n<call-out>\n\nYou can manage your designs programmatically with the [Design Library API](https://sendgrid.api-docs.io/v3.0/designs-api).\n\n</call-out>\n\n## Creating a new design\n\nTo create a new design, you can either build one from a blank template or duplicate an existing templates.\n\n### Building from a blank template\n\n<iframe src=\"https://player.vimeo.com/video/380559291\" width=\"640\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n1. Navigate to the **Design Library** in the SendGrid App.\n2. When the Design Library loads, you will be taken to the **Your Email Designs** tab.\n3. You will see a large **Create Email Design** button on the page. Click this button.\n\n![]({{root_url}}/img/design_library_create_email_design_button.png)\n\n4. After clicking **Create Email Design**, a new window will open where you can select which editor you wish to use—the **Design Editor** or the **Code Editor**.\n\n![A window with two large boxes displaying your choice of editor, the Design Editor or Code Editor]({{root_url}}/img/create_design_editor_options.png 'Choose an editor')\n\nThe Design Editor makes it possible to build and edit an email template with drag and drop modules that require no coding. The Code Editor is appropriate for customers who wish to build and edit templates by manipulating the HTML code directly. Once a design is created, it is not possible to change the editor used for that design. However, if you choose the design editor you'll still have HTML editing options, and with the code editor you'll enjoy convenient visual tools like side-by-side code and preview panes.\n\nFor full documentation on working with the editors, see our [Design and Code Editor documentation]({{root_url}}/ui/sending-email/editor/). For best practices regarding HTML email design, see our [Cross-Platform Email Design documentation]({{root_url}}/ui/sending-email/cross-platform-html-design/).\n\n5. Once you have selected an editor, the template will load in that editor and you can begin working with your template.\n\n<call-out>\n\nDevelopers can use the [POST /designs API endpoint](https://sendgrid.api-docs.io/v3.0/designs-api/create-design) to programmatically upload a design.\n\n</call-out>\n\n### Duplicating an existing design\n\nYou can create a new template by duplicating one of your existing templates or duplicating one of the Twilio SendGrid pre-built designs.\n\n<iframe src=\"https://player.vimeo.com/video/380558358\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\n\n1. From the **Design Library** select the **Your Email Designs** tab to duplicate one of your existing designs. Select **SendGrid Email Designs** to duplicate a Twilio SendGrid pre-built design.\n\n![The Design Library tabs to select between your designs and the pre-built designs]({{root_url}}/img/design_library_duplicate_tabs.png 'Select which templates you want to duplicate')\n\n2. Click the **action menu** at the bottom of the design you want to copy and select **Duplicate**\n\n![The design duplication menus highlighted in the Design Library]({{root_url}}/img/design_library_duplicate_your_designs.png 'Duplicate one of your designs')\n\n3. After clicking **Duplicate**, a new window will open where you can select which editor you wish to use—the **Design Editor** or the **Code Editor**.\n4. Once you have selected an editor, the template will load in that editor and you can begin working with your copy of the template.\n\n<call-out>\n\nDuplicated designs will have \"Duplicate:\" prepended to the **Email Design Name** by default. This text is meant to help you differentiate a duplicate from the original design until you change the name yourself.\n\n</call-out>\n\n<call-out>\n\nDevelopers can use the [POST /designs/{id} API endpoint](https://sendgrid.api-docs.io/v3.0/designs-api/duplicate-design) to programmatically duplicate one of their own designs and the [POST /designs/pre-builts/{id} API endpoint](https://sendgrid.api-docs.io/v3.0/designs-api/duplicate-sendgrid-pre-built-design) to duplicate one of the Twilio SendGrid designs.\n\n</call-out>\n\n## Editing a design\n\nYou can edit any of the designs in the **Your Email Designs** tab. You cannot edit one of the pre-built designs directly; you must duplicate the template first and make changes to your copy.\n\n1. Navigate to the design you want to edit.\n2. Click the **action menu** at the bottom of the design you want to modify and select **Edit**.\n\n![The Edit menu item button below a design]({{root_url}}/img/design_library_edit_your_designs.png 'Edit a design')\n\n3. The template will open in the editor originally used to create the campaign—the **Design Editor** or the **Code Editor**.\n\nAfter you create a design, you cannot switch between the design and code editor to modify that particular template. If you wish to switch editors, you can duplicate the design and select the alternate editor during the duplication process.\n\n## Designs and Single Sends\n\nYou can use any of your designs to deliver a [Single Send]({{root_url}}/glossary/single-send/). Single Sends are one-time nonautomated email messages commonly used to deliver newsletters, promotions, policy updates, and more. You can either create a Single Send from a design or add a design to your Design Library from a Single Send.\n\n## Create a Single Send from an existing design\n\n1. In the **Design Library**, you can select either the **Your Email Designs** or **SendGrid Email Designs** tab.\n2. Click the **action menu** at the bottom of the design you want to use for your Single Send and select **Create Single Send**.\n\n![The Create a Single Send menu item button below a design]({{root_url}}/img/design_library_create_single_send.png 'Create a Single Send from a design')\n\n3. After clicking **Create Single Send**, a new window will open where you can select which editor you wish to use—the **Design Editor** or the **Code Editor**.\n\n![A window displaying two large boxes as editor options, the Design Editor or the Code Editor]({{root_url}}/img/create_single_send_editor_choice.png 'Choose an editor for your Single Send')\n\n4. Once you select an editor, your Single Send will open, allowing you to finish the Single Send setup process.\n\nFor more information about delivering a Single Send, see [How to Send Email with new Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n\n<call-out>\n\nYou can manage Single Sends programmatically with the [Single Sends API](https://sendgrid.api-docs.io/v3.0/single-sends).\n\n</call-out>\n\n## Create a new design from an existing Single Send\n\nIf you have a Single Send that uses a design you would like to manage in your Design Library, you can add the design from the Single Send.\n\n1. From the left-hand navigation, select **Marketing**, and then click **Single Sends**.\n\n![The SendGrid App with the Marketing Campaigns and Single Sends navigation items highlighted]({{root_url}}/img/marketing_single_sends_nav_item.png 'Single Sends navigation menu item')\n\n2. Find the Single Send you would like to create a design from, click the **action menu** and select **Create Design**.\n\n![The action menu expanded below a Single Send with the Create Design menu item selected]({{root_url}}/img/single_send_create_design.png 'Create a design from a Single Send')\n\n3. After clicking **Create Design**, a new window will open where you can select which editor you wish to use—the **Design Editor** or the **Code Editor**.\n4. The Design used by the Single Send will now be added to your Design Library where you can edit, duplicate, and use it to deliver more Single Sends or Automations.\n\n## Designs and Automations\n\n[Automations]({{root_url}}/ui/sending-email/getting-started-with-automation/) allow you to send recurring emails or drip series automatically at a cadence you define. You can use any of the designs in the **Your Email Designs** or **SendGrid Email Designs** tabs to deliver one of the messages in your Automation series. You can also save a design from an Automation email to your Design Library.\n\n### Create a new template from an existing Automation email\n\n1. From the left-hand navigation, select **Marketing**, and then click **Automations**.\n2. Click the action menu next to the automation you want to duplicate an email from and then select **Edit**.\n\n![The Edit option selected from the action menu on an Automation]({{root_url}}/img/automation_action_menu_edit.png 'Edit an Automation')\n\n3. After selecting **Edit**, the Automation will load. Scroll to the email in the Automation that you would like to create a design from.\n4. Click the **action menu**, and then select **Create Design**.\n\n![The Create Design option selected in an Automation email's action menu]({{root_url}}/img/create_design_from_automation_email.png 'Create a design from an Automation email')\n\n4. After clicking **Create Design**, a new window will open where you can select which editor you wish to use—the **Design Editor** or the **Code Editor**.\n5. The Design used by the Automation email will now be added to your Design Library where you can edit, duplicate, and use it to deliver more Automations or Single Sends.\n\nFor more information about creating an Automation and assigning designs to the emails in a series, see [Getting Started with Automations]({{root_url}}/ui/sending-email/getting-started-with-automation/).\n\n## Working with the Design and Code editors\n\nThe Design and Code editors are both feature rich applications that include live previews, the ability to add test data, and more. For more detailed documentation about working with each editor, see our [Design and Code Editor documentation]({{root_url}}/ui/sending-email/editor/).\n\n## Additional Resources\n\n- [Sending an Email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n- [The Design and Code Editors]({{root_url}}/ui/sending-email/editor/)\n- [Cross-Platform Email Design]({{root_url}}/ui/sending-email/cross-platform-html-design/)\n- [Handlebars]({{root_url}}/for-developers/sending-email/using-handlebars/)\n- [Designs API reference](https://sendgrid.api-docs.io/v3.0/designs-api)\n"
  },
  {
    "path": "data/SiteConfig.js",
    "content": "const config = {\n  env: process.env.NODE_ENV,\n  docsDir: 'docs',\n  siteTitle: 'SendGrid Documentation',\n  siteTitleAlt: 'SendGrid Knowledge Center',\n  siteLogo: 'https://sendgrid.com/brand/sg-twilio/sg-twilio-lockup.svg',\n  ogImage: 'https://sendgrid.com/brand/sg-twilio/SG_Twilio_Lockup_Social.png',\n  siteUrl: 'https://sendgrid.com',\n  gitHubMarkdownPath: 'https://github.com/sendgrid/docs/tree/develop/content/docs',\n  pathPrefix: '/docs',\n  siteDescription: 'Learn how to get started using SendGrid. Integrate in minutes, test for free, and get access to documents to help solve your email deliverability problems.',\n  siteRss: '/rss.xml',\n  googleAnalyticsID: 'UA-12399264-1',\n  userTwitter: 'sendgrid',\n};\n\nconfig.envPrefix = process.env.NODE_ENV === 'development' ? '' : config.pathPrefix;\n\nmodule.exports = config;\n"
  },
  {
    "path": "first-timers-tr.md",
    "content": "# GitHub ile SendGrid Belgeleri Nasıl Düzenlenir \nSendGrid Belgelerini Düzenleme kolaydır! Bir hata veya yazım hatası görürseniz veya eklemek istediğiniz bir şey varsa önerilerinizi Dokümanlar için kullandığımız içerik yönetim sistemi olan GitHub ile yapabilirsiniz. Önerinizi gönderdikten sonra Dokümanlar ekibi, Dokümanlar web sitesine yayınlanmadan önce kolayca inceleyebilir.\nhttps://sendgrid.com/docs adresindeki herhangi bir sayfada değişiklik yapmak için şu adımları izleyin:\n1- Düzenlemek istediğiniz sayfaya gidin ve sayfanın altındaki -Bu sayfayı düzenle-'yi tıklayın.\nBu sizi sendgrid.com/docs GitHub deposuna veya repo'ya götürecektir. Bu, doküman sayfalarımızın saklandığı yerdir.\n2- Eğer bir GitHub hesabınız yoksa, değişiklik önermek için bir tane oluşturmanız gerekir. Bir hesap oluşturmak için sağ üst köşedeki Kayıt bağlantısını tıklayın. Kullanıcı adınızı, şifrenizi ve e-posta adresinizi girin. SendGrid çalışanıysanız, tam adınızı GitHub hesabınızla birlikte kullanın ve SendGrid'i şirketiniz olarak girin, böylece sizi kolayca tanımlayabiliriz.\nGitHub'da bir Dokümanlar sayfasını görüntüledikten sonra, düzenlemeye başlamak için kurşun kalem simgesini tıklayın.\n3- Değişikliklerinizi yaptıktan sonra, Çekme İsteğinde yeni bir şube oluşturma seçeneğine sahip olacaksınız. Bu, orijinal Dokümanlar'ın bir kopyasını veya dalını oluşturma isteğiniz, ancak değişikliklerinizle ilgilidir. Değişiklikleriniz onaylandıktan sonra, şubeniz tekrar orijinaline birleştirilir.\n4- Bir Çekme İsteği oluşturmak için bir Taahhüt Değişikliği formu doldurmanız gerekir. Yerleşik şablonu takip edin ve sayfaya yaptığınız tüm değişiklikler hakkında bilgi verin. Varsayılan şube seçeneğini ve adını bırakın.\n5- Bittiğinde, Dosya değişikliğini öner'i tıklayın. Dokümanlar Ekibi isteğiniz hakkında bilgilendirilecek. Değişikliği gözden geçirdikten sonra, siteye yayınlayacağız!\nSendGrid belgelerinin tüm katılımcıları, değişikliklerin birleştirilebilmesi için bir CLA imzalaması gerekir.\nSendGrid Belgeleri belirli stil kurallarına uymalıdır. Bu yönergelerin birçoğu küçük değişiklikler için geçerli olmasa da, Dokümanlar’nızın aşağıdakilerden emin olmamız önemlidir:\n- Özlü\n- Doğru\n- Organize edilmiş\n- Taranabilir\nDokümanlar katkıda bulunanlar profesyonel ve “koça benzeyen” bir ses tonu için çabalamalıdır. Belirsiz dil kullanmaktan kaçının ve doğru noktaya ulaşın. Uzun ve aşırı karmaşık açıklamalar, hızlı ve kolay bir cevap isteyen bir kullanıcıya yardımcı olmaz. Lütfen bu stil yönergelerine göre korkmayın. Çoğu küçük değişikliğe uygulanmazlar ve daha önemli değişiklikler yayınlanmadan önce Dokümanlar Ekibi tarafından incelenir ve düzenlenir.\nÖnemli düzenlemeler yapıyorsanız veya yeni içeriğin bir paragrafından fazlasını ekliyorsanız, SendGrid’in Stil Kılavuzu’na başvurmaktan çekinmeyin.\n"
  },
  {
    "path": "first-timers.md",
    "content": "# How To Edit the SendGrid Docs via GitHub\n\nEditing the SendGrid Documentation is easy!\nIf you see an error, a typo, or have something you would like to add, you can make your suggestion via GitHub, the content management system we use for the Docs. Once you have submitted your suggestion, the Docs team can easily review it before it is published to the Docs website.\n\nTo make changes to any page on https://sendgrid.com/docs, follow these steps:\n\n1. Navigate to the page you would like to edit and click **Edit this page** at the bottom of the page.\n\n<img src=\"https://github.com/sendgrid/docs/blob/develop/static/img/edit-this-page.png\" width=\"800\" height=\"500\">\n\nThis will take you to the sendgrid.com/docs GitHub repository, or repo. This is where our docs pages are stored.\n\n2. If you do not already have a GitHub account, you will have to create one in order to suggest a change. Click the Sign up link in the upper right-hand corner to create an account. Enter your username, password, and email address. If you are an employee of SendGrid, please use your full name with your GitHub account and enter SendGrid as your company so we can easily identify you. \n\n<img src=\"https://github.com/sendgrid/docs/blob/develop/static/img/docs_signup.png\" width=\"800\" height=\"500\">\n\nOnce you are viewing a Docs page in GitHub, click the pencil icon to begin editing:\n\n<img src=\"https://github.com/sendgrid/docs/blob/develop/static/img/docs_edit_github.png\" width=\"800\" height=\"500\">\n\n3. Once you have made your changes, you will be given the option of creating a new branch in a Pull Request. This is a request to create a copy, or branch, of the original Docs but with your changes. Once your changes are approved, your branch will then be merged back into the original. \n\n4. To create a Pull Request, you’ll have to fill out a Commit Changes form. Follow the built-in template and provide information about any changes you have made to the page. Leave the default branch option and name.\n\n5. When done, click **Propose file change**. The Docs Team will be notified of your request. Once we are able to review the change, we will publish it to the site!\n\n> All third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.\n\nThe SendGrid Documentation must follow certain style guidelines. While many of these guidelines are not applicable to small changes, it is important to make sure that our Docs are:\n\n* Concise\n* Accurate\n* Organized\n* Scannable\n\nDocs contributors should strive for a professional and “coach-like” tone of voice. Avoid vague language, and get right to the point. Long and overly complicated explanations are not helpful to a user who wants a quick-and-easy answer. Please don’t be intimidated by these style guidelines. They don’t apply to most minor changes, and more significant changes will be reviewed and edited by the Docs Team before publication.\n\nIf you are making substantial edits or are adding more than a paragraph of new content, feel free to refer to [SendGrid’s Style Guide](https://github.com/sendgrid/docs/blob/develop/styleguide.md).\n"
  },
  {
    "path": "gatsby-browser.js",
    "content": "exports.onClientEntry = () => {\n  (function () {\n    const path = 'https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css';\n    const link = document.createElement('link');\n    link.setAttribute('rel', 'stylesheet');\n    link.setAttribute('type', 'text/css');\n    link.setAttribute('href', path);\n    document.head.appendChild(link);\n    // require('./src/scss/style-guide.scss');\n  }());\n};\n\n/**\n * Push PageCategory as 'docs' to dataLayer\n */\nexports.onRouteUpdate = () => {\n  window.dataLayer = [\n    { PageCategory: 'docs' },\n    ...window.dataLayer,\n  ];\n};\n"
  },
  {
    "path": "gatsby-config.js",
    "content": "const config = require('./data/SiteConfig');\n\nconst pathPrefix = config.pathPrefix === '/' ? '' : config.pathPrefix;\nconst policyAccess = process.env.GATSBY_ENV === 'production' ? [{ userAgent: '*', allow: ['/'] }] : [{ userAgent: '*', disallow: ['/'] }];\n\nmodule.exports = {\n  pathPrefix: config.pathPrefix,\n  siteMetadata: {\n    siteUrl: config.siteUrl,\n    rssMetadata: {\n      site_url: config.siteUrl + pathPrefix,\n      feed_url: config.siteUrl + pathPrefix + config.siteRss,\n      title: config.siteTitle,\n      description: config.siteDescription,\n      image_url: `${config.siteUrl + pathPrefix}/logos/logo-512.png`,\n      author: config.userName,\n      copyright: config.copyright,\n    },\n  },\n  plugins: [\n    'gatsby-plugin-react-helmet',\n    'gatsby-plugin-sass',\n    'gatsby-plugin-sitemap',\n    {\n      resolve: 'gatsby-source-filesystem',\n      options: {\n        name: 'docs',\n        path: `${__dirname}/content/${config.docsDir}`,\n      },\n    },\n    {\n      resolve: 'gatsby-plugin-robots-txt',\n      options: {\n        host: config.siteUrl + pathPrefix,\n        sitemap: `${config.siteUrl}/docs/sitemap.xml`,\n        policy: policyAccess,\n      },\n    },\n    {\n      resolve: 'gatsby-plugin-google-tagmanager',\n      options: {\n        id: 'GTM-PQC59L',\n        includeInDevelopment: true,\n      },\n    },\n    {\n      resolve: 'gatsby-transformer-remark',\n      options: {\n        plugins: [\n          'sendgrid-remark-code-in-html',\n          'sendgrid-remark-paths',\n          {\n            resolve: 'gatsby-remark-images',\n            options: {\n              maxWidth: 690,\n            },\n          },\n          {\n            resolve: 'gatsby-remark-responsive-iframe',\n          },\n          'gatsby-remark-prismjs',\n          'gatsby-remark-copy-linked-files',\n          // 'gatsby-remark-autolink-headers',\n          'sendgrid-remark-headers',\n          'sendgrid-remark-tables',\n        ],\n      },\n    },\n    {\n      resolve: 'gatsby-plugin-nprogress',\n      options: {\n        color: config.themeColor,\n      },\n    },\n    'gatsby-plugin-sharp',\n    'gatsby-plugin-catch-links',\n    {\n      resolve: 'gatsby-plugin-segment-js',\n      options: {\n        prodKey: '1CjnBNPybWzyv10ssZRxdwmb8vrYF4yj',\n        devKey: 'QaZKJjbUWrCqNO0ObRrF64qDRVE40ZIr',\n        // This is done via GTM.\n        trackPage: true,\n      },\n    },\n    {\n      resolve: 'gatsby-plugin-manifest',\n      options: {\n        name: config.siteTitle,\n        short_name: config.siteTitle,\n        description: config.siteDescription,\n        start_url: config.pathPrefix,\n        background_color: config.backgroundColor,\n        theme_color: config.themeColor,\n        display: 'minimal-ui',\n        icons: [\n          {\n            src: '/brand/sg-mark.png',\n            sizes: '771x724',\n            type: 'image/png',\n          },\n        ],\n      },\n    },\n    // 'gatsby-plugin-offline',\n  ],\n};\n"
  },
  {
    "path": "gatsby-node.js",
    "content": "const path = require('path');\nconst _ = require('lodash');\nconst webpackLodashPlugin = require('lodash-webpack-plugin');\nconst crypto = require('crypto');\n\n/**\n * Generate node edges\n *\n * @param {any} { node, actions, getNode }\n */\nexports.onCreateNode = ({ node, actions, getNode }) => {\n  const { createNodeField } = actions;\n\n  /**\n   * Add slug edge\n   */\n  let slug;\n  if (node.internal.type === 'MarkdownRemark') {\n    const fileNode = getNode(node.parent);\n    const parsedFilePath = path.parse(fileNode.relativePath);\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'slug')\n    ) {\n      slug = `/${node.frontmatter.slug}`;\n    } else if (parsedFilePath.name !== 'index' && parsedFilePath.dir !== '') {\n      slug = `/${parsedFilePath.name}/`;\n    } else {\n      slug = `/${parsedFilePath.dir}/`;\n    }\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'slug')\n    ) {\n      slug = `/${_.kebabCase(node.frontmatter.slug)}`;\n    }\n    createNodeField({\n      node,\n      name: 'slug',\n      value: _.kebabCase(slug).toLowerCase(),\n    });\n\n    /**\n     * Add permalink edge\n     *\n     * If there is a path frontmatter - that overrides all.\n     * Otherwise, we'll use the nested directory structure to build the permalink.\n     */\n    let permalink;\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'path')\n    ) {\n      permalink = `/${node.frontmatter.path}${slug}`;\n    } else if (parsedFilePath.dir !== '') {\n      permalink = `/${parsedFilePath.dir}${slug}`;\n    } else {\n      permalink = slug;\n    }\n    createNodeField({\n      node,\n      name: 'permalink',\n      value: permalink.toLowerCase(),\n    });\n\n    /**\n     * Check if doc is \"ui\", \"for developers\", \"glossary\" or \"release-notes\" and add a field slug to represent this.\n     */\n    let docType;\n    if (permalink.match(/ui\\/[^/]+/)) {\n      docType = 'ui';\n    } else if (permalink.match(/for-developers\\/[^/]+/)) {\n      docType = 'for-developers';\n    } else if (permalink.match(/glossary\\/[^/]+/)) {\n      docType = 'glossary';\n    } else if (permalink.match(/release-notes\\/[^/]+/)) {\n      docType = 'release-notes';\n    }\n\n    createNodeField({ node, name: 'docType', value: docType });\n\n    let cat;\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'category')\n    ) {\n      cat = node.frontmatter.category;\n    } else {\n      // remove docType prefix\n      cat = parsedFilePath.dir.replace(`${docType}`, '');\n      cat = cat.split('/');\n      cat = cat.length > 1 && cat[1].length ? cat[1] : 'uncategorized';\n    }\n\n    createNodeField({ node, name: 'category', value: cat });\n\n    let group = 'ungrouped';\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'group')\n    ) {\n      group = node.frontmatter.group;\n    }\n    createNodeField({ node, name: 'group', value: group });\n\n    let title;\n    if (\n      Object.prototype.hasOwnProperty.call(node, 'frontmatter') &&\n      Object.prototype.hasOwnProperty.call(node.frontmatter, 'title')\n    ) {\n      title = node.frontmatter.title;\n    } else {\n      title = parsedFilePath.name.replace('-', '');\n    }\n    createNodeField({ node, name: 'title', value: title });\n  }\n};\n\nexports.createPages = ({ graphql, actions }) => {\n  const { createPage } = actions;\n\n  return new Promise((resolve, reject) => {\n    const docsPage = path.resolve('src/templates/doc.jsx');\n    const categoryPage = path.resolve('src/templates/category.jsx');\n\n    resolve(\n      graphql(`\n        {\n          allMarkdownRemark {\n            edges {\n              node {\n                id\n                fileAbsolutePath\n                fields {\n                  permalink\n                  slug\n                  category\n                  docType\n                }\n              }\n            }\n          }\n        }\n      `).then((result) => {\n        if (result.errors) {\n          /* eslint no-console: \"off\" */\n          console.log(result.errors);\n          reject(result.errors);\n        }\n\n        const helpCategorySet = new Set();\n        const developerCategorySet = new Set();\n\n        result.data.allMarkdownRemark.edges.forEach((edge) => {\n          const { category, docType } = edge.node.fields;\n\n          // aggregate \"ui\" categories\n          if (docType === 'ui') {\n            helpCategorySet.add(category);\n          }\n\n          // aggregate \"for-developers\" categories\n          if (docType === 'for-developers') {\n            developerCategorySet.add(category);\n          }\n\n          // Create docs pages\n          const { permalink } = edge.node.fields;\n\n          createPage({\n            path: permalink,\n            component: docsPage,\n            context: {\n              slug: edge.node.fields.slug,\n              id: edge.node.id,\n            },\n          });\n        });\n\n        const categoryList = Array.from(developerCategorySet);\n        categoryList.forEach((category, i) => {\n          // Create \"for-developer\" category nodes.\n          const cat = {\n            id: `${i}`,\n            slug: category,\n            parent: '__SOURCE__',\n            children: [],\n            internal: {\n              type: 'forDeveloperCategories',\n            },\n          };\n          // Get content digest of node. (Required field)\n          const contentDigest = crypto\n            .createHash('md5')\n            .update(JSON.stringify(cat))\n            .digest('hex');\n\n          // add it to contentNode\n          cat.internal.contentDigest = contentDigest;\n\n          // Create \"/for-developers/<category-slug>\" pages.\n          createPage({\n            path: `/for-developers/${_.kebabCase(category)}/`,\n            component: categoryPage,\n            context: {\n              docType: 'for-developers',\n              category,\n            },\n          });\n        });\n\n        const helpCategoryList = Array.from(helpCategorySet);\n        helpCategoryList.forEach((category, i) => {\n          // Create \"ui\" category nodes.\n          const cat = {\n            id: `${i}`,\n            slug: category,\n            parent: '__SOURCE__',\n            children: [],\n            internal: {\n              type: 'helpSupportCategories',\n            },\n          };\n\n          // Get content digest of node. (Required field)\n          const contentDigest = crypto\n            .createHash('md5')\n            .update(JSON.stringify(cat))\n            .digest('hex');\n\n          // add it to userNode\n          cat.internal.contentDigest = contentDigest;\n\n          // Create \"/ui/<category-slug>\" pages.\n          createPage({\n            path: `/ui/${_.kebabCase(category)}/`,\n            component: categoryPage,\n            context: {\n              docType: 'ui',\n              category,\n            },\n          });\n        });\n      })\n    );\n  });\n};\n\nexports.onCreateWebpackConfig = ({ stage, actions }) => {\n  if (stage === 'build-javascript') {\n    actions.setWebpackConfig({\n      plugins: [webpackLodashPlugin],\n    });\n  }\n};\n"
  },
  {
    "path": "jsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"ES6\",\n        \"allowSyntheticDefaultImports\": true,\n        \"experimentalDecorators\": true,\n        \"baseUrl\": \"src\",\n        \"paths\": {\n            \"*\": [\"*\", \"src/*\"]\n        }\n    },\n    \"typeAcquisition\": {\n        \"enable\": true\n    },\n    \"typingOptions\": {\n        \"enableAutoDiscovery\": true\n    },\n    \"compileOnSave\": true,\n    \"allowJS\": true,\n    \"include\": [\n        \"src/**/*\"\n    ]\n}"
  },
  {
    "path": "license",
    "content": "The MIT License (MIT)\n\nCopyright © 2013-2019 Twilio SendGrid Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"sendgrid-docs\",\n  \"description\": \"SendGrid Docs\",\n  \"version\": \"1.1.0\",\n  \"author\": \"Justin W. Hall <justin.hall@sendgrid.com>\",\n  \"dependencies\": {\n    \"axios\": \"^0.21.1\",\n    \"babel-plugin-lodash\": \"^3.3.4\",\n    \"babel-polyfill\": \"^6.26.0\",\n    \"gatsby\": \"^2.32.13\",\n    \"gatsby-cli\": \"^2.19.3\",\n    \"gatsby-link\": \"^2.10.0\",\n    \"gatsby-plugin-catch-links\": \"^2.9.0\",\n    \"gatsby-plugin-feed\": \"^2.13.1\",\n    \"gatsby-plugin-google-analytics\": \"^2.10.0\",\n    \"gatsby-plugin-google-tagmanager\": \"^2.10.0\",\n    \"gatsby-plugin-manifest\": \"^2.12.1\",\n    \"gatsby-plugin-nprogress\": \"^2.9.0\",\n    \"gatsby-plugin-offline\": \"^3.10.2\",\n    \"gatsby-plugin-react-helmet\": \"^3.9.0\",\n    \"gatsby-plugin-robots-txt\": \"^1.6.2\",\n    \"gatsby-plugin-sass\": \"^2.8.0\",\n    \"gatsby-plugin-segment-js\": \"^3.6.1\",\n    \"gatsby-plugin-sharp\": \"^2.14.4\",\n    \"gatsby-plugin-sitemap\": \"^2.11.0\",\n    \"gatsby-plugin-twitter\": \"^2.9.0\",\n    \"gatsby-remark-autolink-headers\": \"^2.10.0\",\n    \"gatsby-remark-copy-linked-files\": \"^2.9.0\",\n    \"gatsby-remark-images\": \"^3.11.1\",\n    \"gatsby-remark-prismjs\": \"^3.12.0\",\n    \"gatsby-remark-responsive-iframe\": \"^2.10.0\",\n    \"gatsby-source-filesystem\": \"^2.11.1\",\n    \"gatsby-transformer-remark\": \"^2.16.1\",\n    \"github-slugger\": \"^1.3.0\",\n    \"js-cookie\": \"^2.2.1\",\n    \"lodash\": \"^4.17.21\",\n    \"lodash-webpack-plugin\": \"^0.11.6\",\n    \"marked\": \"^2.0.7\",\n    \"mdast-util-to-string\": \"^1.1.0\",\n    \"node-fetch\": \"^2.6.1\",\n    \"node-sass\": \"^4.14.1\",\n    \"prismjs\": \"^1.23.0\",\n    \"react\": \"^16.14.0\",\n    \"react-dom\": \"^16.14.0\",\n    \"react-helmet\": \"^6.1.0\",\n    \"react-share\": \"^4.4.0\",\n    \"rehype-react\": \"^5.0.1\",\n    \"s3-deploy\": \"^1.4.0\",\n    \"stylelint-selector-bem-pattern\": \"^2.1.0\",\n    \"unist-util-visit\": \"^2.0.3\",\n    \"yarn\": \"^1.22.10\"\n  },\n  \"devDependencies\": {\n    \"cli-glob\": \"^0.1.0\",\n    \"eslint\": \"^6.8.0\",\n    \"eslint-config-airbnb\": \"^18.2.1\",\n    \"eslint-config-prettier\": \"^6.15.0\",\n    \"eslint-plugin-import\": \"^2.23.4\",\n    \"eslint-plugin-jsx-a11y\": \"^6.4.1\",\n    \"eslint-plugin-react\": \"^7.24.0\",\n    \"gh-pages\": \"^2.2.0\",\n    \"prettier\": \"^2.3.0\",\n    \"remark-cli\": \"^8.0.1\",\n    \"remark-preset-lint-recommended\": \"^4.0.1\",\n    \"stylefmt\": \"^6.0.3\",\n    \"stylelint\": \"^13.13.0\",\n    \"stylelint-config-standard\": \"^20.0.0\"\n  },\n  \"keywords\": [\n    \"gatsby\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"n/a\",\n  \"scripts\": {\n    \"develop\": \"gatsby develop\",\n    \"dev\": \"npm run develop\",\n    \"serve\": \"gatsby serve\",\n    \"build\": \"gatsby build\",\n    \"build:pp\": \"gatsby build --prefix-paths\",\n    \"build:gh\": \"npm run clean && npm run build:pp && gh-pages -d public\",\n    \"clean\": \"rm -rf public\",\n    \"lint:js\": \"eslint --ext .js,.jsx .\",\n    \"lint:md\": \"remark content/docs/\",\n    \"format:js\": \"prettier '**/*.{js,jsx}' --write\"\n  },\n  \"remarkConfig\": {\n    \"plugins\": [\n      \"remark-preset-lint-recommended\"\n    ]\n  }\n}\n"
  },
  {
    "path": "plugins/sendgrid-remark-code-in-html/index.js",
    "content": "const visit = require('unist-util-visit');\n\nmodule.exports = ({ markdownAST }) => {\n  visit(markdownAST, 'html', (node) => {\n    let remarked = node.value.replace(/```raw/g, '<pre class=\"language-text\"><code>');\n    remarked = remarked.replace(/```/g, '</code></pre>');\n    node.value = remarked;\n  });\n\n  return markdownAST;\n};\n"
  },
  {
    "path": "plugins/sendgrid-remark-code-in-html/package.json",
    "content": "{}"
  },
  {
    "path": "plugins/sendgrid-remark-headers/index.js",
    "content": "const toString = require('mdast-util-to-string');\nconst visit = require('unist-util-visit');\nconst slugs = require('github-slugger')();\n\nfunction patch(context, key, value) {\n  if (!context[key]) {\n    context[key] = value;\n  }\n\n  return context[key];\n}\nmodule.exports = ({ markdownAST }) => {\n  slugs.reset();\n\n  visit(markdownAST, 'heading', (node) => {\n    const id = slugs.slug(toString(node));\n    const data = patch(node, 'data', {});\n\n    patch(data, 'id', id);\n    patch(data, 'htmlAttributes', {});\n    patch(data, 'hProperties', {});\n    patch(data.htmlAttributes, 'id', id);\n    patch(data.hProperties, 'id', id);\n    patch(data.hProperties, 'class', 'sg-remarked-linked-header');\n\n    node.children.unshift({\n      type: 'link',\n      url: `#${id}`,\n      title: null,\n      data: {\n        hProperties: {\n          'aria-hidden': true,\n          class: 'anchor',\n          'data-slug': id,\n        },\n        hChildren: [\n          {\n            type: 'raw',\n            // The Octicon link icon.\n            value: '<svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>',\n          },\n        ],\n      },\n    });\n  });\n\n  return markdownAST;\n};\n\n"
  },
  {
    "path": "plugins/sendgrid-remark-headers/package.json",
    "content": "{}"
  },
  {
    "path": "plugins/sendgrid-remark-paths/index.js",
    "content": "const visit = require('unist-util-visit');\n\nmodule.exports = ({ markdownAST, pathPrefix }) => {\n  const uriPrefix = pathPrefix.length ? pathPrefix : '';\n\n  // Replace {{root_url}} for all links\n  visit(markdownAST, 'link', (node) => {\n    if (\n      node.url &&\n      node.url.startsWith('{{root_url}}')\n    ) {\n      node.url = node.url.replace('{{root_url}}', uriPrefix);\n    }\n  });\n\n  // Replace {{root_url}} for all imags\n  visit(markdownAST, 'image', (node) => {\n    if (\n      node.url &&\n      node.url.startsWith('{{root_url}}')\n    ) {\n      node.url = node.url.replace('{{root_url}}', uriPrefix);\n    }\n  });\n\n  return markdownAST;\n};\n"
  },
  {
    "path": "plugins/sendgrid-remark-paths/package.json",
    "content": "{}"
  },
  {
    "path": "plugins/sendgrid-remark-tables/index.js",
    "content": "const visit = require('unist-util-visit');\nconst cheerio = require('cheerio');\n\nmodule.exports = ({ markdownAST }) => {\n  visit(markdownAST, 'html', (node) => {\n    const $ = cheerio.load(node.value);\n    const table = $('table');\n\n    if (table.length) {\n      const rawHTML = `\n        <div class=\"table-wrap\">\n          ${table}\n        </div>\n        `;\n\n      node.data = {\n        hChildren: [{ type: 'raw', value: rawHTML }],\n        // Set type to unknown so mdast-util-to-hast will treat this node as a\n        // div not an iframe — it gets quite confused otherwise.\n      }; node.type = 'unknown';\n\n      // Also apparently, for html node types, you have to delete the value\n      // in order for mdast-util-to-hast to use hChildren. If even if\n      // you change the node type to unknown...\n      delete node.value;\n    }\n  });\n\n  return markdownAST;\n};\n\n"
  },
  {
    "path": "plugins/sendgrid-remark-tables/package.json",
    "content": "{}"
  },
  {
    "path": "redirects.js",
    "content": "module.exports = [\n  {\n    from:\n      '/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.html',\n    to:\n      '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n  },\n  {\n    from: '/Integrate/Partners/account-migration.html',\n    to: '/for-developers/partners/account-migration/',\n  },\n  {\n    from: '/Apps/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Apps/address_whitelisting.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/bcc.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/bypass_list_management.html',\n    to: '/ui/account-and-settings/mail/ ',\n  },\n  {\n    from: '/Apps/click_tracking.html',\n    to: '/ui/account-and-settings/tracking/ ',\n  },\n  {\n    from: '/Apps/domain_keys.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/ ',\n  },\n  {\n    from: '/Apps/dkim.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/ ',\n  },\n  {\n    from: '/Apps/email_templates.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/event_notification.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/footer.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/forward_spam.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/google_analytics.html',\n    to: '/ui/account-and-settings/tracking/ ',\n  },\n  {\n    from: '/Apps/gravatar.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Apps/new_relic.html',\n    to: '/ui/account-and-settings/partners/',\n  },\n  {\n    from: '/Apps/open_tracking.html',\n    to: '/ui/account-and-settings/tracking/ ',\n  },\n  {\n    from: '/Apps/return_path_seedlist.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Apps/sendwithus.html',\n    to: '/ui/account-and-settings/partners/',\n  },\n  {\n    from: '/Apps/spam_checker.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/Apps/subscription_tracking.html',\n    to: '/ui/account-and-settings/tracking/ ',\n  },\n  {\n    from: '/Apps/template_engine.html',\n    to: '/ui/sending-mail/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/Code_Examples/index.html',\n    to: '/for-developers/',\n  },\n  {\n    from: '/Code_Examples/csharp.html',\n    to: '/for-developers/sending-email/v3-csharp-code-example/',\n  },\n  {\n    from: '/Code_Examples/go.html',\n    to: '/for-developers/sending-email/v3-go-code-example/',\n  },\n  {\n    from: '/Code_Examples/ios.html',\n    to: '/for-developers/',\n  },\n  {\n    from: '/Code_Examples/java.html',\n    to: '/for-developers/sending-email/v3-java-code-example/',\n  },\n  {\n    from: '/Code_Examples/nodejs.html',\n    to: '/for-developers/sending-email/v3-nodejs-code-example/',\n  },\n  {\n    from: '/Code_Examples/perl.html',\n    to: '/for-developers/sending-email/v2-perl-code-example/',\n  },\n  {\n    from: '/Code_Examples/php.html',\n    to: '/for-developers/sending-email/v3-php-code-example/',\n  },\n  {\n    from: '/Code_Examples/python.html',\n    to: '/for-developers/sending-email/smtp-python-code-example/',\n  },\n  {\n    from: '/Code_Examples/ruby.html',\n    to: '/for-developers/sending-email/v3-ruby-code-example/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/index.html',\n    to: '/for-developers/tracking-events/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/go.html',\n    to: '/for-developers/tracking-events/go-code-example/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/nodejs.html',\n    to: '/for-developers/tracking-events/nodejs-code-example/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/php.html',\n    to: '/for-developers/tracking-events/php-code-example/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/python.html',\n    to: '/for-developers/tracking-events/python-code-example/',\n  },\n  {\n    from: '/Code_Examples/Webhook_Examples/csharp.html',\n    to: '/for-developers/tracking-events/csharp-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/index.html',\n    to: '/for-developers/sending-email/building-an-smtp-email/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/go.html',\n    to: '/for-developers/sending-email/smtp-go-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/nodejs.html',\n    to: '/for-developers/sending-email/smtp-nodejs-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/perl.html',\n    to: '/for-developers/sending-email/smtp-perl-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/php.html',\n    to: '/for-developers/sending-email/smtp-php-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/python.html',\n    to: '/for-developers/sending-email/smtp-python-code-example/',\n  },\n  {\n    from: '/Code_Examples/SMTP_API_Header_Examples/ruby.html',\n    to: '/for-developers/sending-email/smtp-ruby-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/go.html',\n    to: '/for-developers/sending-email/v2-go-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/java.html',\n    to: '/for-developers/sending-email/v2-java-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/nodejs.html',\n    to: '/for-developers/sending-email/v2-nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/perl.html',\n    to: '/for-developers/sending-email/v2-perl-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/python.html',\n    to: '/for-developers/sending-email/v2-python-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/ruby.html',\n    to: '/for-developers/sending-email/v2-ruby-code-example/',\n  },\n  {\n    from: '/Classroom/Basics/password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from: '/Classroom/Deliver/warming_up_ips.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Send/api_keys.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/how_sendgrid_handles_550_requested_action_not_taken_mailbox_unavailable_bounces.html',\n    to: '/ui/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_may_not_be_able_to_send_emails.html',\n    to:\n      '/Classroom/Troubleshooting/Account_Administration/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_out_any_email/',\n  },\n  {\n    from: '/Classroom/Basics/Security/two_factor_authentication_faq.html',\n    to: '/ui/account-and-settings/two_factor_authentication/',\n  },\n  {\n    from: '/Classroom/Basics/a_sendgrid_user_is_spamming_me.html',\n    to: '/report-spam/',\n  },\n  {\n    from: '/Classroom/Basics/does_sendgrid_support_end_to_end_tls.html',\n    to: '/ui/sending-email/tls/',\n  },\n  {\n    from: '/Classroom/Basics/email_flow.html',\n    to: '/ui/sending-email/email-flow/',\n  },\n  {\n    from: '/Classroom/Basics/everything_about_dmarc.html',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from: '/Classroom/Basics/link_shorteners.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/recommended_smtp_settings.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from:\n      '/Classroom/Basics/sendgrid_multiauth_multiple_account_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/Classroom/Basics/sendgrid_oem_process.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Basics/sending_practices.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/smtp_ports.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from: '/Classroom/Basics/ssl_vs_tls.html',\n    to: '/ui/sending-email/ssl-vs-tls/',\n  },\n  {\n    from: '/Classroom/Basics/tips_to_keep_your_list_organized.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Basics/what_are_subusers.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Basics/what_are_the_sendgrid_apis_and_what_do_they_do.html',\n    to: '/for-developers/sending-email/api-sending-email/',\n  },\n  {\n    from: '/Classroom/Basics/what_is_smtp.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from:\n      '/Classroom/Basics/what_is_the_difference_between_marketing_and_transactional_emails.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/where_can_i_enable_subscription_tracking.html',\n    to: '/ui/analytics-and-reporting/subuscription-tracking/',\n  },\n  {\n    from:\n      '/Classroom/Basics/why_are_the_pro_plans_recommended_above_all_others.html',\n    to: '/pricing/',\n  },\n  {\n    from: '/Classroom/Basics/your_reputation_what_is_it.html',\n    to: 'https://sendgrid.com/blog/what-is-a-domain-reputation/',\n  },\n  {\n    from: '/Classroom/Basics/Security/setting_up_2_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html',\n    to: '/ui/account-and-settings/dedicated-ip-addresses/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/creating_multiple_user_credentials_for_sub_users.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/im_a_multiple_credential_user_and_i_need_to_reset_my_password.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html',\n    to: '/ui/account-and-settings/dedicated-ip-addresses/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Security/sendgrid_multiauth_multiple_account_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.html',\n    to: '/',\n    gone: true,\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/migration_guide_part_1_migrating_your_recipient_lists_into_contacts.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/migration_guide_part_2_importing_your_unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/migration_guide_part_3_moving_your_content.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Misc/where_can_i_enable_subscription_tracking.html',\n    to: '/ui/account-and-settings/tracking/#-Subscription-Tracking',\n  },\n  {\n    from: '/Classroom/Basics/marketing_campaigns_video_tutorials.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/remove_bounced_addresses.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Basics/Account/account_sign_up_faq.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Classroom/Basics/Account/how_do_i_reset_my_password.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Classroom/Basics/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html',\n    to: '/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/index.html',\n    to:\n      '/ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/default_mc_tags.html',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/engagement_stats.html',\n    to: '/ui/analytics-and-reporting/marketing-campaigns-stats/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Basics/Integrate/how_to_integrate_with_mailpoet.html',\n    to: '/for-developers/sending-email/mailpoet/',\n  },\n  {\n    from: '/Classroom/Basics/Integrate/interspire_integration.html',\n    to: '/for-developers/sending-email/interspire/',\n  },\n  {\n    from: '/Classroom/Basics/Integrate/sugarcrm_integration.html',\n    to: '/for-developers/sending-email/sugarcrm/',\n  },\n  {\n    from: '/Classroom/Basics/Misc/support.html',\n    to: '/ui/account-and-settings/support/',\n  },\n  {\n    from: '/Classroom/Basics/Misc/sendgrid_oem_process.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Misc/what_is_the_difference_between_marketing_and_transactional_emails.html',\n    to: '/glossary/transactional-email/',\n  },\n  {\n    from: '/Classroom/Basics/Misc/a_sendgrid_user_is_spamming_me.html',\n    to: '/ui/account-and-settings/support/',\n  },\n  {\n    from: '/Classroom/Basics/Email_Infrastructure/email_flow.html',\n    to: '/ui/sending-email/email-flow/',\n  },\n  {\n    from: '/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.html',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.html',\n    to: '/ui/sending-email/tls/',\n  },\n  {\n    from: '/Classroom/Basics/API/cors.html',\n    to: '/for-developers/sending-email/cors/',\n  },\n  {\n    from:\n      '/Classroom/Basics/API/does_sendgrid_offer_a_sandbox_or_test_environment.html',\n    to: '/for-developers/sending-email/sandbox-mode/',\n  },\n  {\n    from: '/Classroom/Basics/API/how_do_i_integrate_with_sendgrid.html',\n    to: '/for-developers/sending-email/api-getting-started/',\n  },\n  {\n    from: '/Classroom/Basics/API/how_to_create_a_subuser_with_the_api.html',\n    to: '/for-developers/sending-email/how-to-create-a-subuser-with-the-api/',\n  },\n  {\n    from:\n      '/Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.html',\n    to: '/for-developers/sending-email/api-getting-started/',\n  },\n  {\n    from: '/Classroom/Basics/API/what_is_my_api_key.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from: '/Classroom/index.html',\n    to: '/',\n  },\n  {\n    from: '/Classroom/Build/a_b_testing.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from: '/Classroom/Build/adaptive_email_content.html',\n    to:\n      'https://sendgrid.com/blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/',\n  },\n  {\n    from: '/Classroom/Build/attachments.html',\n    to: '/ui/sending-email/attachments-with-digioh/',\n  },\n  {\n    from: '/Classroom/Build/brand_consistency_why_its_important.html',\n    to:\n      'https://sendgrid.com/blog/how-to-maintain-brand-standards-in-your-email-designs/',\n  },\n  {\n    from: '/Classroom/Build/can_i_use_substitution_tags_in_subject_lines.html',\n    to: '/ui/sending-email/substitution-and-section-tags/',\n  },\n  {\n    from: '/Classroom/Build/content_delivery_networks.html',\n    to: '/ui/sending-email/content-delivery-networks/',\n  },\n  {\n    from: '/Classroom/Build/embedding_videos_in_your_emails.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Build/gmail_promotions_tab.html',\n    to: 'https://sendgrid.com/blog/i-fought-the-tabs-and-the-tabs-won/',\n  },\n  {\n    from:\n      '/Classroom/Build/how_do_i_add_a_list_unsubscribe_header_to_my_emails.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: 'Classroom/Build/html_formatting_issues.html',\n    to: '/ui/sending-email/formatting-html/',\n  },\n  {\n    from:\n      '/Classroom/Build/html_rendering__the_dos_and_donts_of_cross_platform_email_design.html',\n    to: '/ui/sending-email/cross-platform-html-design/',\n  },\n  {\n    from: '/Classroom/Build/personalization_making_your_messages_count.html',\n    to:\n      'https://sendgrid.com/blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/',\n  },\n  {\n    from: '/Classroom/Build/plain_text_emails_converted_to_html.html',\n    to: '/ui/sending-email/formatting-html/',\n  },\n  {\n    from: '/Classroom/Build/responsive_templates_and_design.html',\n    to: '/ui/sending-email/cross-platform-html-design/',\n  },\n  {\n    from: '/Classroom/Build/substitution_and_section_tags.html',\n    to: '/ui/sending-email/substitution-and-section-tags/',\n  },\n  {\n    from: '/Classroom/Build/whats_the_recommended_message_size_limit.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/Classroom/Build/Format_Content/responsive_templates_and_design.html',\n    to: '/ui/sending-email/cross-platform-html-design/',\n  },\n  {\n    from: '/Classroom/Build/Choose_Content/a_b_testing.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from:\n      '/Classroom/Build/Add_Content/can_i_use_substitution_tags_in_subject_lines.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/change_email_content_after_send.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/content_delivery_networks.html',\n    to: '/ui/sending-email/content-delivery-networks/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/custom_ssl_configurations.html',\n    to: '/ui/account-and-settings/custom-ssl-configurations/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/substitution_and_section_tags.html',\n    to: '/ui/sending-email/substitution-and-section-tags/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/embedding_videos_in_your_emails.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/link_shorteners.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/universal_links.html',\n    to: '/ui/sending-email/universal-links/',\n  },\n  {\n    from:\n      '/Classroom/Build/Add_Content/whats_the_recommended_message_size_limit.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Build/Add_Content/attachments.html',\n    to: '/ui/sending-email/attachments-with-digioh/',\n  },\n  {\n    from: '/Classroom/Build/Choose_Content/adaptive_email_content.html',\n    to:\n      'https://sendgrid.com/blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/',\n  },\n  {\n    from:\n      '/Classroom/Build/Choose_Content/brand_consistency_why_its_important.html',\n    to:\n      'https://sendgrid.com/blog/how-to-maintain-brand-standards-in-your-email-designs/',\n  },\n  {\n    from:\n      '/Classroom/Build/Choose_Content/personalization_making_your_messages_count.html',\n    to:\n      'https://sendgrid.com/blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/',\n  },\n  {\n    from: '/Classroom/Build/Format_Content/html_formatting_issues.html',\n    to: '/ui/sending-email/formatting-html/',\n  },\n  {\n    from:\n      '/Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.html',\n    to: '/ui/sending-email/cross-platform-html-design/',\n  },\n  {\n    from:\n      '/Classroom/Build/Format_Content/plain_text_emails_converted_to_html.html',\n    to: '/ui/sending-email/cross-platform-html-design/',\n  },\n  {\n    from: '/Classroom/Build/index.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/Classroom/Send/How_Emails_Are_Sent/api_keys.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from: '/Classroom/Deliver/overview.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/all_you_need_to_know_about_whitelabeling.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/ ',\n  },\n  {\n    from: '/Classroom/Deliver/bacn_its_whats_for_dinner.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Deliver/email_deliverability_101.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/how_to_warm_up_your_ip_address.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Deliver/how_to_warm_up_your_ip_address.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Deliver/keep_in_touch_the_importance_of_engagement.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/sendgrids_recommended_sending_practices_and_methods.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/Classroom/Deliver/suppressions_vs_unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Classroom/Deliver/the_art_of_notifications.html',\n    to: '/ui/account-and-settings/notifications/',\n  },\n  {\n    from: '/Classroom/Deliver/russian_data_localization_law.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/unsubscribes_explained.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Classroom/Deliver/affiliate_lists_and_list_sharing.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/let_old_addresses_sleep_in_peace.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/list_scrubbing_guide.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/list_scrubbing.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/peer_initiated_email_invitation_requirements.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/preference_centers_giving_subscribers_control.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/role_addresses.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/tips_to_keep_your_list_organized.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/where_did_you_get_my_address_permission_reminders.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/why_purchase_lists_when_you_can.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Deliver/why_purchased_email_lists_are_no_good.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/aol_dmarc_changes_refused_due_to_provided_dmarc_policy.html',\n    to: '/ui/account-and-settings/aol-dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/dkim_settings_for_whitelabel_pro100k_and_higher.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/ ',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/dkim_settings_for_whitelabel_pro100k_and_higher.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/ ',\n  },\n  {\n    from: '/Classroom/Deliver/gmail_dmarc_changes.html',\n    to: '/ui/account-and-settings/gmail-dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/internet_standards_spf_and_dkim_and_deliverability.html',\n    to: '/ui/account-and-settings/spf-dkim/',\n  },\n  {\n    from: '/Classroom/Deliver/spf_dont_exceed_ten_dns_lookups.html',\n    to: '/ui/account-and-settings/spf-dkim/',\n  },\n  {\n    from: '/Classroom/Deliver/spf_records_explained.html',\n    to: '/ui/account-and-settings/spf-records/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/the_importance_of_a_physical_mailing_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.html',\n    to: '/ui/account-and-settings/yahoo-dmarc/',\n  },\n  {\n    from: '/Classroom/Deliver/google_feedback_loop_spam_complaints.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/ui_my_emails_arent_being_delivered.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/how_can_i_guarantee_my_emails_arrive_in_my_recipients_inbox.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/how_do_i_keep_emails_from_dropping.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/how_sendgrid_handles_550_requested_action_not_taken_mailbox_unavailable_bounces.html',\n    to: '/ui/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/Classroom/Deliver/my_emails_are_being_blocked.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/my_emails_are_being_dropped.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/my_emails_are_going_to_spam.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/Delivery_Introduction/overview.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/spam_trapped.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/what_do_i_do_if_im_blacklisted.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/enabling_custom_dkim.html',\n    to: '/ui/account-and-settings/spf-dkim/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/sendgrids_recommended_sending_practices_and_methods.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/how_can_i_guarantee_my_emails_arrive_in_my_recipients_inbox.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_blocked.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/why_purchase_lists_when_you_can.html',\n    to:\n      'https://sendgrid.com/blog/buying-email-lists-3-reasons-why-you-shouldnt/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/bacn_its_whats_for_dinner.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/IP_reputation_montoring.html',\n    to: '/ui/account-and-settings/dedicated-ip-addresses/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.html',\n    to: '/glossary/gdpr/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/suppressions_vs_unsubscribes.html',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/the_art_of_notifications.html',\n    to: '/ui/account-and-settings/notifications/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.html',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from: '/Classroom/Deliver/index.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/shared_ip_throttling.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.html',\n    to: '/ui/account-and-settings/gmail-dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/aol_dmarc_changes_refused_due_to_provided_dmarc_policy.html',\n    to: '/ui/account-and-settings/aol-dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.html',\n    to: '/ui/account-and-settings/microsoft-dmarc/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.html',\n    to: '/ui/account-and-settings/yahoo-dmarc/',\n  },\n  {\n    from: '/Classroom/Deliver/Sender_Authentication/spf_records_explained.html',\n    to: '/ui/account-and-settings/spf-records/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.html',\n    to: '/ui/account-and-settings/spf-limitations/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/the_importance_of_a_physical_mailing_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.html',\n    to: '/ui/account-and-settings/spf-dkim/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/help_my_emails_arent_being_delivered.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/how_do_i_keep_emails_from_dropping.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/my_emails_are_being_dropped.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/my_emails_are_going_to_spam.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/what_do_i_do_if_im_blacklisted.html',\n    to: '/ui/sending-email/blacklists/',\n  },\n  {\n    from: '/Classroom/Deliver/Sender_Authentication/spam_trapped.html',\n    to: '/ui/sending-email/spam-traps/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/google_feedback_loop_spam_complaints.html',\n    to: '/ui/sending-email/spam/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/why_is_sendgrid_net_greylisted.html',\n    to: '/ui/sending-email/sendgrid.net-greylisted/',\n  },\n  {\n    from:\n      '/Classroom/Send/how_can_i_schedule_emails_to_send_at_specific_times.html',\n    to: '/for-developers/sending-email/scheduling-email/',\n  },\n  {\n    from: '/Classroom/Send/seeing_a_delay_with_your_first_few_sends.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Send/can_i_stop_a_send_in_progress.html',\n    to: '/for-developers/sending-email/stopping-an-in-progress-send/ ',\n  },\n  {\n    from: '/Classroom/Send/can_i_send_from_multiple_domains.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Send/can_i_send_from_multiple_from_addresses.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/Classroom/Send/email_to_sms.html',\n    to: '/ui/sending-email/email-to-sms/',\n  },\n  {\n    from: '/Classroom/Send/how_do_i_send_mail_through_subuser_accounts.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Send/sendmail_relay_all_local_mail_through_sendgrid.html',\n    to: '/ui/sending-email/sendmail/',\n  },\n  {\n    from: '/Classroom/Send/sending.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Send/can_i_resend_messages_that_were_dropped.html',\n    to: '/ui/sending-email/drops/',\n  },\n  {\n    from: '/Classroom/Send/can_i_send_adult_content_in_my_emails.html',\n    to: '/ui/sending-email/can-i-send-adult-content-in-my-emails/',\n  },\n  {\n    from: '/Classroom/Send/can_i_send_to_purchased_lists.html',\n    to:\n      'https://sendgrid.com/blog/buying-email-lists-3-reasons-why-you-shouldnt/',\n  },\n  {\n    from: '/Classroom/Send/welcome_emails_making_a_good_first_impression.html',\n    to: 'https://sendgrid.com/blog/how-to-send-the-perfect-welcome-email/',\n  },\n  {\n    from: '/Classroom/Send/resubscription_of_users.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/',\n  },\n  {\n    from: '/Classroom/Send/segmenting_traffic.html',\n    to: '/ui/managing-contacts/segmenting-your-contacts/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/resubscription_of_users.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/ ',\n  },\n  {\n    from:\n      '/Classroom/Send/How_Emails_Are_Sent/can_i_send_from_multiple_domains.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Send/How_Emails_Are_Sent/can_i_send_from_multiple_from_addresses.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/Classroom/Send/How_Emails_Are_Sent/email_to_sms.html',\n    to: '/ui/sending-email/email-to-sms/',\n  },\n  {\n    from:\n      '/Classroom/Send/How_Emails_Are_Sent/sendmail_relay_all_local_mail_through_sendgrid.html',\n    to: '/for-developers/sending-email/sendmail/',\n  },\n  {\n    from: '/Classroom/Send/How_Emails_Are_Sent/unauthenticated_sender.html',\n    to: '/for-developers/sending-email/getting-started-smtp/',\n  },\n  {\n    from: '/Classroom/Send/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.html',\n    to: '/for-developers/sending-email/migrating-from-v2-to-v3-mail-send/',\n  },\n  {\n    from: '/Classroom/Send/v3_Mail_Send/personalizations.html',\n    to: '/for-developers/sending-email/personalizations/',\n  },\n  {\n    from: '/Classroom/Send/v3_Mail_Send/sandbox_mode.html',\n    to: '/for-developers/sending-email/sandbox-mode/',\n  },\n  {\n    from: '/Classroom/Send/v3_Mail_Send/v3_mail_send_faq.html',\n    to: '/for-developers/sending-email/v3-mail-send-faq/',\n  },\n  {\n    from:\n      '/Classroom/Send/What_You_Can_Send/can_i_send_adult_content_in_my_emails.html',\n    to: '/ui/sending-email/deliverability/#sending-adult-content',\n  },\n  {\n    from:\n      '/Classroom/Send/What_You_Can_Send/welcome_emails_making_a_good_first_impression.html',\n    to: 'https://sendgrid.com/blog/how-to-send-the-perfect-welcome-email/',\n  },\n  {\n    from:\n      '/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.html',\n    to: '/for-developers/sending-email/stopping-a-scheduled-send/',\n  },\n  {\n    from:\n      '/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.html',\n    to: '/for-developers/sending-email/stopping-an-in-progress-send/ ',\n  },\n  {\n    from:\n      '/Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.html',\n    to: '/for-developers/sending-email/scheduling-email/',\n  },\n  {\n    from:\n      '/Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Track/what_do_all_these_delivery_statistics_mean.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/Classroom/Track/discrepancies_between_requests_and_deliveries.html',\n    to: '/ui/sending-email/email-activity-feed ',\n  },\n  {\n    from:\n      '/Classroom/Track/can_i_download_a_list_of_click_and_or_open_events.html',\n    to: '/ui/sending-email/email-activity-feed ',\n  },\n  {\n    from:\n      '/Classroom/Track/how_can_i_tell_if_an_email_was_actually_delivered.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/google_analytics_demystified_ga_statistics_vs_sg_statistics.html',\n    to: '/ui/analytics-and-reporting/google-analytics ',\n  },\n  {\n    from: '/Classroom/Track/new_relic.html',\n    to: '/ui/analytics-and-reporting/tracking-stats-using-new-relic ',\n  },\n  {\n    from:\n      '/Classroom/Track/is_there_a_way_to_see_the_content_of_transactional_emails_i_send.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/Classroom/Track/bounce_forwarding_and_gmail.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/bounce_reports_how_can_i_be_notified.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/common_smtp_server_bounce_responses.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Track/delete_from_bounce_list_option_in_email_activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/implementing_bounce_notification_for_multiple_from_addresses.html',\n    to: '/ui/sending-email/bounces/',\n  },\n  {\n    from: '/Classroom/Track/click_tracking_html_best_practices.html',\n    to: '/ui/analytics-and-reporting/click-tracking-html-best-practices/',\n  },\n  {\n    from: '/Classroom/Track/clicktracking_ssl.html',\n    to: '/ui/analytics-and-reporting/clicktracking-ssl ',\n  },\n  {\n    from: '/Classroom/Track/delivery_rate_drops_rate.html',\n    to: '/ui/sending-email/drops/',\n  },\n  {\n    from: '/Classroom/Track/drop_reason_unsubscribed_address.html',\n    to: '/ui/sending-email/drops/',\n  },\n  {\n    from:\n      '/Classroom/Track/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.html',\n    to: '/ui/sending-email/bounces/#-Bounce-Notifications',\n  },\n  {\n    from: '/Classroom/Track/how_to_set_up_bounce_forwarding.html',\n    to: '/ui/sending-email/bounces/#-Bounce-Notifications',\n  },\n  {\n    from: '/Classroom/Track/click_tracking_links_have_stopped_working.html',\n    to: '/ui/analytics-and-reporting/click-tracking/',\n  },\n  {\n    from: '/Classroom/Track/drop_reason_bounced_address.html',\n    to: '/for-developers/sending-email/smtp-filters/#bypass_list_management',\n  },\n  {\n    from: '/Classroom/Track/how_do_i_unsubscribe_a_user.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Classroom/Track/unsubscribe_via_subscription_tracking.html',\n    to: '/ui/analytics-and-reporting/subscription-tracking/',\n  },\n  {\n    from:\n      '/Classroom/Track/Introduction/what_do_all_these_delivery_statistics_mean.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/Classroom/Track/unsubscribe_via_the_subscription_tracking.html',\n    to: '/ui/analytics-and-reporting/subscription-tracking/',\n  },\n  {\n    from: '/Classroom/Track/index.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from:\n      '/Classroom/Track/Collecting_Data/a_guide_for_tracking_data_with_keen_io.html',\n    to: '/ui/analytics-and-reporting/tracking-data-with-keen-io/',\n  },\n  {\n    from:\n      '/Classroom/Track/Collecting_Data/google_analytics_demystified_ga_statistics_vs_sg_statistics.html',\n    to: '/ui/analytics-and-reporting/google-analytics/',\n  },\n  {\n    from:\n      '/Classroom/Track/Collecting_Data/is_there_a_way_to_see_the_content_of_transactional_emails_i_send.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/Classroom/Track/Collecting_Data/new_relic.html',\n    to: '/ui/analytics-and-reporting/tracking-stats-using-new-relic/',\n  },\n  {\n    from:\n      '/Classroom/Track/Clicks/click_tracking_links_with_substitution_tags.html',\n    to: '/ui/analytics-and-reporting/marketing-campaigns-stats/',\n  },\n  {\n    from: '/Classroom/Track/Clicks/click_tracking_html_best_practices.html',\n    to: '/ui/analytics-and-reporting/click-tracking-html-best-practices/',\n  },\n  {\n    from:\n      '/Classroom/Track/Clicks/click_tracking_links_have_stopped_working.html',\n    to: '/ui/analytics-and-reporting/click-tracking-html-best-practices/',\n  },\n  {\n    from: '/Classroom/Track/Clicks/clicktracking_ssl.html',\n    to: '/ui/analytics-and-reporting/click-tracking-ssl/',\n  },\n  {\n    from: '/Classroom/Track/Unsubscribes/how_do_i_unsubscribe_a_user.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Classroom/Track/Unsubscribes/list_unsubscribe.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from:\n      '/Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.html',\n    to: '/ui/sending-email/subscription-tracking/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_can_i_turn_off_2_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_any_email.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/account_under_review_suspended.html',\n    to: '/ui/account-and-settings/account-under-review/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/cant_access_the_email_address_on_file_for_your_sendgrid_account.html',\n    to:\n      '/ui/account-and-settings/accessing-email-account-associated-with-sendgrid/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/cant_log_in_to_your_account.html',\n    to: '/ui/account-and-settings/log-in-issues/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/dont_know_your_user_name.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/help_i_cant_find_my_smtp_username_and_password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/help_my_account_has_been_compromised.html',\n    to: '/ui/account-and-settings/account-compromised/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/heroku_users_find_your_sendgrid_credentials.html',\n    to: '/ui/account-and-settings/heroku-credentials ',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_can_i_turn_off_2_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_to_change_password_when_integrated_via_appdirect.html',\n    to: '/ui/account-and-settings/password-reset-appdirect/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_account_via_softlayer.html',\n    to: '/ui/account-and-settings/password-reset-softlayer/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.html',\n    to: '/ui/account-and-settings/password-reset-azure/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_openshift.html',\n    to: '/ui/account-and-settings/password-reset-openshift/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_the_ibm_cloud_marketplace.html',\n    to: '/ui/account-and-settings/password-reset-ibm-cloud-marketplace/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/i_didnt_receive_the_password_reset_email.html',\n    to: '/ui/account-and-settings/password-reset-email/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/my_provision_was_declined_what_should_i_do.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/you_cannot_change_your_package_at_this_time_because_your_account_is_not_active.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_may_not_be_able_to_send_out_any_email.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_out_any_email.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/your_sendgrid_account_is_at_risk_for_suspension_what_should_i_do.html',\n    to: '/ui/account-and-settings/account-under-review/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/email_was_deferred_due_to_the_following_reasons_ip_deferrals_messages.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/emails_are_being_sent_multiple_times.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/my_client_is_complaining_that_they_have_not_received_an_email.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/testing_your_connectivity_to_sendgrids_smtp_relay_usinng_telnet.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/troubleshooting_delays_and_latency.html',\n    to: '/ui/account-and-settings/safely-test-your-sending-speed/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/a_custom_field_did_not_substitute_during_a_send.html',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/certificate_verification_failed.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/dns_records_and_underscores.html',\n    to: '/ui/sending-email/troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/how_do_i_check_the_headers_raw_source_of_an_email.html',\n    to: '/ui/account-and-settings/checking-email-source/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html',\n    to: '/ui/account-and-settings/troubleshooting-sender-authentication/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/invalid_smtp_api_header.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/list_upload_troubleshooting.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/upgrading_your_whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/you_have_used_a_reserved_field_name_for_your_custom_field.html',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Delivery_Issues/email_was_deferred_due_to_the_following_reasons_ip_deferrals_messages.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.html',\n    to: '/ui/account-and-settings/account-under-review/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.html',\n    to:\n      '/ui/account-and-settings/accessing-email-account-associated-with-sendgrid/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.html',\n    to: '/ui/account-and-settings/log-in-issues/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.html',\n    to: '/ui/account-and-settings/account-compromised/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.html',\n    to: '/ui/account-and-settings/heroku-credentials/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_to_change_password_when_integrated_via_appdirect.html',\n    to: '/ui/account-and-settings/password-reset-appdirect/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_account_via_softlayer.html',\n    to: '/ui/account-and-settings/password-reset-softlayer/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.html',\n    to: '/ui/account-and-settings/password-reset-azure/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_openshift.html',\n    to: '/ui/account-and-settings/password-reset-openshift/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_the_ibm_cloud_marketplace.html',\n    to: '/ui/account-and-settings/password-reset-ibm-cloud-marketplace/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.html',\n    to: '/ui/account-and-settings/ip-access-management/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.html',\n    to: '/ui/account-and-settings/password-reset-email/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/my_provision_was_declined_what_should_i_do.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/you_cannot_change_your_package_at_this_time_because_your_account_is_not_active.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.html',\n    to: '/ui/sending-email/checking-email-source/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Delivery_Issues/safely_test_your_sending_speed.html',\n    to: '/ui/account-and-settings/safely-test-your-sending-speed/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.html',\n    to: '/ui/account-and-settings/troubleshooting-delays-and-latency ',\n  },\n  {\n    from: '/Delivery_Metrics/index.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/Delivery_Metrics/advanced_statistics.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/Delivery_Metrics/alerts.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/Delivery_Metrics/categories.html',\n    to: '/ui/analytics-and-reporting/categories/',\n  },\n  {\n    from: '/Delivery_Metrics/email_activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Delivery_Metrics/email_reports.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/Glossary/Email_Types/peer_invitations.html',\n    to: '/glossary/peer-invitations/',\n  },\n  {\n    from: '/Glossary/ip_whitelabeling.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/Glossary/bulk_sender_notification.html',\n    to: '/glossary/',\n  },\n  {\n    from: '/Glossary/provisioning.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/Glossary/marketing_email.html',\n    to: '/glossary/email-marketing/',\n  },\n  {\n    from: '/Glossary/email_error_messages.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/Glossary/sender_reputation.html',\n    to: 'https://sendgrid.com/blog/what-is-a-domain-reputation/',\n  },\n  {\n    from: '/Glossary/triggering_events.html',\n    to: '/glossary/automated-email/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/outlook_2010.html',\n    to: '/for-developers/sending-email/outlook-2013/',\n  },\n  {\n    from: '/Integrate/Partners/Tutorials/EngineYard.html',\n    to: '/for-developers/sending-email/engineyard/',\n  },\n  {\n    from: '/Integrate/Partners/Tutorials/OpenShift.html',\n    to: '/ui/account-and-settings/password-reset-openshift/',\n  },\n  {\n    from: '/Integrate/Partners/Tutorials/WindowsAzure.html',\n    to: '/for-developers/partners/microsoft-azure/',\n  },\n  {\n    from: '/Integrate/Tutorials/segment/sendgrid_source.html',\n    to: '/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/wordpress.html',\n    to: '/for-developers/sending-email/wordpress-faq/',\n  },\n  {\n    from: '/Integrate/libraries.html',\n    to: '/for-developers/sending-email/libraries/',\n  },\n  {\n    from: '/Integrate/index.html',\n    to: '/for-developers/sending-email/',\n  },\n  {\n    from: '/Integrate/Tutorials/analytics_with_keen_io.html',\n    to: '/for-developers/tracking-events/analytics-with-keen-io/',\n  },\n  {\n    from: '/Integrate/Tutorials/BriteVerify.html',\n    to: '/for-developers/sending-email/brite-verify/',\n  },\n  {\n    from: '/Integrate/Tutorials/Formio.html',\n    to: '/for-developers/sending-email/formio/',\n  },\n  {\n    from: '/Integrate/Tutorials/CloudRail.html',\n    to: '/for-developers/sending-email/cloud-rail/',\n  },\n  {\n    from: '/Integrate/Tutorials/OpenShift.html',\n    to: '/ui/account-and-settings/password-reset-openshift/',\n  },\n  {\n    from: '/Integrate/Tutorials/WindowsAzure.html',\n    to: '/for-developers/partners/azure/',\n  },\n  {\n    from: '/Integrate/Tutorials/event_kit.html',\n    to: '/for-developers/tracking-events/event-kit/',\n  },\n  {\n    from: '/Integrate/Tutorials/Segment/sendgrid_source.html',\n    to: '/for-developers/tracking-events/segment-sendgrid-source/',\n  },\n  {\n    from: '/Integrate/Tutorials/WordPress/index.html',\n    to: '/for-developers/sending-email/wordpress-faq/',\n  },\n  {\n    from: '/Integrate/Tutorials/WordPress/wordpress_integration_faq.html',\n    to: '/for-developers/sending-email/wordpress-faq/',\n  },\n  {\n    from: '/Integrate/Tutorials/WordPress/sendgrid_wordpress_plugin.html',\n    to: '/for-developers/sending-email/wordpress-plugin/',\n  },\n  {\n    from: '/Integrate/Tutorials/WordPress/subscription_widget.html',\n    to: '/for-developers/sending-email/wordpress-subscription-widget/',\n  },\n  {\n    from:\n      '/Integrate/Tutorials/Zapier/sending_for_gravity_forms_submissions.html',\n    to:\n      '/for-developers/sending-email/zapier-sending-for-gravity-forms-submissions/',\n  },\n  {\n    from: '/Integrate/Tutorials/Zapier/sending_for_new_webhook_data.html',\n    to: '/for-developers/sending-email/zapier-sending-for-new-webhook-data/',\n  },\n  {\n    from:\n      '/Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.html',\n    to:\n      '/for-developers/sending-email/zapier-sending-for-postgre-sql-row-matches/',\n  },\n  {\n    from: '/Integrate/Tutorials/Zapier/sending_from_google_sheet_rows.html',\n    to: '/for-developers/sending-email/zapier-sending-from-google-sheet-rows/',\n  },\n  {\n    from:\n      '/Integrate/Tutorials/Zapier/sending_to_tagged_infusionsoft_contacts.html',\n    to:\n      '/for-developers/sending-email/zapier-sending-to-tagged-infusionsoft-contacts/',\n  },\n  {\n    from:\n      '/Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.html',\n    to:\n      '/for-developers/sending-email/zapier-sending-when-new-firebase-child-records-added/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/applemail.html',\n    to: '/for-developers/sending-email/applemail/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/outlook_2013.html',\n    to: '/for-developers/sending-email/outlook-2013/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/outlook.html',\n    to: '/for-developers/sending-email/outlook/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/thunderbird.html',\n    to: '/for-developers/sending-email/thunderbird/',\n  },\n  {\n    from: '/Integrate/Mail_Clients/index.html',\n    to: '/for-developers/sending-email/applemail/',\n  },\n  {\n    from: '/Integrate/Partners/Amazon_Marketplace.html',\n    to: '/for-developers/partners/amazon-marketplace/',\n  },\n  {\n    from: '/Integrate/Partners/Google.html',\n    to: '/for-developers/partners/google/',\n  },\n  {\n    from: '/Integrate/Partners/magento.html',\n    to: '/for-developers/partners/magento/',\n  },\n  {\n    from: '/Integrate/Partners/index.html',\n    to: '/for-developers/partners/magento/',\n  },\n  {\n    from: '/Integrate/Partners/Microsoft_Azure.html',\n    to: '/for-developers/partners/microsoft-azure/',\n  },\n  {\n    from: '/Integrate/Other/index.html',\n    to: '/for-developers/sending-email/interspire/',\n  },\n  {\n    from: '/Integrate/Other/interspire.html',\n    to: '/for-developers/sending-email/interspire/',\n  },\n  {\n    from: '/Integrate/Other/sugarcrm.html',\n    to: '/for-developers/sending-email/sugarcrm/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/magento.html',\n    to: '/for-developers/partners/magento/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/modex.html',\n    to: '/for-developers/sending-email/modex/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/joomla.html',\n    to: '/for-developers/sending-email/joomla/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/index.html',\n    to: '/for-developers/sending-email/joomla/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/drupal.html',\n    to: '/for-developers/sending-email/drupal/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/phpbb.html',\n    to: '/for-developers/sending-email/phpbb/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/exchange_2010.html',\n    to: '/for-developers/sending-email/exchange-2010/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/exim.html',\n    to: '/for-developers/sending-email/exim/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/iis75.html',\n    to: '/for-developers/sending-email/iis75/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/postfix.html',\n    to: '/for-developers/sending-email/postfix/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/qmail.html',\n    to: '/for-developers/sending-email/qmail/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/sendmail.html',\n    to: '/for-developers/sending-email/sendmail/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/ssmtp.html',\n    to: '/for-developers/sending-email/ssmtp/',\n  },\n  {\n    from: '/Integrate/Mail_Servers/index.html',\n    to: '/for-developers/sending-email/exim/',\n  },\n  {\n    from: '/Integrate/Frameworks/cakephp.html',\n    to: '/for-developers/sending-email/cakephp/',\n  },\n  {\n    from: '/Integrate/Frameworks/codeigniter.html',\n    to: '/for-developers/sending-email/codeigniter/',\n  },\n  {\n    from: '/Integrate/Frameworks/django.html',\n    to: '/for-developers/sending-email/django/',\n  },\n  {\n    from: '/Integrate/Frameworks/index.html',\n    to: '/for-developers/sending-email/laravel/',\n  },\n  {\n    from: '/Integrate/Frameworks/laravel.html',\n    to: '/for-developers/sending-email/laravel/',\n  },\n  {\n    from: '/Integrate/Frameworks/rubyonrails.html',\n    to: '/for-developers/sending-email/rubyonrails/',\n  },\n  {\n    from: '/Integrate/Frameworks/symfony.html',\n    to: '/for-developers/sending-email/symfony/',\n  },\n  {\n    from: '/Integrate/Frameworks/zend.html',\n    to: '/for-developers/sending-email/zend/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/csharp.html',\n    to: '/for-developers/tracking_events/csharp-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/go.html',\n    to: '/for-developers/tracking_events/go-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/nodejs.html',\n    to: '/for-developers/tracking_events/nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/php.html',\n    to: '/for-developers/tracking_events/php-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/python.html',\n    to: '/for-developers/tracking_events/python-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/Webhook_Examples/index.html',\n    to: '/for-developers/tracking_events/nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/nodejs.html',\n    to: '/for-developers/sending-email/smtp-nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/go.html',\n    to: '/for-developers/sending-email/smtp-go-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/index.html',\n    to: '/for-developers/sending-email/smtp-nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html',\n    to: '/for-developers/sending-email/smtp-perl-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/php.html',\n    to: '/for-developers/sending-email/smtp-php-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/python.html',\n    to: '/for-developers/sending-email/smtp-python-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.html',\n    to: '/for-developers/sending-email/smtp-ruby-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/csharp.html',\n    to: '/for-developers/sending-email/v2-csharp-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/php.html',\n    to: '/for-developers/sending-email/v2-php-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v2_Mail/index.html',\n    to: '/for-developers/sending-email/v2-go-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/csharp.html',\n    to: '/for-developers/sending-email/v3-csharp-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/go.html',\n    to: '/for-developers/sending-email/v3-go-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/java.html',\n    to: '/for-developers/sending-email/v3-java-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/nodejs.html',\n    to: '/for-developers/sending-email/v3-nodejs-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/php.html',\n    to: '/for-developers/sending-email/v3-php-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/python.html',\n    to: '/for-developers/sending-email/v3-python-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/ruby.html',\n    to: '/for-developers/sending-email/v3-ruby-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/v3_Mail/index.html',\n    to: '/for-developers/sending-email/v3-java-code-example/',\n  },\n  {\n    from: '/Integrate/Code_Examples/index.html',\n    to: '/for-developers/sending-email/libraries/',\n  },\n  {\n    from: '/Marketing_Emails/Email_Marketing_Campaigns/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Marketing_Emails/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Marketing_Emails/analytics.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from: '/Marketing_Emails/create_manage.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Marketing_Emails/dashboard.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Marketing_Emails/Email_Marketing_Campaigns/peer_invitations.html',\n    to: '/glossary/peer-invitations/',\n  },\n  {\n    from: '/Marketing_Emails/Email_Marketing_Campaigns/reconfirmation.html',\n    to: '/glossary/reconfirmation/',\n  },\n  {\n    from: '/Marketing_Emails/tags.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/Marketing_Emails/unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Marketing_Emails/recipients.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from: '/Marketing_Emails/sender_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/Transactional_Email/index.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/Transactional_Email/unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Transactional_Email/Template_Engine/setup_guide.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/dashboard.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/about.html',\n    to: '/',\n  },\n  {\n    from: '/User_Guide/Account/api_keys.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from: '/User_Guide/Account/index.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/global_settings.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/multiple_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/profile_settings.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Account/Account_Settings/two_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/ ',\n  },\n  {\n    from: '/User_Guide/Account/billing_settings.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/User_Guide/Account/billing_history.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/User_Guide/Account/billing.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/User_Guide/Account/alert_settings.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/User_Guide/advanced_suppression_manager.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from: '/User_Guide/Apps/address_whitelisting.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/User_Guide/Apps/bcc.html',\n    to: '/ui/account-and-settings/mail/#-BCC',\n  },\n  {\n    from: '/User_Guide/Apps/bypass_list_management.html',\n    to: '/for-developers/sending-email/smtp-filters #bypass_list_management',\n  },\n  {\n    from: '/User_Guide/Apps/click_tracking.html',\n    to: '/ui/account-and-settings/tracking #-Click-tracking',\n  },\n  {\n    from: '/User_Guide/Apps/dkim.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Apps/domain_keys.html',\n    to: '/ui/sending-email/how-to-set-up-domain-whitelabel ',\n  },\n  {\n    from: '/User_Guide/Apps/email_templates.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Apps/event_notification.html',\n    to: '/ui/account-and-settings/mail/#-Event-Notification',\n  },\n  {\n    from: '/User_Guide/Apps/footer.html',\n    to: '/ui/account-and-settings/mail/#-Footer',\n  },\n  {\n    from: '/User_Guide/Apps/forward_spam.html',\n    to: '/ui/account-and-settings/mail/#-Forward-Spam',\n  },\n  {\n    from: '/User_Guide/Apps/google_analytics.html',\n    to: '/ui/account-and-settings/tracking ',\n  },\n  {\n    from: '/User_Guide/Apps/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Apps/new_relic.html',\n    to: '/ui/account-and-settings/partners #-SendGrid-For-New-Relic',\n  },\n  {\n    from: '/User_Guide/Apps/open_tracking.html',\n    to: '/ui/account-and-settings/tracking #-Open-Tracking',\n  },\n  {\n    from: '/User_Guide/Apps/sendwithus.html',\n    to: '/ui/account-and-settings/partners #-sendwithus',\n  },\n  {\n    from: '/User_Guide/Apps/spam_checker.html',\n    to: '/ui/account-and-settings/mail/#-Spam-Checker',\n  },\n  {\n    from: '/User_Guide/Apps/subscription_tracking.html',\n    to: '/ui/account-and-settings/tracking #-Subscription-Tracking',\n  },\n  {\n    from: '/User_Guide/Apps/template_engine.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/attachments.html',\n    to: '/ui/sending-email/attachments-with-digioh ',\n  },\n  {\n    from: '/User_Guide/billing.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/User_Guide/clicktracking_ssl.html',\n    to: '/ui/sending-email/content-delivery-networks/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/advanced_statistics.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/alerts.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/email_error_messages.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/email_activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/email_reports.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/attachments.html',\n    to: '/ui/sending-email/attachments-with-digioh ',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/categories.html',\n    to: '/ui/analytics-and-reporting/categories/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/index.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/list_scrubbing.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/User_Guide/Delivery_Metrics/metrics.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/scheduling.html',\n    to: '/for-developers/sending-email/scheduling-parameters/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/sender_reputation.html',\n    to: '/glossary/sender-reputation/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/Subscription_Tracking/index.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/advanced_suppression_manager.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/defining_asm_groups.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/recipient_subscription_preferences.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/ ',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Subscription_Tracking/using_suppression_groups.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/advanced_suppression_manager.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/defining_asm_groups.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/Suppression_Tracking/index.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/recipient_subscription_preferences.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/ ',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/resubscription_of_users.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/ ',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/suppressions_vs_unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Suppression_Tracking/using_suppression_groups.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from:\n      '/User_Guide/Email_Deliverability/Undelivered_Email/bounce_forwarding.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/Undelivered_Email/drops.html',\n    to: '/glossary/drops/',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/Undelivered_Email/index.html',\n    to: '/glossary/undelivered-email ',\n  },\n  {\n    from: '/User_Guide/Email_Deliverability/Undelivered_Email/spam.html',\n    to: '/glossary/spam/',\n  },\n  {\n    from: '/User_Guide/Email_Settings/categories.html',\n    to: '/glossary/categories/',\n  },\n  {\n    from: '/User_Guide/managing_unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/api.html',\n    to: '/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/api_campaigns.html',\n    to: '/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/faq.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/create_manage.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/dashboard.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/analytics.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/recipients.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/sender_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/tags.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Marketing_Emails/unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/User_Guide/multiple_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/User_Guide/peer_invitations.html',\n    to: '/glossary/peer-invitations/',\n  },\n  {\n    from: '/User_Guide/reconfirmation.html',\n    to: '/glossary/reconfirmation/',\n  },\n  {\n    from: '/User_Guide/sending_practices.html',\n    to: '/glossary/rate-limiting/',\n  },\n  {\n    from: '/User_Guide/Settings/multiple_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/clicktracking_ssl.html',\n    to: '/ui/analytics-and-reporting/click-tracking-ssl/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/content_delivery_networks.html',\n    to: '/ui/sending-email/content-delivery-networks/',\n  },\n  {\n    from:\n      '/User_Guide/Setting_Up_Your_Server/Segmenting_Your_Traffic/index.html',\n    to: '/ui/managing-contacts/segmenting-your-contacts/',\n  },\n  {\n    from:\n      '/User_Guide/Setting_Up_Your_Server/Segmenting_Your_Traffic/subusers.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/smtp_ports.html',\n    to: '/for-developers/sending-email/getting-started-smtp/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/warming_up_ips.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/warming_up.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/Whitelabeling/dns_setup.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Setting_Up_Your_Server/Whitelabeling/spf.html',\n    to: '/glossary/spf/',\n  },\n  {\n    from:\n      '/User_Guide/Setting_Up_Your_Server/Whitelabeling/whitelabel_wizard.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/alert_settings.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/User_Guide/Settings/dkim.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/domain_keys.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/User_Guide/Settings/gravatar.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Settings/ips.html',\n    to: '/ui/account-and-settings/dedicated-ip-addresses/',\n  },\n  {\n    from: '/User_Guide/smtp_ports.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from: '/User_Guide/template_engine_setup.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/throttling.html',\n    to: '/glossary/throttling/',\n  },\n  {\n    from: '/User_Guide/two_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/ ',\n  },\n  {\n    from: '/User_Guide/Transactional_Email/Template_Engine/setup_guide.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/warming_up.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/User_Guide/whitelabel_wizard.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/multifactor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/ ',\n  },\n  {\n    from: '/User_Guide/multifactor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/ ',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/Campaigns/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/Campaigns/a_b_testing.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from: '/User_Guide/Settings/index.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/design_editor.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/code_editor.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/beta_editors.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/analytics.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/create_manage.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/dashboard.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/recipients.html',\n    to: '/ui/sending-email/managing-contact-list/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/sender_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/tags.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Legacy_Features/Marketing_Emails/unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/Utilities/event_kit.html',\n    to: '/for-developers/tracking-events/event-kit/',\n  },\n  {\n    from: '/Utilities/deliverabilitycenter.html',\n    to: '/ui/sending-email/deliverability/ ',\n  },\n  {\n    from: '/Utilities/index.html',\n    to: '/',\n  },\n  {\n    from: '/Utilities/list_assist.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from: '/Utilities/smtpapi_validator.html',\n    to: '/for-developers/sending-email/sending-email-smtp/',\n  },\n  {\n    from: '/User_Guide/Templates/index.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Templates/create_edit.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Templates/manage.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/VidGrid/activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/VidGrid/advanced_suppression_manager.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from: '/VidGrid/Email_Activity/activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/VidGrid/Event_Notification/configure.html',\n    to: '/for-developers/tracking-events/event/',\n  },\n  {\n    from: '/VidGrid/Event_Notification/eventkit.html',\n    to: '/for-developers/tracking-events/event-kit/',\n  },\n  {\n    from: '/VidGrid/Event_Notification/index.html',\n    to: '/for-developers/tracking-events/event/',\n  },\n  {\n    from: '/VidGrid/index.html',\n    to: '/',\n  },\n  {\n    from: '/VidGrid/Tools/listassist.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Analytics/index.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Analytics/marketing_statistics.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Analytics/unsubscribe_management.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Design/drag_and_drop.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Design/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Design/newsletter_basics.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Design/subscription_widget.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Design/weblink.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/marketing_emails_setup.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Recipients/exporting.html',\n    to: '//ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Recipients/index.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Recipients/recipient_list.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Review_and_Schedule/scheduling.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Review_and_Schedule/split_testing.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Setup/overview.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/VidGrid/Subuser/create_subuser.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/VidGrid/Subuser/create_subuser_whitelabel.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/VidGrid/template_engine.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/VidGrid/Template_Engine/template_engine.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/VidGrid/Tools/index.html',\n    to: ' ',\n  },\n  {\n    from: '/VidGrid/Whitelabel/whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication ',\n  },\n  {\n    from: '/VidGrid/whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication ',\n  },\n  {\n    from: '/VidGrid/Marketing_Emails/Review_and_Schedule/index.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/campaigns.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/beta_editors.html#-Edit-HTML-Head',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/analytics.html',\n    to: '/ui/sending-email/marketing-campaigns-stats/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/create_manage.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/dashboard.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/recipients.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/sender_address.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/tags.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/unsubscribes.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/faq.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/migration_checklist.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_recipient_lists.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_unsubscribes.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_images.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/downloading_historical_statistics.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/api_migration.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/Migrating_API.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/campaign_building.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/contact_management.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/statistics_reporting.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/pricing.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/api_comparison.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/security_compliance.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_content.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from:\n      '/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/letter_from_our_CPO.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/migrating_content.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/migrating_images.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/migrating_lists.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/migrating_unsubscribes.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/Classroom/Deliver/Address_Lists/list_scrubbing_guide.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/where_did_you_get_my_address_permission_reminders.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Glossary/opt_in_email.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/preference_centers_giving_subscribers_control.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.html',\n    to: '/ui//managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from: '/Classroom/Basics/Security/security_checklist.html',\n    to: '/ui/account-and-settings/hippa-compliant/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Security/secure_upload_download_supression_lists.html',\n    to: '/',\n    gone: true,\n  },\n  {\n    from: '/Classroom/Basics/Security/password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Security/keeping_your_registration_form_secure.html',\n    to: '/',\n    gone: true,\n  },\n  {\n    from: '/Classroom/Basics/Security/is_sendgrid_pci_compliant.html',\n    to: '/ui/account-and-settings/pci-compliant/',\n  },\n  {\n    from: '/Classroom/Basics/Security/is_sendgrid_hipaa_compliant.html',\n    to: '/ui/account-and-settings/hipaa-compliant/',\n  },\n  {\n    from: '/Classroom/Basics/Security/dont_share_your_password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/marketing_campaigns_video_tutorials.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/overview.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_video_tutorials.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/dont_know_your_username.html',\n    to: '/ui/account-and-settings/reset-username-password/',\n  },\n  {\n    from: '/Delivery_Metrics/metrics.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/User_Guide/Settings/Subusers/impersonation.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/User_Guide/Settings/Subusers/settings.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/User_Guide/Settings/Subusers/index.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Basics/Account/what_are_subusers.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/why_am_i_seeing_credential_resource_already_exists_when_i_am_creating_a_subuser_or_credential.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Send/How_Emails_Are_Sent/how_do_i_send_mail_through_subuser_accounts.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/Classroom/Basics/Account/how_can_i_cancel_my_account.html',\n    to: '/ui/account-and-settings/cancel-your-account/',\n  },\n  {\n    from: '/Classroom/Track/Bounces/common_smtp_server_bounce_responses.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/certificate_verification_failed.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/invalid_smtp_api_header.html',\n    to: '/for-developers/sending-email/smtp-errors-and-troubleshooting/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/drag_drop.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Account_Administration/recovering_your_username.html',\n    to: '/ui/account-and-settings/reset-username-password/',\n  },\n  {\n    from: '/Classroom/Deliver/Delivery_Introduction/ip_warmup_schedule.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Deliver/Delivery_Introduction/warming_up_ips.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Basics/Misc/automated_ip_warmup.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/how_to_read_your_invoice.html',\n    to: '/ui/account-and-settings/reading-your-invoice/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/lite_account_minimum_charge.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/legacy_lite_plan.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/is_your_account_billing_warned.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/is_your_account_billing_frozen.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/index.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/i_would_like_to_request_a_refund.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/how_does_overage_pricing_work.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Billing/how_does_billing_work_for_legacy_newsletter.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Billing/did_you_receive_a_billing_notification.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/billing_info_and_faqs.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/why_are_the_pro_plans_recommended_above_all_others.html',\n    to: '/pricing/',\n  },\n  {\n    from: '/Classroom/Basics/Account/sending_practices.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/where_can_i_find_my_invoices.html',\n    to: '/ui/account-and-settings/reading-your-invoice/',\n  },\n  {\n    from: '/Classroom/Basics/Billing/alternate_payment_methods.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/Delivery_Issues/max_hourly_limit.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Delivery_Issues/max_connection_limit.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Delivery_Issues/my_client_is_complaining_that_they_have_not_received_an_email.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/Introduction/how_can_i_tell_if_an_email_was_actually_delivered.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/Introduction/discrepancies_between_requests_and_deliveries.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Drops/resend_dropped_messages.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Drops/drop_reason_unsubscribed_address.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Drops/drop_reason_bounced_address.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/Collecting_Data/can_i_download_a_list_of_click_and_or_open_events.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.html',\n    to: '/ui/sending-email/bounces/',\n  },\n  {\n    from:\n      '/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.html',\n    to: '/ui/sending-email/bounces/',\n  },\n  {\n    from:\n      '/Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Bounces/bounce_reports_how_can_i_be_notified.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Track/Bounces/bounce_forwarding_and_gmail.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/why_did_my_message_show_as_delivered_first_then_as_bounced.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/search.html',\n    to: '',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/list_upload_troubleshooting.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/contacts.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Marketing_Campaigns/how_to_remove_unusable_contacts.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/User_Guide/Compliance/improving_contact_lists.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.html',\n    to: '/ui/managing-contacts/segmenting-your-contacts/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Send/Who_You_Can_Send_To/resubscription_of_users.html',\n    to: '/ui/managing-contacts/segmenting-your-contacts/',\n  },\n  {\n    from:\n      '/Classroom/Send/Who_You_Can_Send_To/can_i_send_to_purchased_lists.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/Classroom/Basics/Account/creating_teammates_for_subusers.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/what_is_the_difference_between_subusers_and_multiple_credentials.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Basics/Account/resetting_your_password_as_a_teammate.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/Classroom/Troubleshooting/Account_Administration/teammates.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/Classroom/Basics/Account/teammates_faq.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/a_custom_field_value_did_not_substitute_during_a_send.html',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/contact_fields.html',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.html#',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from: '/Classroom/Basics/Marketing_Campaigns/contact_fields.html#',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/format_CSV.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from: '/User_Guide/email_activity_beta.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/Classroom/Basics/API/why_event_api.html',\n    to: '/for-developers/tracking-events/event-webhook/',\n  },\n  {\n    from: '/Release_Notes/release_notes.html',\n    to: '/release-notes/',\n  },\n  {\n    from: '/User_Guide/Transactional_Templates/manage.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Transactional_Templates/index.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from:\n      '/User_Guide/Transactional_Templates/how_to_send_an_email_with_dynamic_transactional_templates.html',\n    to:\n      '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Transactional_Templates/using_handlebars.html',\n    to: '/ui/sending-email/using-handlebars/',\n  },\n  {\n    from: '/User_Guide/Transactional_Templates/Using_handlebars.html',\n    to: '/ui/sending-email/using-handlebars/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/ips.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/links.html',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/domains.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/overview.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_Authentication/how-to-set-up-domain-authentication.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/index.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/upgrading_your_whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html',\n    to: '/ui/sending-email/troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Troubleshooting/Authentication/dns_records_and_underscores.html',\n    to: '/ui/sending-email/troubleshooting/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/whitelabel_vs_whitelist.html',\n    to: '/glossary/whitelabel/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/subuser_whitelabels.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/link_whitelabels_explained.html',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/index.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/providers.html',\n    to: '/ui/account-and-settings/dns-providers/',\n  },\n  {\n    from: '/User_Guide/Settings/Whitelabel/faq.html',\n    to: '/glossary/whitelabel/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_Authentication/How_to_set_up_reverse_DNS.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_Authentication/how-to-set-up-link-branding.html',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n  {\n    from: '/Classroom/Basics/Whitelabel/setup_ip_whitelabel.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/User_Guide/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/email_activity.html',\n    to: '/ui/analytics-and-reporting/email-activity/',\n  },\n  {\n    from: '/User_Guide/email_activity_feed.html',\n    to: '/ui/analytics-and-reporting/email-activity-feed/',\n  },\n  {\n    from: '/User_Guide/SendGrid_for_Mobile/dashboard.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/SendGrid_for_Mobile/email_activity.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/SendGrid_for_Mobile/suppression.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/SendGrid_for_Mobile/subusers.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/SendGrid_for_Mobile/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Legacy_Newsletter/index.html',\n    to: '/ui/sending-email/legacy-newsletter-sunset/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/index.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/getting_started.html',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/notifications.html',\n    to: '/ui/account-and-settings/notifications/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/editor.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/senders.html',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/custom_fields.html',\n    to: '/ui/managing-contacts/custom-fields/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/a_b_testing.html',\n    to: '/ui/sending-email/a-b-testing/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/campaign_stats.html',\n    to: '/ui/analytics-and-reporting/marketing-campaigns-stats/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/Old_Editor_Sunset.html',\n    to: '/ui/sending-email/editor/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.html',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/formatting_a_CSV.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html',\n    to: '/ui/managing-contacts/segmenting-your-contacts/',\n  },\n  {\n    from: '/User_Guide/Statistics/index.html',\n    to: '/ui/analytics-and-reporting/stats-overview/',\n  },\n  {\n    from: '/User_Guide/Statistics/browser.html',\n    to: '/ui/analytics-and-reporting/browser/',\n  },\n  {\n    from: '/User_Guide/Statistics/categories.html',\n    to: '/ui/analytics-and-reporting/categories/',\n  },\n  {\n    from: '/User_Guide/Statistics/device.html',\n    to: '/ui/analytics-and-reporting/device/',\n  },\n  {\n    from: '/User_Guide/Statistics/geo.html',\n    to: '/ui/analytics-and-reporting/geographic/',\n  },\n  {\n    from: '/User_Guide/Statistics/global.html',\n    to: '/ui/analytics-and-reporting/global/',\n  },\n  {\n    from: '/User_Guide/Statistics/mailbox_provider.html',\n    to: '/ui/analytics-and-reporting/mailbox-provider/',\n  },\n  {\n    from: '/User_Guide/Statistics/mailbox_provider_compare.html',\n    to: '/ui/analytics-and-reporting/mailbox-provider-comparison/',\n  },\n  {\n    from: '/User_Guide/Statistics/parse.html',\n    to: '//for-developers/parsing-email/inbound-email/',\n  },\n  {\n    from: '/User_Guide/Statistics/subuser.html',\n    to: '/ui/analytics-and-reporting/subuser/',\n  },\n  {\n    from: '/User_Guide/Statistics/subuser_compare.html',\n    to: '/ui/analytics-and-reporting/subuser-comparison/',\n  },\n  {\n    from: '/User_Guide/Suppressions/index.html',\n    to: '/ui/sending-email/index-suppressions/',\n  },\n  {\n    from: '/User_Guide/Suppressions/advanced_suppression_manager.html',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from: '/User_Guide/Suppressions/blocks.html',\n    to: '/ui/sending-email/blocks/',\n  },\n  {\n    from: '/User_Guide/Suppressions/bounces.html',\n    to: '/ui/sending-email/bounces/',\n  },\n  {\n    from: '/User_Guide/Suppressions/global_unsubscribes.html',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from: '/User_Guide/Suppressions/group_unsubscribes.html',\n    to: '/ui/sending-email/group-unsubscribes/',\n  },\n  {\n    from: '/User_Guide/Suppressions/invalid_emails.html',\n    to: '/ui/sending-email/invalid-emails/',\n  },\n  {\n    from: '/User_Guide/Suppressions/recipient_subscription_preferences.html',\n    to: '/ui/sending-email/recipient-subscription-preferences/ ',\n  },\n  {\n    from: '/User_Guide/Suppressions/spam_reports.html',\n    to: '/ui/analytics-and-reporting/spam-reports/',\n  },\n  {\n    from:\n      '/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/User_Guide/Settings/account.html',\n    to: '/ui/account-and-settings/account/',\n  },\n  {\n    from: '/User_Guide/Settings/alerts.html',\n    to: '/ui/account-and-settings/alerts/',\n  },\n  {\n    from: '/User_Guide/Settings/api_keys.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from: '/User_Guide/Settings/billing.html',\n    to: '/ui/account-and-settings/billing/',\n  },\n  {\n    from: '/User_Guide/Settings/cancel_account.html',\n    to: '/ui/account-and-settings/cancel-your-account/',\n  },\n  {\n    from: '/User_Guide/Settings/dedicated_ip_addresses.html',\n    to: '/ui/account-and-settings/dedicated-ip-addresses/',\n  },\n  {\n    from: '/User_Guide/Settings/ip_access_management.html',\n    to: '/ui/account-and-settings/ip-access-management/',\n  },\n  {\n    from: '/User_Guide/Settings/ip_warmup.html',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/User_Guide/Settings/mail.html',\n    to: '/ui/account-and-settings/mail/',\n  },\n  {\n    from: '/User_Guide/Settings/parse.html',\n    to: '/ui/account-and-settings/inbound-parse/',\n  },\n  {\n    from: '/User_Guide/Settings/partners.html',\n    to: '/ui/account-and-settings/partners/',\n  },\n  {\n    from: '/User_Guide/Settings/reading_your_invoice.html',\n    to: '/ui/account-and-settings/reading-your-invoice/',\n  },\n  {\n    from: '/User_Guide/Settings/reset_username_password.html',\n    to: '/ui/account-and-settings/resetting-your-username-and-password/',\n  },\n  {\n    from: '/User_Guide/Settings/subusers.html',\n    to: '/ui/account-and-settings/subusers/',\n  },\n  {\n    from: '/User_Guide/Settings/teammates.html',\n    to: '/ui/account-and-settings/teammates/',\n  },\n  {\n    from: '/User_Guide/Settings/tracking.html',\n    to: '/ui/account-and-settings/tracking/',\n  },\n  {\n    from: '/User_Guide/Settings/two_factor_authentication.html',\n    to: '/ui/account-and-settings/two-factor-authentication/ ',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/how-to-set-up-domain-authentication.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/how-to-set-up-link-branding.html',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/how-to-set-up-reverse-dns.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/User_Guide/Settings/Sender_authentication/Troubleshooting.html',\n    to: '/ui/account-and-settings/troubleshooting-sender-authentication/',\n  },\n  {\n    from: '/User_Guide/Settings/Sender_authentication/providers.html',\n    to: '/ui/account-and-settings/dns-providers/',\n  },\n  {\n    from: '/Glossary/index.html',\n    to: '/glossary/',\n  },\n  {\n    from: '/Glossary/7_bit_encoding.html',\n    to: '/glossary/7-bit-encoding/',\n  },\n  {\n    from: '/Glossary/a_record.html',\n    to: '/glossary/a-record/',\n  },\n  {\n    from: '/Glossary/automated_email.html',\n    to: '/glossary/automated-email/',\n  },\n  {\n    from: '/Glossary/autoresponder.html',\n    to: '/glossary/autoresponder/',\n  },\n  {\n    from: '/Glossary/bayesian_filter.html',\n    to: '/glossary/bayesian-filter/',\n  },\n  {\n    from: '/Glossary/black_hat_sender.html',\n    to: '/glossary/black-hat-sender/',\n  },\n  {\n    from: '/Glossary/blacklists.html',\n    to: '/glossary/blacklists/',\n  },\n  {\n    from: '/Glossary/blocks.html',\n    to: '/glossary/blocks/',\n  },\n  {\n    from: '/Glossary/bounces.html',\n    to: '/glossary/bounces/',\n  },\n  {\n    from: '/Glossary/bulk_email_service.html',\n    to: '/glossary/bulk-email-service/',\n  },\n  {\n    from: '/Glossary/bulk_mail_folder.html',\n    to: '/glossary/bulk-mail-folder/',\n  },\n  {\n    from: '/Glossary/campaigns.html',\n    to: '/glossary/campaigns/',\n  },\n  {\n    from: '/Glossary/can_spam.html',\n    to: '/glossary/can-spam/',\n  },\n  {\n    from: '/Glossary/categories.html',\n    to: '/glossary/categories/',\n  },\n  {\n    from: '/Glossary/challenge_response.html',\n    to: '/glossary/challenge-response/',\n  },\n  {\n    from: '/Glossary/clicks.html',\n    to: '/glossary/clicks/',\n  },\n  {\n    from: '/Glossary/cname.html',\n    to: '/glossary/cname/',\n  },\n  {\n    from: '/Glossary/complaint.html',\n    to: '/glossary/complaint/',\n  },\n  {\n    from: '/Glossary/ctr.html',\n    to: '/glossary/ctr/',\n  },\n  {\n    from: '/Glossary/custom_fields.html',\n    to: '/glossary/custom-fields/',\n  },\n  {\n    from: '/Glossary/deferrals.html',\n    to: '/glossary/deferrals/',\n  },\n  {\n    from: '/Glossary/deliveries.html',\n    to: '/glossary/deliveries/',\n  },\n  {\n    from: '/Glossary/dkim.html',\n    to: '/glossary/dkim/',\n  },\n  {\n    from: '/Glossary/dmarc.html',\n    to: '/glossary/dmarc/',\n  },\n  {\n    from: '/Glossary/dns.html',\n    to: '/glossary/dns/',\n  },\n  {\n    from: '/Glossary/domain.html',\n    to: '/glossary/domain/',\n  },\n  {\n    from: '/Glossary/domain_authentication.html',\n    to: '/glossary/domain-authentication/',\n  },\n  {\n    from: '/Glossary/drip_campaign.html',\n    to: '/glossary/drip-campaign/',\n  },\n  {\n    from: '/glossary/drops/.html',\n    to: '/glossary/drops/ ',\n  },\n  {\n    from: '/Glossary/email_api_integration.html',\n    to: '/glossary/email-api-integration/',\n  },\n  {\n    from: '/Glossary/email_authentication.html',\n    to: '/glossary/email-authentication/',\n  },\n  {\n    from: '/Glossary/email_deliverability.html',\n    to: '/glossary/deliverability/',\n  },\n  {\n    from: '/Glossary/email_harvesting.html',\n    to: '/glossary/email-harvesting/',\n  },\n  {\n    from: '/Glossary/email_marketing.html',\n    to: '/glossary/email-marketing/',\n  },\n  {\n    from: '/Glossary/email_service_provider.html',\n    to: '/glossary/email-service-provider ',\n  },\n  {\n    from: '/Glossary/event_webhook.html',\n    to: '/glossary/event-webhook/',\n  },\n  {\n    from: '/Glossary/expired.html',\n    to: '/glossary/expired/',\n  },\n  {\n    from: '/Glossary/feedback_loop.html',\n    to: '/glossary/feedback-loop/',\n  },\n  {\n    from: '/Glossary/header.html',\n    to: '/glossary/header/',\n  },\n  {\n    from: '/Glossary/imap.html',\n    to: '/glossary/imap/',\n  },\n  {\n    from: '/Glossary/invalid_email.html',\n    to: '/glossary/invalid-email/',\n  },\n  {\n    from: '/Glossary/ip_address.html',\n    to: '/glossary/ip-address/',\n  },\n  {\n    from: '/Glossary/ip_warmup.html',\n    to: '/glossary/ip-warmup/',\n  },\n  {\n    from: '/Glossary/link_branding.html',\n    to: '/glossary/link-branding/',\n  },\n  {\n    from: '/Glossary/lists.html',\n    to: '/glossary/lists/',\n  },\n  {\n    from: '/Glossary/mail_merge.html',\n    to: '/glossary/mail-merge/',\n  },\n  {\n    from: '/Glossary/mailbox_provider.html',\n    to: '/glossary/mailbox-provider/',\n  },\n  {\n    from: '/Glossary/message_id.html',\n    to: '/glossary/message-id/',\n  },\n  {\n    from: '/Glossary/mta.html',\n    to: '/glossary/mta/',\n  },\n  {\n    from: '/Glossary/mx_record.html',\n    to: '/glossary/mx-record/',\n  },\n  {\n    from: '/Glossary/open_rate.html',\n    to: '/glossary/open-rate/',\n  },\n  {\n    from: '/Glossary/openrelay.html',\n    to: '/glossary/openrelay/',\n  },\n  {\n    from: '/Glossary/peer_invitations.html',\n    to: '/glossary/peer-invitations/',\n  },\n  {\n    from: '/Glossary/preheader.html',\n    to: '/glossary/preheader/',\n  },\n  {\n    from: '/Glossary/rate_limiting.html',\n    to: '/glossary/rate-limiting/',\n  },\n  {\n    from: '/Glossary/reconfirmation.html',\n    to: '/glossary/reconfirmation/',\n  },\n  {\n    from: '/Glossary/reputation_monitoring.html',\n    to: '/glossary/reputation-monitoring/',\n  },\n  {\n    from: '/Glossary/request.html',\n    to: '/glossary/request/',\n  },\n  {\n    from: '/Glossary/reseller_email_account.html',\n    to: '/glossary/reseller-email-account/',\n  },\n  {\n    from: '/Glossary/reserved_fields.html',\n    to: '/glossary/reserved-fields/',\n  },\n  {\n    from: '/Glossary/reverse_dns.html',\n    to: '/glossary/reverse-dns/',\n  },\n  {\n    from: '/Glossary/scheduled_emails.html',\n    to: '/glossary/scheduled-emails/',\n  },\n  {\n    from: '/Glossary/segments.html',\n    to: '/glossary/segments/',\n  },\n  {\n    from: '/Glossary/segmentation.html',\n    to: '/glossary/segmentation/',\n  },\n  {\n    from: '/Glossary/senders.html',\n    to: '/glossary/senders/',\n  },\n  {\n    from: '/Glossary/sender_authentication.html',\n    to: '/glossary/sender-authentication/',\n  },\n  {\n    from: '/Glossary/smtp.html',\n    to: '/glossary/smtp/',\n  },\n  {\n    from: '/Glossary/smtp_api.html',\n    to: '/glossary/smtp-api/',\n  },\n  {\n    from: '/Glossary/smtp_provider.html',\n    to: '/glossary/smtp-provider/',\n  },\n  {\n    from: '/Glossary/smtp_relay.html',\n    to: '/glossary/smtp-relay/',\n  },\n  {\n    from: '/Glossary/smtp_server.html',\n    to: '/glossary/smtp-server/',\n  },\n  {\n    from: '/Glossary/smtp_service.html',\n    to: '/glossary/smtp-service/',\n  },\n  {\n    from: '/Glossary/spam.html',\n    to: '/glossary/spam/',\n  },\n  {\n    from: '/Glossary/spam_filter.html',\n    to: '/glossary/spam-filter/',\n  },\n  {\n    from: '/Glossary/spam_reports.html',\n    to: '/glossary/spam-reports/',\n  },\n  {\n    from: '/Glossary/spam_traps.html',\n    to: '/glossary/spam-traps/',\n  },\n  {\n    from: '/Glossary/spf.html',\n    to: '/glossary/spf/',\n  },\n  {\n    from: '/Glossary/spoofing.html',\n    to: '/glossary/spoofing/',\n  },\n  {\n    from: '/Glossary/subjects.html',\n    to: '/glossary/subjects/',\n  },\n  {\n    from: '/Glossary/subscriber_list_management.html',\n    to: '/glossary/subscriber-list-management/',\n  },\n  {\n    from: '/Glossary/system_fields.html',\n    to: '/glossary/system-fields/',\n  },\n  {\n    from: '/Glossary/teammates.html',\n    to: '/glossary/teammates/',\n  },\n  {\n    from: '/Glossary/throttling.html',\n    to: '/glossary/throttling/',\n  },\n  {\n    from: '/Glossary/timezone.html',\n    to: '/glossary/timezone/',\n  },\n  {\n    from: '/Glossary/tls.html',\n    to: '/glossary/tls/',\n  },\n  {\n    from: '/Glossary/transactional_email.html',\n    to: '/glossary/transactional-email/',\n  },\n  {\n    from: '/Glossary/transactional_email_templates.html',\n    to: '/glossary/transactional-email-templates/',\n  },\n  {\n    from: '/Glossary/triggered_actions.html',\n    to: '/glossary/triggered-actions/',\n  },\n  {\n    from: '/Glossary/triggered_email.html',\n    to: '/glossary/triggered-email/',\n  },\n  {\n    from: '/Glossary/two_factor_authentication.html',\n    to: '/glossary/two-factor-authentication/',\n  },\n  {\n    from: '/Glossary/undelivered_email.html',\n    to: '/glossary/undelivered-email/',\n  },\n  {\n    from: '/Glossary/unknown_user.html',\n    to: '/glossary/unknown-user/',\n  },\n  {\n    from: '/Glossary/web_api.html',\n    to: '/glossary/web-api/',\n  },\n  {\n    from: '/Glossary/white_hat_sender.html',\n    to: '/glossary/white-hat-sender/',\n  },\n  {\n    from: '/Glossary/whitelabel.html',\n    to: '/glossary/whitelabel/',\n  },\n  {\n    from: '/Glossary/whitelist.html',\n    to: '/glossary/whitelist/',\n  },\n  {\n    from: '/Glossary/x_message_id.html',\n    to: '/glossary/x-message-id/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/my_emails_are_going_to_spam.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_Authentication/How_to_set_up_domain_authentication.html',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_Authentication/How_to_set_up_link_branding.html',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/Managing_Contacts_lists.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/Managing_Contacts/format_CSV.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from:\n      '/User_Guide/Transactional_Templates/create__and_edit_transactional_templates.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from:\n      '/User_Guide/MarketingUser_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.html',\n    to: '/ui/managing-contacts/building-your-contact-list/',\n  },\n  {\n    from: '/User_Guide/Account_Management/cancel_account.html',\n    to: '/ui/account-and-settings/cancel-your-account/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/formatting_a_CSV.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from: '/User_Guide/Legacy_Newsletter/recipients.html',\n    to: '/ui/managing-contacts/managing-contact-list/',\n  },\n  {\n    from:\n      '/User_Guide/Transactional_Templates/Create_and_edit_dynamic_transactional_templates.html',\n    to:\n      '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/help_my_emails_arent_being_delivered.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Send/v3_Mail_Send/curl_examples.html',\n    to: '/for-developers/sending-email/curl-examples/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/why_is_sendgrid_net_greylisted.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.html',\n    to: '/glossary/drops/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/what_do_i_do_if_im_blacklisted.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Glossary/drops.html',\n    to: '/glossary/drops/',\n  },\n  {\n    from: '/Classroom/Basics/API/api_key_permissions.html',\n    to: '/ui/account-and-settings/api-keys/',\n  },\n  {\n    from: '/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/User_Guide/Statistics/category_compare.html',\n    to: '/ui/analytics-and-reporting/category-comparison/',\n  },\n  {\n    from: '/Integrate/Tutorials/piesync.html',\n    to: '/for-developers/sending-email/piesync/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/how_do_i_keep_emails_from_dropping.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html',\n    to: '/ui/account-and-settings/how-to-set-up-reverse-dns/',\n  },\n  {\n    from: '/Classroom/Basics/Misc/your_reputation_what_is_it.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/User_Guide/Settings/taxes_and_tax_exempt.html',\n    to: '/ui/account-and-settings/taxes-and-tax-exempt/',\n  },\n  {\n    from: '/release_notes.html',\n    to: '/release-notes/',\n  },\n  {\n    from:\n      '/Classroom/Deliver/Undeliverable_Email/google_feedback_loop_spam_complaints.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Classroom/Deliver/Undeliverable_Email/spam_trapped.html',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/Integrate/Tutorials/Zapier/index.html',\n    to: '/for-developers/sending-email/zapier-sending-for-new-webhook-data/',\n  },\n  {\n    from: '/Classroom/Send/v3_Mail_Send/index.html',\n    to: '/api-reference/',\n  },\n  {\n    from:\n      '/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html',\n    to: '/glossary/link-branding/',\n  },\n  {\n    from:\n      '/User_Guide/Transactional_Templates/migrating_from_legacy_templates.html',\n    to: '/ui/sending-email/migrating-from-legacy-templates/',\n  },\n  {\n    from: '/User_Guide/Marketing_Campaigns/templates.html',\n    to: '/ui/sending-email/create-and-edit-transactional-templates/',\n  },\n  {\n    from: '/Integrate/Tutorials/EngineYard.html',\n    to: '/for-developers/partners/google/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/Managing_Contacts/formating_a_CSV.html',\n    to: '/ui/managing-contacts/formatting-a-csv/',\n  },\n  {\n    from: '/Integrate/Open_Source_Apps/modx.html',\n    to: '/for-developers/sending-email/modx/',\n  },\n  {\n    from: '/ui/sending-email/reputation/',\n    to: '/ui/sending-email/deliverability/',\n  },\n  {\n    from: '/ui/sending-email/create-and-edit-transactional-templates/',\n    to: '/ui/sending-email/create-and-edit-legacy-transactional-templates/',\n  },\n  {\n    from: '/ui/managing-contacts/adding-contacts/',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from: '/ui/sending-email/working-with-marketing-templates/',\n    to: '/ui/sending-email/working-with-marketing-campaigns-email-designs/',\n  },\n  {\n    from: '/ui/managing-contacts/managing-contact-list/',\n    to: '/ui/managing-contacts/create-and-manage-contacts/',\n  },\n  {\n    from: '/ui/ads/',\n    to: '/',\n  },\n  {\n    from:\n      '/User_Guide/Marketing_Campaigns/create-and-manage-unsubscribe-groups.html',\n    to: '/ui/sending-email/create-and-manage-unsubscribe-groups/',\n  },\n  {\n    from: '/User_Guide/Statistics/browser_compare.html',\n    to: '/ui/analytics-and-reporting/browser-comparison/',\n  },\n  {\n    from: '/ui/analytics-and-reporting/mailbox-provider/',\n    to: '/ui/analytics-and-reporting/mailbox-provider-comparison/',\n  },\n  {\n    from: '/ui/sending-email/using-handlebars/',\n    to: '/for-developers/sending-email/using-handlebars/',\n  },\n  {\n    from: '/for-developers/sending-email/building-an-smtp-email/',\n    to: '/for-developers/sending-email/building-an-x-smtpapi-header/',\n  },\n  {\n    from: '/for-developers/sending-email/sandbox/',\n    to: '/for-developers/sending-email/sandbox-mode/',\n  },\n  {\n    from: '/for-developers/sending-email/sending-email-api/',\n    to: '/for-developers/sending-email/api-getting-started/',\n  },\n  {\n    from: '/ui/account-and-settings/sending-email/global-unsubscribes/',\n    to: '/ui/sending-email/global-unsubscribes/',\n  },\n  {\n    from:\n      '/ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/',\n    to: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    from: '/report-spam/',\n    to: '/ui/account-and-settings/support/',\n  },\n  {\n    from: '/ui/account-and-settings/hippa-compliant/',\n    to: '/ui/account-and-settings/hipaa-compliant/',\n  },\n  {\n    from: '/ui/sending-email/custom-ssl-configurations/',\n    to: '/ui/account-and-settings/custom-ssl-configurations/',\n  },\n  {\n    from: '/Classroom/Build/Choose_Content/gmail_promotions_tab.html',\n    to: 'https://sendgrid.com/blog/i-fought-the-tabs-and-the-tabs-won/',\n  },\n  {\n    from: '/resource/general-data-protection-regulation/',\n    to: '/glossary/gdpr/',\n  },\n  {\n    from: '/ui/sending-email/sendmail/',\n    to: '/for-developers/sending-email/sendmail/',\n  },\n  {\n    from: '/for-developers/sending-email/sending-email-smtp/',\n    to: '/for-developers/sending-email/getting-started-smtp/',\n  },\n  {\n    from: '/ui/sending-email/can-i-send-adult-content-in-my-emails/',\n    to: '/ui/sending-email/deliverability/#sending-adult-content',\n  },\n  {\n    from: '/ui/analytics-and-reporting/click-tracking/',\n    to: '/ui/analytics-and-reporting/click-tracking-html-best-practices/',\n  },\n  {\n    from: '/ui/sending-email/unsubcribe-groups/',\n    to: '/ui/sending-email/unsubscribe-groups/',\n  },\n  {\n    from: '/ui/analytics-and-reporting/subscription-tracking/',\n    to: '/ui/sending-email/subscription-tracking/',\n  },\n  {\n    from: '/ui/account-and-settings/accessing-email-associated-with-sendgrid/',\n    to:\n      '/ui/account-and-settings/accessing-email-account-associated-with-sendgrid/',\n  },\n  {\n    from: '/ui/account-and-settings/checking-email-source/',\n    to: '/ui/sending-email/checking-email-source/',\n  },\n  {\n    from: '/ui/sending-email/how-to-set-up-domain-authentication/',\n    to: '/ui/account-and-settings/how-to-set-up-domain-authentication/',\n  },\n  {\n    from: '/ui/sending-email/how-to-set-up-link-branding/',\n    to: '/ui/account-and-settings/how-to-set-up-link-branding/',\n  },\n\n  {\n    from: '/ui/account-and-settings/senders/',\n    to: '/ui/sending-email/senders/',\n  },\n  {\n    from: '/ui/sending-email/how-to-warm-up-an-ip/',\n    to: '/ui/sending-email/warming-up-an-ip-address/',\n  },\n  {\n    from: '/User_Guide/Settings/',\n    to: '/',\n  },\n  {\n    from: '/index.html/',\n    to: '/',\n  },\n  {\n    from:\n      '/ui/sending-email/how-to-send-email-with-marketing-campaigns-with-dynamic-transactional-templates/',\n    to:\n      '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n  },\n  {\n    from:\n      '/for-developers/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n    to:\n      '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/',\n  },\n  {\n    from: '/for-developers/sending-email/using-the-v2-api/',\n    to: 'https://www.twilio.com/docs/sendgrid/api/v2/using_the_web_api',\n  },\n  {\n    from: '/glossary/blacklists/',\n    to: 'glossary/deny-list/',\n  },\n  {\n    from: 'glossary/whitelist/',\n    to: 'glossary/allow-list/',\n  },\n  {\n    from: '/ui/sending-email/blacklists/',\n    to: '/ui/sending-email/deny-lists/',\n  },\n  {\n    from: '/glossary/white-hat-sender/',\n    to: '/glossary/trusted-sender/',\n  },\n  {\n    from: 'glossary/black-hat-sender/',\n    to: '/glossary/suspicious-sender/',\n  },\n  {\n    from: '/ui/account-and-settings/aol-dmarc/',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from: '/ui/account-and-settings/gmail-dmarc/',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from: '/ui/account-and-settings/microsoft-dmarc/',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from: '/ui/account-and-settings/yahoo-dmarc/',\n    to: '/ui/sending-email/dmarc/',\n  },\n  {\n    from: '/for-developers/sending-email/v3-nodejs-code-example/',\n    to: '/for-developers/sending-email/quickstart-nodejs/',\n  },\n  {\n    from: '/for-developers/partners/magento/',\n    to: '/for-developers/partners/',\n  },\n  {\n    from: '/API_Reference/index.html',\n    to: '/api-reference/',\n  },\n  {\n    from: '/API_Reference/api_getting_started.html',\n    to: '/api-reference/',\n  },\n  {\n    from: '/API_Reference/index/',\n    to: '/api-reference/',\n  },\n  {\n    from: '/API_Reference/SMTP_API/integrating_with_the_smtp_api.html',\n    to: '/for-developers/sending-email/integrating-with-the-smtp-api/',\n  },\n  {\n    from: '/API_Reference/SMTP_API.*',\n    to: '/for-developers/sending-email/getting-started-smtp/',\n  },\n  {\n    from: '/API_Reference/Web_API/.*',\n    to: 'https://www.twilio.com/docs/sendgrid/api/v2',\n  },\n  {\n    from: '/API_Reference/Web_API_v3.*',\n    to: '/api-reference/',\n  },\n  {\n    from: '/ui/account-and-settings/troubleshooting-login/',\n    to: '/ui/account-and-settings/log-in-issues/',\n  },\n];\n"
  },
  {
    "path": "src/components/About/About.scss",
    "content": ".about {\n  display: flex;\n  justify-content: center;\n  align-content: center;\n  align-items: center;\n  min-height: 300px;\n  color: #f00;\n}\n"
  },
  {
    "path": "src/components/About/index.jsx",
    "content": "import React from 'react';\nimport './About.scss';\n\nfunction About() {\n    return (\n      <div className=\"about\">\n        <h1>\n          Edit About component or pages/about.jsx to include your information.\n        </h1>\n      </div>\n    );\n}\n\nexport default About;\n"
  },
  {
    "path": "src/components/AsideMenu/index.jsx",
    "content": "import React, { Component } from 'react';\nimport _ from 'lodash';\n\nclass AsideMenu extends Component {\n  constructor(props) {\n    super(props);\n\n    this.scrollSpy = this.scrollSpy.bind(this);\n    // Scrollspy will highlight next section when header is 100 pixels from top of browser chrome.\n    this.scrollSpyOffset = 100;\n\n    this.state = {\n      activeNavItem: false,\n      pageType: this.props.pageType || false,\n    };\n  }\n\n  componentDidMount() {\n    this.scrollSpy();\n    window.addEventListener('scroll', this.scrollSpy);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('scroll', this.scrollSpy);\n  }\n\n  scrollSpy() {\n    const selector = this.state.pageType === 'release-notes' ? 'h2 .anchor' : 'h2 .anchor, h3 .anchor';\n    const headers = Array.from(document.querySelectorAll(selector));\n\n    // headers with offset\n    const headersOffset = headers.map((el, i) => {\n      const { slug } = el.dataset;\n      let nextEl;\n\n      // Offset for a given section is the NEXT header.\n      if ((headers.length - 1) !== i) {\n        nextEl = headers[i + 1].getBoundingClientRect().top;\n      } else {\n        nextEl = headers[i].getBoundingClientRect().top + 9000;\n      }\n\n      const offset = (nextEl + document.body.scrollTop) - this.scrollSpyOffset;\n      return { slug, offset };\n    });\n\n\n    // Headers with postive scrolltop value\n    const headersScrollTop = headersOffset.filter(el => el.offset > 0);\n\n    this.setState({ activeNavItem: headersScrollTop[0] });\n  }\n\n  render() {\n    const navItems = this.props.asideLinks;\n\n    return (\n      <aside className=\"aside-nav\">\n        <div className=\"aside-nav__title is-size-h5\">In the article</div>\n        {navItems.map(el => {\n            const {\n              id,\n              textNode,\n            } = el;\n            let classes = `doc-header ${el.tagName}`;\n\n            if (el.id === this.state.activeNavItem.slug) {\n              classes += ' active';\n            }\n\n            return <a key={id} className={classes} href={`#${id}`}>{textNode}</a>;\n        })}\n      </aside>\n    );\n  }\n}\n\nexport default AsideMenu; \n"
  },
  {
    "path": "src/components/BreadCrumbs/index.jsx",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'gatsby';\nimport _ from 'lodash';\n\nclass BreadCrumbs extends Component {\n  constructor(props) {\n    super(props);\n    this.pathParts = this.getPathParts();\n\n    this.state = {\n      items: this.getSubPaths(),\n    };\n  }\n\n  getPathParts() {\n    const { location } = this.props;\n    const { pathname } = location;\n    const parts = pathname.split('/');\n    // We don't want \"docs\" or \"UI\" in the breadcrumbs\n    return parts.filter(item => item.length && item !== 'docs');\n  }\n\n  getSubPaths() {\n    const { location } = this.props;\n    const { pathname } = location;\n\n    // No matter what, add and object that represents the docs home\n    const home = [\n      {\n        textNode: 'home',\n        to: '/',\n      },\n    ];\n\n    const allPaths = this.pathParts.map((text) => {\n      const path = pathname.substring(0, pathname.indexOf(text)) + text;\n      const to = `${path.replace('/docs', '')}/`;\n      const textNode = text === 'ui' ? 'User Interface' : text.replace(/-/g, ' ');\n      return (\n        {\n          textNode,\n          to,\n        }\n      );\n    });\n\n    this.allPaths = allPaths;\n\n    // All paths but current page -- title is added in render method\n    const subPaths = [...allPaths.slice(0, allPaths.length - 1)];\n\n    // Combine with home object and return.\n    return [...home, ...subPaths];\n  }\n\n  getTitle() {\n    let pageTitle;\n    const { data } = this.props;\n\n    if (data && _.has(data[Object.keys(data)], 'fields')) {\n      pageTitle = data[Object.keys(data)].fields.title;\n    } else {\n      pageTitle = this.pathParts.slice(-1)[0].replace(/-/g, ' ');\n    }\n\n    // update the last textNode with page title\n    this.allPaths[this.allPaths.length - 1].textNode = pageTitle;\n\n    return pageTitle;\n  }\n\n  getJSONLD() {\n    const json = {\n      '@context': 'http://schema.org',\n      '@type': 'BreadcrumbList',\n      itemListElement: [],\n    };\n\n    const itemList = this.allPaths.map((item, index) => {\n      const listItem = {\n        '@type': 'ListItem',\n        position: index + 1,\n        item: {\n          '@id': item.to,\n          name: item.textNode,\n        },\n      };\n      return listItem;\n    });\n\n    json.itemListElement = [...itemList];\n\n    return json;\n  }\n\n  render() {\n    const { items } = this.state;\n    return (\n      <div>\n        <ul className=\"breadcrumb\">\n          {items.map((item) => {\n            const classes = `breadcrumb-item-${item.textNode.replace(' ', '-').toLowerCase()}`;\n            return (\n              <li key={item.textNode} className={classes}>\n                <Link to={item.to}>{item.textNode}</Link>\n              </li>\n            );\n          })}\n          <li dangerouslySetInnerHTML={{ __html: this.getTitle() }} />\n        </ul>\n        <script type=\"application/ld+json\">\n          {JSON.stringify(this.getJSONLD())}\n        </script>\n      </div>\n    );\n  }\n}\n\nexport default BreadCrumbs;\n"
  },
  {
    "path": "src/components/Footer/Footer.scss",
    "content": "@import '../../scss/global/variables';\n\n.footer {\n  background: $light-blue;\n  font-size: $scaledown-1;\n  padding: $scaleup-4 0;\n\n  a {\n    color: $slate-80;\n\n    &:hover {\n      color: $primary;\n    }\n  }\n\n  ul {\n    display: flex;\n    justify-content: center;\n\n    @media (max-width: $width-mobile) {\n      flex-wrap: wrap;\n    }\n  }\n\n  li {\n\n    @media (max-width: $width-mobile) {\n      margin: 0 $scale-base-up-04 $scale-base-down-02;\n    }\n\n    &::after {\n      content: ' | ';\n      display: inline-block;\n      margin: 0 $scale-base-up-05;\n\n      @media (max-width: $width-mobile) {\n        display: none;\n      }\n    }\n  }\n\n  li:last-of-type {\n\n    &::after {\n      display: none;\n    }\n  }\n}\n\n.footer-logo {\n  display: block;\n  margin: 0 auto 20px;\n  height: 28px;\n  width: 28px;\n  background: url('https://sendgrid.com/brand/sg-mark.svg') no-repeat center center;\n  background-size: 34px;\n}\n"
  },
  {
    "path": "src/components/Footer/index.jsx",
    "content": "import React, { Component } from 'react';\nimport './Footer.scss';\n\nclass Footer extends Component {\n  render() {\n    return (\n      <footer className=\"footer\">\n        <div className=\"container-lg footer-container\">\n          <div className=\"footer-logo\" />\n          <ul>\n            <li>\n              <a href=\"https://sendgrid.com/about/\" title=\"About\">About</a>\n            </li>\n            <li>\n              <a href=\"https://sendgrid.com/policies/tos/\" title=\"Terms\">Terms</a>\n            </li>\n            <li>\n              Copyright {(new Date().getFullYear())} Twilio SendGrid\n            </li>\n            <li>\n              All Rights Reserved\n            </li>\n            <li>\n              <a href=\"https://sendgrid.com/\" title=\"SendGrid.com\">SendGrid.com</a>\n            </li>\n          </ul>\n        </div>\n      </footer>\n    );\n  }\n}\n\nexport default Footer;\n"
  },
  {
    "path": "src/components/FooterCallout/FooterCallout.scss",
    "content": "@import '../../scss/global/variables';\n\n.footer-callout {\n  background: $slate;\n  background: $gradient-callout;\n  position: relative;\n  padding: $scaleup-8 0;\n\n  &-pattern {\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    background: url('https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/patterns/pixel-pattern-bottom-left-dark.svg') no-repeat bottom left;\n    width: 100%;\n    height: 100%;\n  }\n\n  .container {\n    position: relative;\n  }\n}\n"
  },
  {
    "path": "src/components/FooterCallout/index.jsx",
    "content": "import React from 'react';\nimport { Link } from 'gatsby';\nimport './FooterCallout.scss';\n\nfunction FooterCallout() {\n  return (\n    <div className=\"footer-callout\">\n      <div className=\"footer-callout-pattern\" />\n      <div className=\"container\">\n        <div className=\"row\">\n          <div className=\"col-md-6\">\n            <h2 className=\"is-size-h1 color-white\">For Developers</h2>\n            <p className=\"color-slate-10\">Integrate with SendGrid using our API or SMTP.</p>\n            <Link className=\"btn btn-white\" to=\"/for-developers/\">View Developer Docs</Link>\n          </div>\n          <div className=\"col-md-6\">\n            <div className=\"card card--glossary\">\n              <h3 className=\"card__title\">Quicklinks</h3>\n              <p className=\"glossary-link\"><Link to=\"/for-developers/sending-email/api-getting-started/\">Getting Started</Link></p>\n              <p className=\"glossary-link\"><Link to=\"/api-reference/\">API Documentation</Link></p>\n              <p className=\"glossary-link\"><Link to=\"/for-developers/sending-email/libraries/\">Code Libraries</Link></p>\n              <p className=\"glossary-link\"><Link to=\"/ui/account-and-settings/api-keys/\">API Keys</Link></p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default FooterCallout;\n"
  },
  {
    "path": "src/components/GlossaryPartial/GlossaryPartial.scss",
    "content": "@import '../../scss/global/variables';\n\n.home-glossary {\n  margin: $scaleup-5 0;\n  z-index: 2;\n\n  h2 {\n    position: relative;\n    text-align: center;\n  }\n}\n\n.home-glossary__container {\n  padding-left: $scaleup-11;\n  padding-right: $scaleup-11;\n\n  @media (max-width: $width-mobile) {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n}\n\np.glossary-link {\n  margin-bottom: $scaledown-1;\n}\n\n.glossary-icon {\n  margin: 0 auto 0 $scaleup-1;\n  display: block;\n\n  @media (max-width: $width-mobile) {\n    margin: $scaleup-1 auto 0;\n  }\n}\n\n.for-devs-glossary {\n  background: $mantis;\n  background: $gradient-dev-glossary;\n  padding: $scaleup-2 0;\n\n  p,\n  h2 {\n    color: #fff;\n    font-weight: 600;\n  }\n\n  p.glossary-link {\n    font-weight: 400;\n  }\n}\n"
  },
  {
    "path": "src/components/GlossaryPartial/glossaryPartial.jsx",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'gatsby';\nimport LINKS from '../../constants/pageLinks';\nimport './GlossaryPartial.scss';\n\nclass GlossaryPartial extends Component {\n  static getLinks(anchors) {\n    return anchors.map(anchor => <p key={anchor.TEXTNODE} className=\"glossary-link\"><Link to={anchor.URL}>{anchor.TEXTNODE}</Link></p>);\n  }\n\n  render() {\n    const { data } = this.props;\n    const {\n      HEADER,\n      ANCHORS,\n      IMAGE,\n    } = data;\n\n    return (\n      <div className=\"home-glossary\">\n        <div className=\"container home-glossary__container\">\n          <div className=\"row\">\n            <div className=\"col-md-12\">\n              <h2>Glossary</h2>\n              <p className=\"ta-center\">Not sure what something means? Find terms from our library sorted A-Z.</p>\n              <div className=\"row\">\n                <div className=\"col-md-8\">\n                  <div className=\"card card--glossary\">\n                    <h3 className=\"card__title\">{HEADER}</h3>\n                    { GlossaryPartial.getLinks(ANCHORS) }\n                    <Link className=\"btn btn-primary\" to={LINKS.GLOSSARY}>View All</Link>\n                  </div>\n                </div>\n                <div className=\"col-md-4\">\n                  <img className=\"glossary-icon\" src={IMAGE} alt=\"SendGrid Glossary\" />\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default GlossaryPartial;\n"
  },
  {
    "path": "src/components/Group/index.jsx",
    "content": "import { Link } from 'gatsby';\nimport React from 'react';\nimport _ from 'lodash';\n\nfunction Group(props) {\n  const sort = _.sortBy(props.edges, [function (o) { return o.node.frontmatter.order; }]);\n  return (\n    <div className=\"group-links\">\n      {sort.map((doc) => {\n        const {\n          permalink,\n          title,\n        } = doc.node.fields;\n\n        const docIsVisible = !!doc.node.frontmatter.navigation.show;\n\n        return docIsVisible\n          ? (\n            <Link\n              key={permalink}\n              to={permalink}\n              dangerouslySetInnerHTML={{ __html: title }}\n            />\n          )\n          : null;\n      })}\n    </div>\n  );\n}\n\nexport default Group;\n"
  },
  {
    "path": "src/components/Libaries/index.jsx",
    "content": "import React from 'react';\nimport LIBRARIES from '../../constants/libraries';\nimport './libaries.scss';\n\nfunction Libaries() {\n  return(\n    <div className=\"for-devs-libraries container ta-center\">\n      <div className=\"card is-centered\">\n        <h2>Open Source Libraries</h2>\n        <div className=\"is-p\">Prebuilt libraries and sample code for popular languages.</div>\n        <div className=\"for-devs-libraries__languages\">\n          {LIBRARIES.map(lib => (\n              <div key={lib.NAME} className=\"for-devs-libraries__lang\">\n                <a className=\"for-devs-libraries__lang-link\" key={lib.NAME} href={lib.URL} rel=\"noopener noreferrer\" target=\"_blank\">\n                  <img src={lib.IMG} alt={lib.NAME} />\n                </a>\n              </div>\n            ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Libaries;\n"
  },
  {
    "path": "src/components/Libaries/libaries.scss",
    "content": "@import '../../scss/global/variables';\n@import '../../scss/global/mixins';\n\n.for-devs-libraries .card {\n  display: block;\n}\n\n.for-devs-callouts .card {\n  box-shadow: 8px 10px 0 0 darken($slate, 6%);\n}\n\n.for-devs-libraries__languages {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  margin: 0 -10px;\n}\n\n.for-devs-libraries__lang {\n  width: 25%;\n\n  @media (max-width: $width-mobile) {\n    width: 100%;\n  }\n\n  a {\n    margin: 12px 15px;\n    background: $mantis;\n    display: block;\n    border-radius: 35px;\n    padding: $scaledown-3 $scale-0;\n    transition: all 0.1s ease-in-out;\n\n    &:hover {\n      background: #009D4C;\n      transform: translateY(-1px);\n    }\n  }\n\n  img {\n    vertical-align: middle;\n    height: 50px;\n  }\n}"
  },
  {
    "path": "src/components/NavMain/NavMain.scss",
    "content": "@import '../../scss/global/variables';\n@import '../../scss/global/mixins';\n\n.nav-wrap {\n  background: $white;\n  position: sticky;\n  top: 0;\n  z-index: 100;\n}\n\n.nav-wrap.has-sub-nav {\n  margin-bottom: $scaleup-6;\n}\n\n.nav-main {\n  position: relative;\n  padding: 2px $scale-base-up-04;\n  display: flex;\n  border-bottom: 1px solid rgba(#a8b9d5, 0.6);\n  box-shadow: 0 2px 14px 0 rgba(122,150,195,.1);\n  z-index: 2;\n\n  @media (max-width: $width-medium) {\n    flex-direction: column;\n  }\n}\n\n.nav-main__mobile {\n  display: flex;\n  width: calc(100% - 334px);\n\n  @media (max-width: $width-medium) {\n    flex-direction: column;\n    max-height: 0;\n    overflow: hidden;\n    width: 100%;\n  }\n}\n\n.nav-main__mobile.in {\n  @media (max-width: $width-medium) {\n    max-height: 1000px;\n  }\n}\n\n.nav-item {\n  font-size: 14px;\n  font-weight: 600;\n  margin: 0 $scale-base-up-06;\n\n  @media (max-width: $width-large) {\n    margin: 0 $scale-base-up-02;\n  }\n\n  @media (max-width: $width-medium) {\n    margin: 0 $scale-base-down-01;\n  }\n\n  @media (max-width: $width-medium) {\n    font-size: 24px;\n    font-weight: 300;\n    line-height: normal;\n    border-bottom: 1px solid $slate-10;\n    margin: 0;\n    width: 100%;\n  }\n}\n\n.nav-main__plain {\n  color: $dark-blue;\n  padding: $scale-base-up-02 0;\n\n  &:hover {\n    color: $primary;\n  }\n\n  @media (max-width: $width-medium) {\n    display: block;\n  }\n}\n\n.nav-secondary__link {\n  color: $secondary;\n\n  &:hover {\n    color: $primary;\n  }\n\n  @media (max-width: $width-medium) {\n    display: block;\n    margin: $scale-base-up-03;\n    padding: $scale-base-down-01 $scale-base-up-02;\n    font-size: 14px;\n    font-weight: 400;\n    text-align: center;\n    color: $primary;\n    text-decoration: none;\n    background-color: transparent;\n    border: 2px solid $primary;\n    border-radius: $scale-base-down-03;\n    outline: 0;\n    transition: all .2s ease-in-out;\n\n    &:hover {\n      color: $primary;\n      background-color: $light-blue;\n      border-color: $primary-hover;\n    }\n  }\n}\n\n.nav-center {\n  align-items: center;\n  display: flex;\n  flex: 1;\n  justify-content: center;\n\n  @media (max-width: $width-medium) {\n    flex-direction: column;\n    align-items: flex-start;\n    width: 100%;\n  }\n\n  .nav-item:first-of-type {\n    margin-left: 0;\n  }\n\n  .nav-item:last-of-type {\n    margin-right: 0;\n  }\n}\n\n.nav-right {\n  align-items: center;\n  display: flex;\n\n  .nav-item {\n    margin: 0;\n\n    @media (max-width: $width-medium) {\n      border: 0;\n    }\n  }\n\n  @media (max-width: $width-medium) {\n    align-items: flex-start;\n    width: 100%;\n  }\n\n  @media (max-width: $width-small) {\n    flex-direction: column;\n  }\n}\n\n\n.nav-right .nav-item--btn {\n  font-size: 14px;\n  text-align: center;\n  margin-left: $scale-base-up-02;\n\n  @media (max-width: $width-medium) {\n    border: 0;\n    margin: $scale-base-up-03 0 0;\n    order: -1;\n  }\n\n  a {\n    display: inline-block;\n    padding: $scale-base-down-01 $scale-base-up-02;\n    font-weight: 400;\n    color: $white;\n    text-decoration: none;\n    background-color: $primary;\n    border: 2px solid $primary;\n    border-radius: $scale-base-down-03;\n    outline: 0;\n    transition: all .2s ease-in-out;\n\n    @media (max-width: $width-medium) {\n      display: block;\n      margin: 0 $scale-base-up-03;\n    }\n\n    &:hover {\n      color: $white;\n      background-color: $primary-hover;\n      border-color: $primary-hover;\n    }\n  }\n}\n\n.nav-main__toggle {\n  display: none;\n  position: absolute;\n  top: 30px;\n  right: $scale-base-up-04;\n  font-size: $scale-base-up-01;\n  font-weight: 600;\n  color: $primary;\n  border: 0;\n  padding: 0;\n\n  @media (max-width: $width-medium) {\n    display: inline-block;\n  }\n}\n\n.nav-main__menu__closer {\n  display: none;\n  position: relative;\n  width: $scale-base-up-03;\n  height: $scale-base-up-03;\n  overflow: hidden;\n\n  &::before,\n  &::after {\n    position: absolute;\n    height: 2px;\n    width: 100%;\n    top: 50%;\n    left: 0;\n    margin-top: -1px;\n    background-color: $primary;\n    content: '';\n  }\n\n  &::before {\n    transform: rotate(45deg);\n  }\n\n  &::after {\n    transform: rotate(-45deg);\n  }\n}\n\n.in {\n  .nav-main__menu {\n    display: none;\n  }\n\n  .nav-main__menu__closer {\n    display: block;\n  }\n}\n\n.nav-main__logo {\n  padding: $scaleup-4 0;\n  background-image: url('https://sendgrid.com/brand/sg-twilio/sg-twilio-lockup.svg');\n  background-position: 0;\n  background-repeat: no-repeat;\n  background-size: 150px auto;\n  display: block;\n  height: 33px;\n  width: 334px;\n  text-align: right;\n  position: relative;\n\n  @media (max-width: $width-small) {\n    background-size: 112px auto;\n    width: 277px;\n  }\n\n  @media (max-width: $width-small-mobile) {\n    background-size: 93px auto;\n    width: 240px;\n  }\n}\n\n.nav-main__help-center {\n  text-transform: capitalize;\n  display: inline-block;\n  padding: 3px 8px 0;\n  border-left: 2px solid $slate-40;\n  color: $slate-40;\n  position: absolute;\n  line-height: 1;\n  right: 0;\n  top: 30px;\n  font-size: 18px;\n  @include colfax(600);\n\n  @media (max-width: $width-small) {\n    font-size: $scale-0;\n  }\n\n  @media (max-width: $width-small-mobile) {\n    font-size: 14px;\n  }\n}\n"
  },
  {
    "path": "src/components/NavMain/index.jsx",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'gatsby';\nimport LINKS from '../../constants/pageLinks';\nimport { AuthCtx } from '../withUser';\nimport './NavMain.scss';\n\nclass NavMain extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      showMenu: false,\n    };\n\n    this.toggleMenu = this.toggleMenu.bind(this);\n    this.closeMenu = this.closeMenu.bind(this);\n  }\n\n  toggleMenu() {\n    this.setState(prevState => ({ showMenu: !prevState.showMenu }));\n  }\n\n  closeMenu() {\n    this.setState({ showMenu: false });\n  }\n\n  render() {\n    const {\n      showMenu,\n    } = this.state;\n\n    const menuState = showMenu ? 'in' : '';\n\n    return (\n      <nav className=\"nav-main\">\n        <Link className=\"nav-main__logo\" onClick={this.closeMenu} to=\"/\">\n          <span className=\"nav-main__help-center\">Knowledge Center</span>\n        </Link>\n\n        <button\n          type=\"button\"\n          className={`nav-main__toggle js-menu-toggle ${menuState}`}\n          onClick={this.toggleMenu}\n        >\n          <span className=\"nav-main__menu\">Menu</span>\n          <span className=\"nav-main__menu__closer\" />\n        </button>\n\n        <div className={`nav-main__mobile ${menuState}`}>\n\n          <div className=\"nav-center\">\n\n            <div className=\"nav-item\">\n              <a className=\"nav-main__plain\" onClick={this.closeMenu} href={LINKS.SUPPORT}>\n                Support\n              </a>\n            </div>\n\n            <div className=\"nav-item\">\n              <Link className=\"nav-main__plain\" onClick={this.closeMenu} to={LINKS.FOR_DEVELOPERS}>\n                Developers\n              </Link>\n            </div>\n\n            <div className=\"nav-item\">\n              <a className=\"nav-main__plain\" onClick={this.closeMenu} href={LINKS.STATUS}>\n                Status\n              </a>\n            </div>\n\n            <div className=\"nav-item\">\n              <Link className=\"nav-main__plain\" onClick={this.closeMenu} to={LINKS.RELEASE_NOTES}>\n                Release Notes\n              </Link>\n            </div>\n\n          </div>\n\n          <div className=\"nav-right\">\n\n            <div className=\"nav-item\">\n              <AuthCtx.Consumer>\n                {({ user }) => (\n                  user ? (\n                    <a className=\"nav-secondary__dashboard\" href={LINKS.APP}>Dashboard</a>\n                  ) : (\n                    <a className=\"nav-secondary__link\" href={LINKS.APP}>Sign In</a>\n                  )\n                )}\n              </AuthCtx.Consumer>\n            </div>\n\n            <div className=\"nav-item nav-item--btn\">\n              <a className=\"nav-main__login\" href={LINKS.PRICING}>\n                Start Free\n              </a>\n            </div>\n\n          </div>\n\n        </div>\n      </nav>\n    );\n  }\n}\n\nexport default NavMain;\n"
  },
  {
    "path": "src/components/NavSub/NavSub.scss",
    "content": "@import '../../scss/global/variables';\n\n.nav-sub {\n  background: $slate-02;\n  border-bottom: 1px solid $slate-10;\n  position: relative;\n  z-index: 1;\n}\n\n.docsfor-developers .nav-sub,\n.for-developers .nav-sub {\n  margin-bottom: 0;\n\n  @media (max-width: $width-small) {\n    .input-text-wrap.is-search, .breadcrumb {\n      margin-bottom: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "src/components/NavSub/index.jsx",
    "content": "import React from 'react';\nimport Search from '../Search';\nimport BreadCrumbs from '../BreadCrumbs';\nimport './NavSub.scss';\n\nconst SubNav = (props) => (\n  <div>\n    <div className=\"nav-sub\">\n      <div className=\"container-lg\">\n        <div className=\"row\">\n          <div className=\"col-md-8\">\n          <BreadCrumbs {...props} />\n          </div>\n          <div className=\"col-md-4\">\n            <Search />\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n);\n\nexport default SubNav;\n"
  },
  {
    "path": "src/components/Rating/Rating.scss",
    "content": "\n@import '../../scss/global/variables';\n@import '../../scss/global/mixins';\n\n.rating {\n  color: $slate-20;\n  font-size: 28px;\n  padding: 0;\n\n  span {\n    margin: 0 $scaledown-7;\n\n    &:hover {\n      cursor: pointer;\n    }\n  }\n\n  .is-filled {\n    color: $mango;\n  }\n}\n\n.rate-this-doc {\n  background: $slate-02;\n  display: inline-block;\n  margin: $scale-0 0;\n  padding: $scaledown-3 $scaleup-3;\n\n  &__success {\n    @include colfax(600);\n  }\n}\n"
  },
  {
    "path": "src/components/Rating/index.js",
    "content": "import React from 'react';\nimport './Rating.scss';\nimport { AuthCtx } from '../withUser';\n\nclass Rating extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.ratingVals = [\n      1, 2, 3, 4, 5\n    ];\n\n    this.state = {\n      rating: 0,\n      hasRating: false,\n    }\n  }\n\n  componentDidMount() {\n    this.dataLayer = window.dataLayer || [];\n  }\n\n  rateDoc = user => (e) => {\n    const rating  = parseInt( e.target.dataset.rating );\n    const userID = user ? user.userid : false;\n\n    this.setState({\n      rating,\n      hasRating: true,\n    })\n\n    analytics.track(\"Doc Rated\", {\n      docID: window.location.pathname,\n      userID, // SendGrid userID or false\n      rating\n    });\n  }\n\n  getStars() {\n    return this.ratingVals.map(rating => {\n      const isSelected = rating <= this.state.rating ? 'is-filled' : '';\n      return (\n        <span\n        key={rating}\n        className={isSelected}\n        data-rating={rating}\n        onMouseEnter={() => { this.setState({rating}) }}\n        onMouseLeave={() => { this.setState({rating: 0}) }}\n        >★</span>\n      )\n    });\n  }\n\n  render() {\n    return (\n      <div className=\"card card__feedback ta-center\">\n        <div className=\"card__inner\">\n          <h3 className=\"card__title\" >Share Your Feedback</h3>\n          <p>Let us know how we’re doing! Please rate this page:</p>\n          <div className=\"rate-this-doc\">\n            <AuthCtx.Consumer>\n              {(ctx) => (\n                <React.Fragment>\n                    {this.state.hasRating ? (\n                      <p className=\"rate-this-doc__success\">\n                        You’re the best! Thanks for helping us improve. 🙌\n                      </p>\n                      ) : (\n                        <div className=\"rating\" onClick={this.rateDoc(ctx.user)}>\n                          {this.getStars()}\n                        </div>\n                      )\n                    }\n                </React.Fragment>\n              )}\n            </AuthCtx.Consumer>\n          </div>\n          <p>If you require immediate assistance from Twilio SendGrid, please <a href=\"https://support.sendgrid.com\" title=\"contact our support team\" target=\"_blank\" rel=\"noopener noreferrer\">contact our support team</a>.\n          If you’ve spotted a documentation problem, please <a href=\"https://github.com/sendgrid/docs/issues/new\" title=\"open a GitHub Issue\" target=\"_blank\" rel=\"noopener noreferrer\">open a GitHub Issue</a>!\n          </p>\n          <p>\n          Please note, we cannot resolve account and login issues reported on GitHub. <a href=\"https://support.sendgrid.com\" title=\"Contact support\" target=\"_blank\" rel=\"noopener noreferrer\">Contact support</a> for account assistance.\n          </p>\n          <p>\n          Thanks for helping us improve our docs!\n          </p>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Rating;\n"
  },
  {
    "path": "src/components/ReleaseNotes/ReleaseKey.jsx",
    "content": "import React from 'react';\n\nfunction ReleaseKey() {\n  return (\n    <div className=\"release-notes-key m-bottom-8\">\n      <div className=\"release-notes-key__icon is-size-h5\">\n        <div className=\"icon-ui\" />\n        UI Update\n      </div>\n      <div className=\"release-notes-key__icon\">\n        <div className=\"icon-api\" />\n        API Update\n      </div>\n      <div className=\"release-notes-key__icon\">\n        <div className=\"icon-partners\" />\n        Partners Update\n      </div>\n      <div className=\"release-notes-key__icon\">\n        <div className=\"icon-price\" />\n        Price Update\n      </div>\n      <div className=\"release-notes-key__icon\">\n        <div className=\"icon-expert-services\" />\n        Expert Services\n      </div>\n    </div>\n  );\n}\n\nexport default ReleaseKey;\n"
  },
  {
    "path": "src/components/ReleaseNotes/ReleaseNotePost.jsx",
    "content": "import React from 'react';\nimport _ from 'lodash';\nimport RehypeReact from 'rehype-react';\nimport Callout from '../../componentsMarkdown/Callout';\nimport CodeGroup from '../../componentsMarkdown/CodeGroup';\n\nconst renderAst = new RehypeReact({\n  createElement: React.createElement,\n  components: {\n    'call-out': Callout,\n    'code-group': CodeGroup,\n  },\n}).Compiler;\n\nconst ReleaseNotePost = ({ node }) => (\n  <div key={node.frontmatter.date} className=\"release-note m-bottom-4\">\n    <div className=\"release-row\">\n      <div className=\"icons\">\n        {node.frontmatter.releaseType.map(type => <div key={type} className={`icons__icon icon-${type}`}>{type}<br />update</div>)}\n      </div>\n      <div className=\"html-ast p-bottom-7\">\n        <h2 id={_.kebabCase(node.frontmatter.date)} className=\"is-size-h1\" >\n          <a href={`#${_.kebabCase(node.frontmatter.date)}`} className=\"anchor\" data-slug={_.kebabCase(node.frontmatter.date)}>\n            <svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\">\n              <path fillRule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\" />\n            </svg>\n          </a>\n          {node.frontmatter.date}\n        </h2>\n        {renderAst(node.htmlAst)}\n      </div>\n    </div>\n  </div>\n);\n\nexport default ReleaseNotePost;\n"
  },
  {
    "path": "src/components/SEO/index.jsx",
    "content": "import React, { Component } from 'react';\nimport { Helmet } from 'react-helmet';\nimport config from '../../../data/SiteConfig';\n\nclass SEO extends Component {\n  static capitalizeFirstLetter(str) {\n    const strArray = str.split(' ');\n\n    for (let i = 0, x = strArray.length; i < x; i += 1) {\n      strArray[i] = strArray[i][0].toUpperCase() + strArray[i].substr(1);\n    }\n\n    return strArray.join(' ');\n  }\n\n  render() {\n    const { postNode, postType } = this.props;\n    const image = config.ogImage;\n    const sitePath = config.siteUrl + config.pathPrefix;\n\n    // These will be set differently for a doc or page\n    let title;\n    let permalink;\n    let description = false;\n\n    if (postType === 'category') {\n      const {\n        docType,\n        category,\n      } = postNode.pathContext;\n\n\n      title = SEO.capitalizeFirstLetter(`${docType.replace('-', ' ')} | ${category.replace('-', ' ')}`);\n    } else if (postType === 'doc') {\n      const { seo } = postNode.frontmatter;\n      permalink = sitePath + postNode.fields.permalink;\n\n      if (seo) {\n        title = seo.title ? seo.title : postNode.title;\n        description = seo.description ? seo.description : false;\n      } else {\n        ({ title } = postNode.fields);\n      }\n    } else {\n      permalink = sitePath + postNode.location.pathname;\n      ({ title } = this.props);\n      ({ description } = this.props);\n    }\n\n    const schemaOrgJSONLD = [\n      {\n        '@context': 'http://schema.org',\n        '@type': 'WebSite',\n        url: sitePath,\n        name: config.siteTitle,\n        alternateName: config.siteTitleAlt ? config.siteTitleAlt : '',\n      },\n      {\n        '@context': 'http://schema.org',\n        '@type': 'WebPage',\n        url: permalink,\n        name: title,\n        alternateName: config.siteTitleAlt ? config.siteTitleAlt : '',\n        headline: title,\n        image: {\n          '@type': 'ImageObject',\n          url: image,\n        },\n        description,\n      },\n    ];\n\n    return (\n      <Helmet>\n        <title>{`${title} | ${config.siteTitle}`}</title>\n        {/* General tags */}\n        <meta name=\"description\" content={description} />\n        <meta name=\"image\" content={image} />\n\n        {/* Schema.org tags */}\n        <script type=\"application/ld+json\">\n          {JSON.stringify(schemaOrgJSONLD)}\n        </script>\n\n        {/* OpenGraph tags */}\n        <meta property=\"og:url\" content={permalink} />\n        {postType === 'doc' ? <meta property=\"og:type\" content=\"article\" /> : null}\n        <meta property=\"og:title\" content={title} />\n        {description ? <meta property=\"og:description\" content={description} /> : null}\n        <meta property=\"og:image\" content={image} />\n\n        {/* Twitter Card tags */}\n        <meta name=\"twitter:card\" content=\"summary_large_image\" />\n        <meta\n          name=\"twitter:creator\"\n          content={config.userTwitter ? config.userTwitter : ''}\n        />\n        <meta name=\"twitter:title\" content={title} />\n        <meta name=\"twitter:description\" content={description} />\n        <meta name=\"twitter:image\" content={image} />\n      </Helmet>\n    );\n  }\n}\n\nexport default SEO;\n"
  },
  {
    "path": "src/components/Search/index.jsx",
    "content": "import React, { Component } from 'react';\nimport _ from 'lodash';\nimport STARWARS from '../../constants/starWars';\nimport config from '../../../data/SiteConfig';\nimport './search.scss';\n\nclass Search extends Component {\n  componentDidMount() {\n    const container = document.querySelector('.search-hero') || false;\n    const prefix = process.env.NODE_ENV === 'development' ? '' : '/docs';\n    window.docsearch({\n      apiKey: '621c583d8098d07c471dbaf6c2178e56',\n      indexName: 'sendgrid_hc',\n      inputSelector: '.search-query',\n      debug: false, // Set debug to true if you want to inspect the dropdown\n      queryHook(query) {\n        if (!container) {\n          return;\n        }\n        const starKeys = Object.keys(STARWARS);\n        const matches = starKeys.filter(val => _.includes(query, val));\n        if (matches.length) {\n          const gif = STARWARS[matches[0]];\n          container.classList.add('star-wars');\n          container.style.backgroundImage = `url('${prefix}${gif}')`;\n        } else {\n          container.classList.remove('star-wars');\n          container.style = 'none';\n        }\n      },\n      transformData(hits) {\n        const updatedUrlHits = hits.map(((hit) => {\n          const rootUrl = config.env === 'development' ? config.siteUrl + config.pathPrefix : config.siteUrl;\n          hit.url = hit.url.replace('#___gatsby', '');\n          hit.url = hit.url.replace('#gatsby-focus-wrapper', '');\n          hit.url = hit.url.replace(rootUrl, '');\n          if (hit.anchor === '___gatsby' || hit.anchor === 'gatsby-focus-wrapper') {\n            hit.anchor = '';\n          }\n          return hit;\n        }));\n        // modify hits\n        return updatedUrlHits;\n      },\n    });\n  }\n\n  render() {\n    return (\n      <div className=\"search-docs\">\n        <form>\n          <div className=\"input-text-wrap is-search\">\n            <input type=\"text\" id=\"query\" placeholder=\"What are you looking for?\" autoComplete=\"off\" className=\"form-control search-hero__query search-query st-default-search-input\" name=\"q\" />\n            <input type=\"button\" value=\"Search\" className=\"input-btn\" />\n          </div>\n        </form>\n      </div>\n    );\n  }\n}\n\nexport default Search;\n"
  },
  {
    "path": "src/components/Search/search.scss",
    "content": "@import '../../scss/global/mixins';\n@import '../../scss/global/variables';\n\n.input-text-wrap [type=\"text\"] {\n  border-radius: 0;\n  height: initial;\n}\n\n.input-text-wrap .input-btn {\n  display: none;\n}\n\n.input-text-wrap .search-hero__query {\n  @include colfax(400);\n  color: $slate-60;\n  background-image: none;\n\n  &::placeholder {\n    color: $slate;\n  }\n\n  &:focus {\n    &::placeholder {\n      color: transparent;\n    }\n  }\n}\n\n.search-hero__bg #query:focus {\n  border: none;\n}\n\n.search-docs .algolia-autocomplete {\n  width: 100%;\n}"
  },
  {
    "path": "src/components/SocialLinks/SocialLinks.css",
    "content": ".social-links {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    justify-content: center;\n    align-content: center;\n    align-items: center;\n    margin: 15px 0;\n}\n\n.social-links > div {\n    margin: 5px 15px;\n}\n\n.share-count {\n    text-align: center;\n}\n"
  },
  {
    "path": "src/components/SocialLinks/index.jsx",
    "content": "import React from 'react';\nimport SOCIAL_LINKS from '../../constants/socialLinks';\n\nfunction SocialLinks() {\n  const links = SOCIAL_LINKS.map(item => (\n    <a href={item.URL} key={item.TEXTNODE} target=\"_blank\" rel=\"noopener noreferrer\">\n      <img alt={item.TEXTNODE} src={item.IMG} />\n      <span className=\"show-for-sr\">{item.TEXTNODE}</span>\n    </a>\n  ));\n\n  return (\n    <div className=\"footer__soc\">\n      { links }\n    </div>\n  );\n};\n\nexport default SocialLinks;\n"
  },
  {
    "path": "src/components/StatusPage/index.jsx",
    "content": "import React, { Component } from 'react';\nimport axios from 'axios';\n\nclass MainLayout extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      status: false,\n    };\n  }\n\n  componentWillMount() {\n    axios.get('https://3tgl2vf85cht.statuspage.io/api/v2/status.json')\n      .then(res => {\n        this.setState({\n          status: res.data,\n        });\n      })\n      .catch(error => console.log(error));\n  }\n\n  render() {\n    const {\n      status,\n      page,\n    } = this.state.status;\n\n    if (!this.state.status || status.indicator === 'none') {\n      return null;\n    }\n\n    const alertType = status.indicator === 'minor' ? 'warning' : 'danger';\n\n    return (\n      <div className={`alert alert-${alertType} sendgrid-status`}>\n        <p><i className=\"sg-icon sg-icon-info-circle\" /> <strong>{status.description}. <a href={page.url}>Learn More</a></strong></p>\n      </div>\n    );\n  }\n}\n\nexport default MainLayout;\n"
  },
  {
    "path": "src/components/StatusPage/statusPage.scss",
    "content": ""
  },
  {
    "path": "src/components/layout/NoHeaderFooter.jsx",
    "content": "import React from 'react';\n\nexport default class NoHeaderFooter extends React.Component {\n  render() {\n    const {\n      children,\n      location,\n    } = this.props;\n    const pathClass = location.pathname.replace(/\\/docs\\\\|\\//g, '');\n    const classNames = `docSearch-content docs-wrap ${pathClass}`;\n\n    return (\n      <div className={classNames}>\n        {children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/components/layout/index.jsx",
    "content": "import React from 'react';\nimport NavMain from '../NavMain';\nimport StatusPage from '../StatusPage';\nimport Footer from '../Footer';\nimport withUser from '../withUser';\nimport SubNav from '../NavSub';\nimport '../../scss/style-guide.scss';\n\nfunction MainLayout(props) {\n  const {\n    children,\n    location,\n    subNav,\n  } = props;\n\n  const pathClass = location.pathname.replace(/\\/docs\\\\|\\//g, '');\n  const classNames = `docSearch-content docs-wrap ${pathClass}`;\n  const renderFooter = location.pathname.indexOf('/api-reference') === -1 ? <Footer /> : null;\n\n  return (\n    <div className={classNames}>\n      <StatusPage />\n      <div className={subNav ? 'nav-wrap has-sub-nav' : 'nav-wrap'}>\n        <NavMain />\n        {subNav && <SubNav {...props} />}\n      </div>\n      <div className=\"layout-content\">\n        {children}\n      </div>\n      {renderFooter}\n    </div>\n  );\n}\n\nexport default withUser(MainLayout);\n"
  },
  {
    "path": "src/components/withUser/index.jsx",
    "content": "import React from 'react';\nimport Cookies from 'js-cookie';\n\nexport const AuthCtx = React.createContext(false);\n\nfunction withUser(WrappedComponent) {\n  return class extends React.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        user: false,\n      };\n    }\n\n    componentDidMount() {\n      const token = Cookies.get('mako_auth_token');\n\n      if (!token) return;\n\n      fetch('https://api.sendgrid.com/v3/user/profile', {\n        method: 'GET',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n          Authorization: `token ${token}`,\n        },\n      }).then((response) => {\n        if (!response.ok) {\n          return false;\n        }\n\n        return response.json();\n      }).then((user) => {\n        this.setState({ user });\n        this.sendSurvicateAtts();\n      });\n    }\n\n    sendSurvicateAtts() {\n      if (typeof window._svc === 'undefined') {\n        return;\n      }\n\n      window._svc.traits = {\n        userID: this.state.user.userid,\n      };\n    }\n\n    render() {\n      return (\n        <AuthCtx.Provider value={this.state} >\n          <WrappedComponent {...this.props} />\n        </AuthCtx.Provider>\n      );\n    }\n  };\n}\n\nexport default withUser;\n"
  },
  {
    "path": "src/componentsMarkdown/Callout.jsx",
    "content": "import React from 'react';\n\nexport default function Callout(props) {\n  // check for empty callout\n  if (!props.children) {\n    return null;\n  }\n\n  const classes = `callout callout--${props.type}`;\n\n  return (\n    <div className={classes}>\n      {props.children.map(el => el)}\n    </div>\n  );\n}\n\nCallout.defaultProps = {\n  type: 'info',\n};\n"
  },
  {
    "path": "src/componentsMarkdown/CalloutLink.jsx",
    "content": "import React from 'react';\nimport config from '../../data/SiteConfig';\n\nclass CalloutLink extends React.Component {\n  componentDidMount() {\n    this.dataLayer = window.dataLayer || [];\n  }\n\n  handleClick = () => {\n    this.dataLayer.push({\n      event: 'customEvent',\n      eventCategory: 'Callout',\n      eventAction: 'Click',\n      eventValue: `${this.props.link}`,\n    });\n  }\n\n  render() {\n    // check for empty CalloutLink\n    if (!this.props.children) {\n      return null;\n    }\n\n    const linkText = this.props.linktext || 'Read More';\n\n    return (\n      <div className=\"callout-link\">\n        <div className=\"callout-link__copy\">\n          {this.props.children.map(el => el)}\n          <a\n            href={this.props.link}\n            onClick={this.handleClick}\n          >\n            { linkText } →\n          </a>\n        </div>\n        <div className=\"callout-link__img\" style={{ backgroundImage: `url(${config.envPrefix + this.props.img})` }} />\n      </div>\n    );\n  }\n}\n\nexport default CalloutLink;\n"
  },
  {
    "path": "src/componentsMarkdown/CodeGroup.jsx",
    "content": "import React from 'react';\nimport _ from 'lodash';\n\nexport default class CodeGroup extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.toggleLang = this.toggleLang.bind(this);\n    this.langs = this.props.langs.split(',');\n\n    this.state = {\n      currentTab: this.langs[0].toLowerCase(),\n    };\n  }\n\n  toggleLang(e) {\n    this.setState({\n      currentTab: e.target.dataset.lang,\n    });\n  }\n\n  renderTabs() {\n    const { langs } = this;\n    const { currentTab } = this.state;\n\n    const tabs = langs.map((lang) => {\n      const isActive = lang.toLowerCase() === currentTab ? 'is-active' : null;\n      const classes = `tab ${isActive}`;\n\n      return <li key={lang} className={classes} data-lang={lang.toLowerCase()} onClick={this.toggleLang} onKeyDown={this.handleClick} role=\"button\">{lang}</li>;\n    });\n\n    return tabs;\n  }\n\n  renderCodeBlocks() {\n    const { langs } = this;\n    const { currentTab } = this.state;\n    // Remove empty strings from array\n    const codeBlocks = this.props.children.filter(block => _.isObject(block));\n\n    // return code blocks wrapped parent element\n    return codeBlocks.map((block, i) => {\n      const lang = langs[i].toLowerCase();\n      let classes = `tabbed-code__block ${lang}`;\n\n      if (lang === currentTab) {\n        classes = classes.concat(' show');\n      }\n\n      return <div key={block.key} className={classes} >{block}</div>;\n    });\n  }\n\n  render() {\n    return (\n      <div className=\"tabbed-code\">\n        <ul className=\"tab-wrapper is-editor\">\n          {this.renderTabs()}\n        </ul>\n        {this.renderCodeBlocks()}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/componentsMarkdown/Gist.jsx",
    "content": "import React from 'react';\n\nclass Gist extends React.PureComponent {\n  componentDidMount() {\n    this.updateIframeContent();\n  }\n\n  componentDidUpdate() {\n    this.updateIframeContent();\n  }\n\n  defineUrl() {\n    const { id, file } = this.props;\n\n    const fileArg = file ? `?file=${file}` : '';\n\n    return `https://gist.github.com/${id}.js${fileArg}`;\n  }\n\n  updateIframeContent() {\n    const { id, file } = this.props;\n\n    const iframe = this.iframeNode;\n\n    let doc = iframe.document;\n    if (iframe.contentDocument) doc = iframe.contentDocument;\n    else if (iframe.contentWindow) doc = iframe.contentWindow.document;\n\n    const gistLink = this.defineUrl();\n    const gistScript = `<script type=\"text/javascript\" src=\"${gistLink}\"></script>`;\n    const styles = '<style>*{font-size:12px;}</style>';\n    const elementId = file ? `gist-${id}-${file}` : `gist-${id}`;\n    const resizeScript = `onload=\"parent.document.getElementById('${elementId}').style.height=document.body.scrollHeight + 'px'\"`;\n    const iframeHtml = `<html><head><base target=\"_parent\">${styles}</head><body ${resizeScript}>${gistScript}</body></html>`;\n\n    doc.open();\n    doc.writeln(iframeHtml);\n    doc.close();\n  }\n\n  render() {\n    const { id, file } = this.props;\n\n    return (\n      <iframe\n        ref={(n) => { this.iframeNode = n; }}\n        width=\"100%\"\n        frameBorder={0}\n        id={file ? `gist-${id}-${file}` : `gist-${id}`}\n        title=\"GitHub Gist\"\n      />\n    );\n  }\n}\n\nexport default Gist;\n"
  },
  {
    "path": "src/componentsMarkdown/PageAnchor.jsx",
    "content": "import React from 'react';\n\nexport default class PageAnchor extends React.Component {\n  getContent() {\n    const name = `-${this.props.children[0].trim().replace(/ /g, '-')}`;\n\n    return (\n      <span>\n        <a href={`#${name}`} id={name} aria-hidden=\"true\" className=\"anchor\">\n          <svg\n            aria-hidden=\"true\"\n            height=\"16\"\n            version=\"1.1\"\n            viewBox=\"0 0 16 16\"\n            width=\"16\"\n          >\n            <path\n              fillRule=\"evenodd\"\n              d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n            />\n          </svg>\n        </a>\n        {this.props.children[0]}\n      </span>\n    );\n  }\n\n  render() {\n    const content = this.getContent();\n    return React.createElement(this.props.el, {}, content);\n  }\n}\n\nPageAnchor.defaultProps = {\n  el: 'h2',\n};\n"
  },
  {
    "path": "src/constants/categories.js",
    "content": "/* eslint quote-props: [\"error\", \"consistent-as-needed\"] */\nconst CATEGORIES = {\n  'api-reference': 'API Reference',\n  'getting-started': 'Getting Started',\n  'managing-contacts': 'Managing Contacts',\n  'tracking-events': 'Tracking Events',\n  'parsing-email': 'Parsing Email',\n  'sending-email': 'Sending Email',\n  '3rd-party': '3rd Party',\n};\n\nexport default CATEGORIES;\n"
  },
  {
    "path": "src/constants/footerLinks.js",
    "content": "const FOOTER_LINKS = [];\n\nFOOTER_LINKS.SOLUTIONS = {\n  HEADER: 'Solutions',\n  LINKS: [\n    { URL: 'https://sendgrid.com/solutions/email-api/', TEXTNODE: 'Email API and SMTP' },\n    { URL: 'https://sendgrid.com/solutions/email-marketing/', TEXTNODE: 'Email Marketing Campaigns' },\n    { URL: 'https://sendgrid.com/solutions/expert-services/', TEXTNODE: 'Expert Services' },\n    { URL: false, TEXTNODE: false },\n    { URL: 'https://sendgrid.com/pricing/', TEXTNODE: 'Pricing' },\n    { URL: 'https://sendgrid.com/contact/', TEXTNODE: 'Contact Sales' },\n  ],\n};\n\nFOOTER_LINKS.SG_IS_FOR = {\n  HEADER: 'SendGrid is For',\n  LINKS: [\n    { URL: 'https://sendgrid.com/accelerate/', TEXTNODE: 'Startups' },\n    { URL: 'https://sendgrid.com/solutions/enterprise/', TEXTNODE: 'Enterprises' },\n    { URL: 'https://sendgrid.com/partners/agencies/', TEXTNODE: 'Agencies' },\n    { URL: 'https://sendgrid.com/solutions/ecommerce/', TEXTNODE: 'Ecommerce' },\n    { URL: false, TEXTNODE: false },\n    { URL: 'https://sendgrid.com/customers/', TEXTNODE: 'Our Customers' },\n  ],\n};\n\nFOOTER_LINKS.SUPPORT = {\n  HEADER: 'Support',\n  LINKS: [\n    { URL: 'https://support.sendgrid.com/', TEXTNODE: 'Contact Support' },\n    { URL: '/', TEXTNODE: 'Knowledge Center' },\n    { URL: 'https://sendgrid.com/report-spam/', TEXTNODE: 'Report Spam' },\n  ],\n};\n\nFOOTER_LINKS.COMMUNITY = {\n  HEADER: 'Community',\n  LINKS: [\n    { URL: 'https://sendgrid.com/partners/', TEXTNODE: 'Partners' },\n    { URL: 'https://sendgrid.com/blog/', TEXTNODE: 'Blog' },\n    { URL: 'https://sendgrid.com/events/', TEXTNODE: 'Events' },\n    { URL: 'https://github.com/sendgrid', TEXTNODE: 'GitHub' },\n  ],\n};\n\nFOOTER_LINKS.COMPANY = {\n  HEADER: 'Company',\n  LINKS: [\n    { URL: 'https://sendgrid.com/about/', TEXTNODE: 'About' },\n    { URL: 'https://sendgrid.com/team/', TEXTNODE: 'Our Team' },\n    { URL: 'https://sendgrid.com/careers/', TEXTNODE: 'Careers' },\n    { URL: 'https://sendgrid.com/news/', TEXTNODE: 'Newsroom' },\n    { URL: 'https://investors.sendgrid.com/', TEXTNODE: 'Investors' },\n    { URL: 'https://sendgrid.com/labs/', TEXTNODE: 'Labs' },\n    { URL: 'https://sendgrid.com/contact/', TEXTNODE: 'Contact Us' },\n  ],\n};\n\nexport default FOOTER_LINKS;\n"
  },
  {
    "path": "src/constants/forDevelopersCards.js",
    "content": "import plane from '../img/icon-sending-email.svg';\nimport analytics from '../img/icon-analytics.svg';\nimport partners from '../img/icon-partners.svg';\nimport parse from '../img/icon-parse.svg';\n\nconst FOR_DEVS_CARDS = [\n  {\n    ICON: plane,\n    TITLE: 'Sending Email',\n    LINKS: [\n      { URL: '/for-developers/sending-email/curl-examples/', TEXTNODE: 'cURL Examples for Common Use Cases' },\n      { URL: '/for-developers/sending-email/sandbox-mode/', TEXTNODE: 'Sandbox Mode' },\n      { URL: '/for-developers/sending-email/getting-started-smtp/', TEXTNODE: 'How to Send an SMTP Email' },\n    ],\n    BUTTON_LINK: '/for-developers/sending-email/',\n  },\n  {\n    ICON: parse,\n    TITLE: 'Parsing Email',\n    LINKS: [\n      { URL: '/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/', TEXTNODE: 'Getting Started with Inbound Parse' },\n      { URL: '/for-developers/parsing-email/inbound-email/', TEXTNODE: 'Inbound Parse Overview' }\n    ],\n    BUTTON_LINK: '/for-developers/parsing-email/',\n  },\n  {\n    ICON: analytics,\n    TITLE: 'Tracking Events',\n    LINKS: [\n      { URL: '/for-developers/tracking-events/getting-started-event-webhook/', TEXTNODE: 'Getting Started with the Event Webhook' },\n      { URL: '/for-developers/tracking-events/event/', TEXTNODE: 'Event Webhook Reference' },\n      { URL: '/for-developers/tracking-events/troubleshooting/', TEXTNODE: 'Troubleshooting the Event Webhook' },\n    ],\n    BUTTON_LINK: '/for-developers/tracking-events/',\n  },\n  {\n    ICON: partners,\n    TITLE: 'Partners',\n    LINKS: [\n      { URL: '/for-developers/partners/amazon-marketplace/', TEXTNODE: 'Amazon' },\n      { URL: '/for-developers/partners/google/', TEXTNODE: 'Google' },\n      { URL: '/for-developers/partners/microsoft-azure/', TEXTNODE: 'Microsoft Azure' },\n    ],\n    BUTTON_LINK: '/for-developers/partners/',\n  },\n];\n\nexport default FOR_DEVS_CARDS;\n"
  },
  {
    "path": "src/constants/glossaryTerms.js",
    "content": "import magnifyImage from '../img/help-center-magnify.svg';\nimport magnifyImageDevs from '../img/help-center-magnify-devs.svg';\n\nexport const GLOSSARY_TERMS_HOME = {\n  HEADER: 'Featured Terms',\n  ANCHORS: [\n    { URL: '/glossary/sender-authentication/', TEXTNODE: 'Sender Authentication' },\n    { URL: '/glossary/ip-address/', TEXTNODE: 'IP Address' },\n    { URL: '/glossary/phishing/', TEXTNODE: 'Phishing' },\n  ],\n  IMAGE: magnifyImage,\n};\n\nexport const GLOSSARY_TERMS_DEVS = {\n  HEADER: 'Featured Terms',\n  ANCHORS: [\n    { URL: '/glossary/sender-authentication/', TEXTNODE: 'Sender Authentication' },\n    { URL: '/glossary/event-webhook/', TEXTNODE: 'Event Webhook' },\n    { URL: '/glossary/deliverability/', TEXTNODE: 'Email Deliverability' },\n  ],\n  IMAGE: magnifyImageDevs,\n};\n"
  },
  {
    "path": "src/constants/groups.js",
    "content": "/* eslint quote-props: [\"error\", \"consistent-as-needed\"] */\nconst GROUPS = {\n  'tracking-events': {\n    name: 'Tracking Events',\n    order: null,\n  },\n  'parsing-email': {\n    name: 'Parsing Email',\n    order: null,\n  },\n  'sending-email': {\n    name: 'Sending Email',\n    order: 2,\n  },\n  'building-email': {\n    name: 'Building Email',\n    order: null,\n  },\n  'delivery-optimization': {\n    name: 'Delivery & Optimization',\n    order: null,\n  },\n  'troubleshooting': {\n    name: 'Troubleshooting',\n    order: null,\n  },\n  'platform-partners': {\n    name: 'Platform Partners',\n    order: 1,\n  },\n  'tracking': {\n    name: 'Tracking',\n    order: null,\n  },\n  'managing-contacts': {\n    name: 'Managing Contacts with Marketing Campaigns',\n    order: null,\n  },\n  'building-your-list': {\n    name: 'Building Your List',\n    order: null,\n  },\n  'segmenting-your-list': {\n    name: 'Segmenting Your List',\n    order: null,\n  },\n  'stats-reporting': {\n    name: 'Statistics & Reporting',\n    order: null,\n  },\n  'statistics': {\n    name: 'Statistics',\n    order: null,\n  },\n  'click-tracking': {\n    name: 'Click Tracking',\n    order: null,\n  },\n  'email-activity': {\n    name: 'Email Activity Feed',\n    order: null,\n  },\n  'settings': {\n    name: 'Account Settings',\n    order: null,\n  },\n  'account-management': {\n    name: 'Account Management',\n    order: null,\n  },\n  'inbound-parse': {\n    name: 'Inbound Parse',\n    order: null,\n  },\n  'sender-authentication': {\n    name: 'Sender Authentication',\n    order: null,\n  },\n  'ip-management': {\n    name: 'IP Management',\n    order: null,\n  },\n  'teammates-subusers': {\n    name: 'Teammates & Subusers',\n    order: null,\n  },\n  'security': {\n    name: 'Security',\n    order: null,\n  },\n  'billing': {\n    name: 'Billing',\n    order: null,\n  },\n  'marketing-campaigns': {\n    name: 'Building Email with Marketing Campaigns',\n    order: 1,\n  },\n  'transactional-email': {\n    name: 'Building Transactional Email',\n    order: 2,\n  },\n  'reference-troubleshooting': {\n    name: 'Reference & Troubleshooting',\n    order: null,\n  },\n  'code-examples': {\n    name: 'Code Examples',\n    order: null,\n  },\n  'partners': {\n    name: 'SendGrid Partners',\n    order: null,\n  },\n  'plugins': {\n    name: 'SendGrid Plugins',\n    order: null,\n  },\n  'smtp': {\n    name: 'Send SMTP',\n    order: null,\n  },\n  'x-smtpapi': {\n    name: 'X-SMTPAPI Header',\n    order: null,\n  },\n  'api-v2': {\n    name: 'SendGrid v2 API',\n    order: null,\n  },\n  'api-v3': {\n    name: 'SendGrid v3 API',\n    order: 1,\n  },\n  'mail-servers': {\n    name: 'Mail Servers',\n    order: null,\n  },\n  'mail-clients': {\n    name: 'Mail Clients',\n    order: null,\n  },\n  'open-source': {\n    name: 'Open Source Apps',\n    order: null,\n  },\n  'frameworks': {\n    name: 'Frameworks',\n    order: null,\n  },\n  'partner-migration': {\n    name: 'Migration',\n    order: 2,\n  },\n  'getting-started': {\n    name: 'Getting Started',\n    order: null,\n  },\n  'automation': {\n    name: 'Automation',\n    order: null,\n  },\n  'ungrouped': {\n    name: 'Ungrouped',\n    order: null,\n  },\n  'expert-insights': {\n   name: 'Expert Insights',\n   order: null,\n  },\n  'target-segment': {\n    name: 'Targeting and Segmentation',\n    order: null,\n   },\n};\n\n\nexport default GROUPS;\n"
  },
  {
    "path": "src/constants/homeCallouts.js",
    "content": "const HOME_CALLOUTS = [\n  {\n    BADGE: 'marketing',\n    TITLE: 'Marketing Campaigns',\n    TAG: '',\n    COPY:\n      'Use the SendGrid UI to add contacts, create segments, create and send emails and automations, and view your stats.',\n    LINK: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/',\n  },\n  {\n    BADGE: 'development',\n    TITLE: 'API',\n    TAG: '',\n    COPY: 'Use the SendGrid v3 REST API to build and send email.',\n    LINK: '/for-developers/sending-email/api-getting-started/',\n  },\n  {\n    BADGE: 'development',\n    TITLE: 'SMTP',\n    TAG: '',\n    COPY: 'Use the SendGrid SMTP API to build and send email.',\n    LINK: '/for-developers/sending-email/getting-started-smtp/',\n  },\n  {\n    BADGE: 'twilio',\n    TITLE: 'Twilio Documentation',\n    TAG: '',\n    COPY: 'Explore Twilio’s API documentation and quickstarts. Learn how to build SMS, voice, chat, and video applications to engage your customers intelligently on Twilio’s omnichannel platform.',\n    LINK: 'https://www.twilio.com/docs',\n  },\n]\n\nexport default HOME_CALLOUTS;\n"
  },
  {
    "path": "src/constants/homeCards.js",
    "content": "import plane from '../img/icon-sending-email.svg';\nimport contacts from '../img/icon-contacts.svg';\nimport analytics from '../img/icon-analytics.svg';\nimport account from '../img/icon-account.svg';\n\nconst HOME_CARDS = [\n  {\n    ICON: plane,\n    TITLE: 'Sending Email',\n    LINKS: [\n      { URL: '/ui/sending-email/how-to-send-email-with-marketing-campaigns/', TEXTNODE: 'Sending Email with Marketing Campaigns' },\n      { URL: '/ui/sending-email/editor/', TEXTNODE: 'The Design & Code Editor' },\n      { URL: '/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/', TEXTNODE: 'Sending email with Dynamic Transactional Templates' },\n    ],\n    BUTTON_LINK: '/ui/sending-email/',\n  },\n  {\n    ICON: contacts,\n    TITLE: 'Managing Contacts with Marketing Campaigns',\n    LINKS: [\n      { URL: '/ui/managing-contacts/create-and-manage-contacts/', TEXTNODE: 'Create and Manage Contacts' },\n      { URL: '/ui/managing-contacts/building-your-contact-list/', TEXTNODE: 'Contacts Best Practices' },\n      { URL: '/ui/managing-contacts/segmenting-your-contacts/', TEXTNODE: 'Segmenting Contacts' },\n    ],\n    BUTTON_LINK: '/ui/managing-contacts/',\n  },\n  {\n    ICON: analytics,\n    TITLE: 'Analytics & Reporting',\n    LINKS: [\n      { URL: '/ui/analytics-and-reporting/email-activity-feed/', TEXTNODE: 'The Email Activity Feed' },\n      { URL: '/ui/analytics-and-reporting/marketing-campaigns-stats/', TEXTNODE: 'Marketing Campaigns Statistics' },\n      { URL: '/ui/analytics-and-reporting/stats-overview/', TEXTNODE: 'Statistics Overview' },\n    ],\n    BUTTON_LINK: '/ui/analytics-and-reporting/',\n  },\n  {\n    ICON: account,\n    TITLE: 'Account & Settings',\n    LINKS: [\n      { URL: '/ui/account-and-settings/api-keys/', TEXTNODE: 'API Keys' },\n      { URL: '/ui/account-and-settings/resetting-your-username-and-password/', TEXTNODE: 'Resetting Your Username and Password' },\n      { URL: '/ui/account-and-settings/how-to-set-up-domain-authentication/', TEXTNODE: 'How to set up Domain Authentication' },\n    ],\n    BUTTON_LINK: '/ui/account-and-settings/',\n  },\n];\n\nexport default HOME_CARDS;\n"
  },
  {
    "path": "src/constants/libraries.js",
    "content": "import csharp from '../img/icon-c-sharp.svg';\nimport php from '../img/icon-php.svg';\nimport ruby from '../img/icon-ruby.svg';\nimport node from '../img/icon-node.svg';\nimport python from '../img/icon-python.svg';\nimport golang from '../img/icon-go.svg';\nimport java from '../img/icon-java.svg';\n\nconst LIBRARIES = [\n  {\n    NAME: 'C Sharp',\n    URL: 'https://github.com/sendgrid/sendgrid-csharp',\n    IMG: csharp,\n  },\n  {\n    NAME: 'PHP',\n    URL: 'https://github.com/sendgrid/sendgrid-php',\n    IMG: php,\n  },\n  {\n    NAME: 'Ruby',\n    URL: 'https://github.com/sendgrid/sendgrid-ruby',\n    IMG: ruby,\n  },\n  {\n    NAME: 'Node',\n    URL: 'https://github.com/sendgrid/sendgrid-nodejs',\n    IMG: node,\n  },\n  {\n    NAME: 'Python',\n    URL: 'https://github.com/sendgrid/sendgrid-python',\n    IMG: python,\n  },\n  {\n    NAME: 'GoLang',\n    URL: 'https://github.com/sendgrid/sendgrid-go',\n    IMG: golang,\n  },\n  {\n    NAME: 'Java',\n    URL: 'https://github.com/sendgrid/sendgrid-java',\n    IMG: java,\n  },\n];\n\nexport default LIBRARIES;\n"
  },
  {
    "path": "src/constants/pageLinks.js",
    "content": "const LINKS = {\n  APP: 'https://app.sendgrid.com/',\n  FOR_DEVELOPERS: '/for-developers/',\n  GLOSSARY: '/glossary/',\n  LOGOUT: 'https://app.sendgrid.com/logout/',\n  PRICING: 'https://sendgrid.com/pricing/?utm_source=docs',\n  RELEASE_NOTES: '/release-notes/',\n  SENDGRID: 'https://sendgrid.com/?utm_source=docs',\n  SUPPORT: 'https://support.sendgrid.com/?utm_source=docs',\n  STATUS: 'http://status.sendgrid.com/?utm_source=docs',\n  SIGNUP: 'https://signup.sendgrid.com/?utm_source=docs',\n};\n\nexport default LINKS;\n"
  },
  {
    "path": "src/constants/socialLinks.js",
    "content": "const SOCIAL_LINKS = [\n  {\n    TEXTNODE: 'Twitter',\n    URL: 'https://twitter.com/sendgrid/',\n    IMG: 'https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/footer/icon-twitter-circle.svg',\n  },\n  {\n    TEXTNODE: 'LinkedIn',\n    URL: 'https://www.linkedin.com/company/sendgrid/',\n    IMG: 'https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/footer/icon-linkedin-circle.svg',\n  },\n  {\n    TEXTNODE: 'Facebook',\n    URL: 'https://www.facebook.com/SendGrid/',\n    IMG: 'https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/footer/icon-facebook-circle.svg',\n  },\n  {\n    TEXTNODE: 'GitHub',\n    URL: 'https://github.com/sendgrid/',\n    IMG: 'https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/footer/icon-github-circle.svg',\n  },\n  {\n    TEXTNODE: 'RSS Feed',\n    URL: 'https://sendgrid.com/blog/feed/',\n    IMG: 'https://sendgrid.com/wp-content/themes/sgdotcom/assets/images/footer/icon-rss-circle.svg',\n  },\n];\n\nexport default SOCIAL_LINKS;\n"
  },
  {
    "path": "src/constants/starWars.js",
    "content": "const STARWARS = {\n  'star wars': '/img/search-chewie.gif',\n  'darth vader': '/img/search-darth-vader.gif',\n  'r2d2': '/img/search-r2d2.gif',\n  'chewie': '/img/search-chewie.gif',\n  'luke skywalker': '/img/search-luke.gif',\n  'yoda': '/img/search-yoda.gif',\n};\n\nexport default STARWARS;\n"
  },
  {
    "path": "src/html.jsx",
    "content": "/* eslint import/no-unresolved:\"off\" */\n/* eslint import/extensions:\"off\" */\n/* eslint global-require:\"off\" */\nimport React from 'react';\n\nexport default class HTML extends React.Component {\n  render() {\n    return (\n      <html lang=\"en\">\n        <head>\n          <meta charSet=\"utf-8\" />\n          <meta\n            name=\"viewport\"\n            content=\"width=device-width, initial-scale=1.0\"\n          />\n          <link\n            rel=\"preload\"\n            href=\"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js\"\n            as=\"script\"\n          />\n          <link\n            rel=\"preload\"\n            href=\"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css\"\n            as=\"style\"\n          />\n          <script src=\"//cdn.optimizely.com/js/72168671.js\" />\n          <script\n            src=\"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js\"\n          />\n          {this.props.headComponents}\n\n          <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://sendgrid.com/brand/favicons/favicon.ico\" />\n          <link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"https://sendgrid.com/brand/favicons/apple-icon-57x57.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"https://sendgrid.com/brand/favicons/apple-icon-60x60.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"https://sendgrid.com/brand/favicons/apple-icon-72x72.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"https://sendgrid.com/brand/favicons/apple-icon-76x76.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"https://sendgrid.com/brand/favicons/apple-icon-114x114.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"https://sendgrid.com/brand/favicons/apple-icon-120x120.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"https://sendgrid.com/brand/favicons/apple-icon-144x144.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"https://sendgrid.com/brand/favicons/apple-icon-152x152.png\" />\n          <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"https://sendgrid.com/brand/favicons/apple-icon-180x180.png\" />\n          <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"https://sendgrid.com/brand/favicons/android-icon-192x192.png\" />\n          <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://sendgrid.com/brand/favicons/favicon-32x32.png\" />\n          <link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"https://sendgrid.com/brand/favicons/favicon-96x96.png\" />\n          <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://sendgrid.com/brand/favicons/favicon-16x16.png\" />\n          <link rel=\"manifest\" href=\"https://sendgrid.com/brand/favicons/manifest.json\" />\n          <meta name=\"msapplication-TileColor\" content=\"#ffffff\" />\n          <meta name=\"msapplication-TileImage\" content=\"https://sendgrid.com/brand/favicons/ms-icon-144x144.png\" />\n          <meta name=\"theme-color\" content=\"#ffffff\" />\n\n        </head>\n        <body>\n          {this.props.preBodyComponents}\n          <div\n            id=\"___gatsby\"\n            dangerouslySetInnerHTML={{ __html: this.props.body }}\n          />\n          {this.props.postBodyComponents}\n        </body>\n      </html>\n    );\n  }\n}\n"
  },
  {
    "path": "src/pages/404.jsx",
    "content": "import React from 'react';\nimport { Link } from 'gatsby';\nimport './404.scss';\nimport NoHeaderFooter from '../components/layout/NoHeaderFooter';\n\nfunction NotFound({ location }) {\n  return (\n    <NoHeaderFooter location={location}>\n      <div className=\"puppy-wrap\">\n        <div className=\"container ta-center\">\n          <div className=\"row not-found-content\">\n            <div className=\"col-lg-8 col-offset-lg-2 col-md-8 col-offset-md-2 col-sm-12\">\n              <h1>404 not found</h1>\n              <div className=\"m-bottom-8\">Looks like you’ve fallen off the grid.</div>\n              <Link className=\"btn btn-secondary\" to=\"/\">Return to Knowledge Center</Link>\n            </div>\n          </div>\n        </div>\n      </div>\n    </NoHeaderFooter>\n  );\n}\n\nexport default NotFound;\n"
  },
  {
    "path": "src/pages/404.scss",
    "content": "@import '../scss/global/variables';\n\n.puppy-wrap {\n  min-height: 300px;\n  overflow: hidden;\n  font-size: $scaleup-2;\n  line-height: 1.3;\n  height: 100vh;\n  background: linear-gradient(rgba(26,130,226,12.65),rgba(26,130,226,.65)), url('../img/puppy.gif') no-repeat 50% fixed;\n  background-size: cover;\n  color: #fff;\n\n  h1 {\n    color: #fff;\n  }\n\n  .btn-secondary {\n    background: transparent;\n    color: #fff;\n    border: 2px solid #fff;\n    font-size: $scaleup-1;\n  }\n}\n\n.not-found-content {\n  margin-top: 25%;\n}"
  },
  {
    "path": "src/pages/api-reference.jsx",
    "content": "import React from 'react';\nimport './api-reference.scss';\nimport Layout from '../components/layout';\n\nfunction stopLight({ location }) {\n  return (\n    <Layout location={location}>\n      <div className=\"container container-stoplight\">\n        <div className=\"iframe-container\">\n          <iframe width=\"1500\" height=\"1000\" title=\"SendGrid V3 API\" src=\"https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send\" frameBorder=\"0\" />\n        </div>\n      </div>\n    </Layout>\n  );\n}\n\nexport default stopLight;\n"
  },
  {
    "path": "src/pages/api-reference.scss",
    "content": ".iframe-container {\n  overflow: hidden;\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  left: 0;\n  min-height: 400px;\n\n  iframe {\n    height: 100%;\n    overflow: auto;\n    width: 100%;\n    display: block;\n  }\n}\n\n.container-stoplight {\n  position: absolute;\n  width: 100%;\n  overflow: scroll;\n  height: 100%;\n  max-width: 1600px !important;\n  min-height: 400px;\n}"
  },
  {
    "path": "src/pages/for-developers.jsx",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'gatsby';\nimport SEO from '../components/SEO';\nimport { GLOSSARY_TERMS_DEVS } from '../constants/glossaryTerms';\nimport GlossaryPartial from '../components/GlossaryPartial/glossaryPartial';\nimport FOR_DEVS_CARDS from '../constants/forDevelopersCards';\nimport Libaries from '../components/Libaries';\nimport withSubNav from '../components/NavSub';\nimport Layout from '../components/layout';\nimport './for-developers.scss';\n\nclass ForDevelopers extends Component {\n  static renderFeaturedCards() {\n    return FOR_DEVS_CARDS.map(card => (\n      <div className=\"card card--home col-md-6 ta-center\" key={card.TITLE}>\n        <div className=\"card__inner\">\n          <img className=\"card-icon\" src={card.ICON} alt={card.TITLE} />\n          <h3 className=\"card__title\">{card.TITLE}</h3>\n          {card.LINKS.map(link => <Link key={link.TEXTNODE} to={link.URL} className=\"card__link\">{link.TEXTNODE}</Link>)}\n        </div>\n        <div className=\"card__button\">\n          <Link className=\"btn center\" to={card.BUTTON_LINK}>View All</Link>\n        </div>\n      </div>\n    ));\n  }\n\n  render() {\n    const { location } = this.props;\n    return (\n      <Layout location={location}>\n        <div className=\"for-developers\">\n          <SEO postNode={this.props} title=\"For Developers\" description=\"SendGrid API and Marketing Campaigns documentation for Developers\" />\n          <div className=\"container for-devs-callouts m-bottom-6\">\n            <h1 className=\"page-title\">For Developers</h1>\n            <div className=\"row row--home-cards\">\n              <div className=\"col-md-4 col-offset-md-2 col-lg-4 col-offset-lg-2 card ta-center\">\n                <div className=\"for-devs-callouts__bar\" />\n                <h2>API Reference</h2>\n                <Link to=\"/api-reference/\" className=\"btn btn-primary center\">Visit API reference</Link>\n              </div>\n              <div className=\"col-lg-4 card ta-center\">\n                <div className=\"for-devs-callouts__bar\" />\n                <h2>Get Started</h2>\n                <div className=\"row for-devs-callouts__get-started-btns\">\n                  <Link to=\"/for-developers/sending-email/api-getting-started/\" className=\"btn btn-primary col-sm-6\">API</Link>\n                  <Link to=\"/for-developers/sending-email/getting-started-smtp/\" className=\"btn btn-primary col-sm-6\">SMTP</Link>\n                </div>\n              </div>\n            </div>\n          </div>\n          <Libaries />\n          <div className=\"for-devs-featured container\">\n            <h2>Featured Resources</h2>\n            <div className=\"row row--home-cards\">\n              {ForDevelopers.renderFeaturedCards()}\n            </div>\n          </div>\n          <div className=\"for-devs-glossary\">\n            <GlossaryPartial data={GLOSSARY_TERMS_DEVS} />\n          </div>\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport default ForDevelopers;\n"
  },
  {
    "path": "src/pages/for-developers.scss",
    "content": "@import '../scss/global/variables';\n@import '../scss/global/mixins';\n$card-gutter: 30px;\n\n.for-devs-libraries {\n  margin-bottom: $scaleup-8;\n}\n\n.for-devs-featured {\n  padding-bottom: calc(16rem + 40px);\n}\n\n.docsfor-developers {\n  .layout-content {\n    overflow: hidden;\n    position: relative;\n  }\n}\n\n.for-developers {\n  position: relative;\n\n  .layout-content {\n    overflow: hidden;\n    position: relative;\n  }\n\n  .page-title {\n    color: #fff;\n    position: relative;\n    width: 100%;\n    text-align: center;\n    margin-bottom: $scaleup-5;\n  }\n}\n\n.for-devs-callouts {\n  padding-top: $scaleup-3;\n  padding-bottom: $scaleup-3;\n  position: relative;\n\n  .card {\n    padding: $scale-base-up-09 $scale-base-up-04 $scale-base-up-06;\n    border: none;\n  }\n}\n\n.for-devs-callouts::before {\n  background: $slate;\n  background: $gradient-dev-callout;\n  content: \"\";\n  height: 210%;\n  left: -75%;\n  position: absolute;\n  top: 0;\n  transform: rotate(-9deg);\n  transform-origin: left top;\n  width: 250%;\n  z-index: 0;\n}\n\n.for-devs-featured {\n  position: relative;\n  background: url('../img/illustration-developers-footer.svg') no-repeat bottom center;\n\n  h2 {\n    font-size: $scaleup-3;\n    margin-bottom: $scaleup-4;\n    text-align: center;\n    position: relative;\n  }\n}\n\n.for-devs-featured::before {\n  background: $slate-05;\n  content: \"\";\n  height: 70%;\n  left: -75%;\n  position: absolute;\n  top: 350px;\n  transform: rotate(-9deg);\n  transform-origin: left top;\n  width: 250%;\n  z-index: 0;\n}\n\n.for-devs-callouts__bar {\n  height: 20px;\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  background: $mantis;\n  background: $gradient-dev-glossary;\n}\n\n.for-devs-callouts__get-started-btns {\n  width: 100%;\n  grid-column-gap: 4%;\n\n  .btn {\n    flex: 1;\n    padding-left: $scaleup-1;\n    padding-right: $scaleup-1;\n  }\n}\n"
  },
  {
    "path": "src/pages/glossary.jsx",
    "content": "import React from 'react';\nimport { Link, graphql } from 'gatsby';\nimport SEO from '../components/SEO';\nimport './glossary.scss';\nimport withSubNav from '../components/NavSub';\nimport Layout from '../components/layout';\n\nclass Glossary extends React.Component {\n  constructor(props) {\n    super(props);\n    this.glossary = this.alphaEdges();\n  }\n\n  alphaEdges() {\n    const { data } = this.props;\n    const { edges } = data.glossary;\n    const groupedEdges = {};\n\n    edges.forEach((edge) => {\n      const sortChar = edge.node.fields.title.slice(0, 1);\n\n      if (sortChar in groupedEdges) {\n        groupedEdges[sortChar].push(edge);\n      } else {\n        groupedEdges[sortChar] = [edge];\n      }\n    });\n\n    return groupedEdges;\n  }\n\n  render() {\n    const { location } = this.props;\n    return (\n      <Layout location={location} subNav={true}>\n        <div className=\"container\">\n          <SEO postNode={this.props} title=\"Glossary\" description=\"SendGrid documentation glossary\" />\n          <h1>Glossary</h1>\n          <div className=\"row\">\n            {Object.keys(this.glossary).map(key => (\n              <div key={key} className=\"col-md-6 glossary-alpha-section\">\n                <h3>{key}</h3>\n                {this.glossary[key].map(edge => (\n                  <Link\n                    key={edge.node.fields.title}\n                    to={edge.node.fields.permalink}\n                  >\n                    {edge.node.fields.title}\n                  </Link>\n                ))}\n              </div>\n            ))}\n          </div>\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport default Glossary;\n\nexport const pageQuery = graphql`\n  query glossary {\n    glossary: allMarkdownRemark(\n      limit: 2000,\n      filter: { fields: {docType: { eq: \"glossary\" } } },\n      sort: { fields: [frontmatter___title], order: ASC }\n    ) {\n      edges {\n        node {\n          fields {\n            docType\n            slug\n            permalink\n            category\n            title\n          }\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "src/pages/glossary.scss",
    "content": ".glossary-alpha-section {\n  margin-bottom: 30px;\n\n  a {\n    display: block;\n    margin-bottom: 10px;\n  }\n}"
  },
  {
    "path": "src/pages/index.jsx",
    "content": "import React from 'react';\nimport { Link } from 'gatsby';\nimport SEO from '../components/SEO';\nimport Search from '../components/Search';\nimport { GLOSSARY_TERMS_HOME } from '../constants/glossaryTerms';\nimport GlossaryPartial from '../components/GlossaryPartial/glossaryPartial';\nimport FooterCallout from '../components/FooterCallout';\nimport config from '../../data/SiteConfig';\nimport HOME_CARDS from '../constants/homeCards';\nimport CALLOUTS from '../constants/homeCallouts';\nimport Layout from '../components/layout';\nimport './index.scss';\n\nclass Index extends React.Component {\n  static renderCards() {\n    return HOME_CARDS.map(card => (\n      <div className=\"card card--home col-md-6 ta-center\" key={card.TITLE}>\n        <div className=\"card__inner\">\n          <img className=\"card-icon\" src={card.ICON} alt={card.TITLE} />\n          <h3 className=\"card__title\">{card.TITLE}</h3>\n          {card.LINKS.map(link => <Link key={link.TEXTNODE} to={link.URL} className=\"card__link\">{link.TEXTNODE}</Link>)}\n        </div>\n        <div className=\"card__button\">\n          <Link className=\"btn center\" to={card.BUTTON_LINK}>View All</Link>\n        </div>\n      </div>\n    ));\n  }\n\n  static renderCallouts() {\n    return CALLOUTS.map((card) => {\n      const cardClass = `card col-home-callout home-callout callout--${card.BADGE}`;\n      // Handle internal and external links in cards\n      const cardLinkButton = card.LINK.substring(0, 4) === 'http'\n        ? <a href={card.LINK} className=\"btn btn-primary center\">Start Building</a>\n        : <Link to={card.LINK} className=\"btn btn-primary center\">Get Started</Link>;\n\n      return (\n        <div className={cardClass} key={card.TITLE}>\n          <div className=\"home-callout__badge\">\n            {card.BADGE}\n          </div>\n          <h3 className=\"card__title is-size-h2 m-bottom-2\">\n            {card.TITLE}\n            {(card.TAG.length > 0 ? (<span className=\"tag--beta\">{card.TAG}</span>) : null)}\n          </h3>\n          <div className=\"is-p\">{card.COPY}</div>\n          {cardLinkButton}\n        </div>\n      );\n    });\n  }\n\n  render() {\n    const { location } = this.props;\n    return (\n      <Layout location={location} subNav={false}>\n        <div className=\"docs-home\">\n          <SEO postNode={this.props} title={config.siteTitle} description=\"SendGrid documentation home\" />\n          <div className=\"search-hero ta-center color-white\">\n            <div className=\"container\">\n              <div className=\"search-hero__bg\">\n                <h1 className=\"page-title\">Knowledge Center</h1>\n                <Search />\n              </div>\n            </div>\n          </div>\n          <div className=\"home-callouts\">\n            <div className=\"container\">\n              <div className=\"row row--home-callouts\">\n                {Index.renderCallouts()}\n              </div>\n            </div>\n          </div>\n          <div className=\"main\">\n            <div className=\"home-featured\">\n              <div className=\"container\">\n                <h2>Featured Resources</h2>\n                <div className=\"row row--home-cards\">\n                  {Index.renderCards()}\n                </div>\n              </div>\n            </div>\n            <GlossaryPartial data={GLOSSARY_TERMS_HOME} />\n          </div>\n          <FooterCallout />\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport default Index;\n"
  },
  {
    "path": "src/pages/index.scss",
    "content": "@import '../scss/global/variables';\n@import '../scss/global/mixins';\n$card-gutter: 40px;\n\n.docs-home {\n  overflow: hidden;\n}\n\n.page-title {\n  font-size: $scaleup-5;\n  line-height: 1.2;\n  margin-bottom: $scaledown-6;\n\n  @include colfax(600);\n}\n\n.search-hero {\n  background: $sg-blue-20;\n  background: $gradient-hero;\n}\n\n.search-hero.star-wars {\n  background-size: cover;\n  background-position: center;\n\n  #query, .ds-dropdown-menu {\n    opacity: 0.9;\n  }\n}\n\n.search-hero__bg {\n  padding: $scaleup-6 0 13rem 0;\n  background: url('../img/help-center-hero.svg') no-repeat;\n  background-position: bottom center;\n\n  @media (max-width: $width-small) {\n    background-size: contain;\n    padding-bottom: $scaleup-10;\n  }\n\n  @media (max-width: $width-small-mobile) {\n    padding-bottom: $scaleup-8;\n  }\n}\n\n// Override SendGrid search input styles for the hero search\n.search-hero .input-text-wrap .search-hero__query {\n  background-color: #fff;\n  padding: $scaleup-1 $scaleup-2 $scaleup-1 $scaleup-7;\n  font-size: $scaleup-1;\n  box-sizing: border-box;\n  color: $slate;\n  border: 1px solid $sg-blue-10;\n  box-shadow: 0 5px 9px 0 rgba(118, 180, 238, 0.1);\n  z-index: 4;\n\n  &:hover, &:focus {\n    box-shadow: 0 5px 9px 0 rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.08);\n  }\n\n  @media (max-width: $width-mobile) {\n    font-size: $scale-0;\n  }\n}\n\n.search-hero .search-hero__bg #query:focus {\n  border: 1px solid $sg-blue-40;\n}\n\n.search-hero .input-text-wrap.is-search::after {\n  color: $sg-blue;\n  font-size: $scaleup-2;\n  top: 37px;\n  left: 20px;\n  right: initial;\n  z-index: 4;\n}\n\n.home-callout__badge {\n  margin-bottom: $scale-0;\n  text-transform: uppercase;\n  font-size: $scaledown-1;\n\n  @include colfax(600);\n}\n\n.callout--marketing .home-callout__badge {\n  color: $seafoam;\n}\n\n.callout--development .home-callout__badge {\n  color: $mantis;\n}\n\n.callout--twilio .home-callout__badge {\n  color: $twilio-red;\n}\n\n.card--no-pad {\n  padding: 0 0 0 0;\n}\n\n.card--home {\n\n  .card-icon {\n    max-width: 40px;\n    margin: 0 auto 20px;\n  }\n\n  .card__title {\n    margin-bottom: $scaleup-4;\n  }\n\n  .btn {\n    margin-top: $scaleup-1;\n  }\n}\n\n.card__title {\n  display: block;\n  width: 100%;\n}\n\n.card--glossary {\n  .card__title {\n    margin-bottom: $scaleup-2;\n  }\n}\n\n.row--home-callouts,\n.row--home-cards {\n  grid-gap: $card-gutter;\n\n  @media (max-width: $width-mobile) {\n    grid-gap: 2%;\n  }\n}\n\n.row--home-callouts {\n  margin-bottom: $card-gutter;\n  grid-template-columns: repeat(2, 1fr);\n\n  @media (max-width: $width-small) {\n    grid-template-columns: 1fr;\n  }\n\n  .tag--beta {\n    line-height: 1;\n    margin-left: $scaledown-2;\n    vertical-align: middle;\n  }\n}\n\n.col-home-callout {\n  grid-column: auto;\n}\n\n.home-featured {\n  margin-bottom: 80px;\n  padding-top: $scaleup-1;\n  position: relative;\n\n  h2 {\n    font-size: $scaleup-3;\n    margin-bottom: $scaleup-4;\n    text-align: center;\n    position: relative;\n    color: #fff;\n  }\n}\n\n.home-featured::before {\n  background: $seafoam;\n  background: $gradient-home-featured;\n  content: \"\";\n  height: 100%;\n  left: -25%;\n  position: absolute;\n  top: 4rem;\n  transform: rotate(-5deg);\n  transform-origin: left top;\n  width: 150%;\n  z-index: 0;\n\n  @media (max-width: $width-medium) {\n    transform: rotate(-2deg);\n    top: 0;\n  }\n}\n\n.home-callouts {\n  display: block;\n  margin-top: -30px;\n  position: relative;\n  z-index: 2;\n}\n\n.home-callout {\n  padding: $scaleup-4 $scaleup-3 $scaleup-7;\n  display: block;\n\n  .btn {\n    height: 40px;\n    widows: 132px;\n    position: absolute;\n    bottom: 25px;\n    left: 50%;\n    margin-left: -66px;\n  }\n}\n"
  },
  {
    "path": "src/pages/release-notes.jsx",
    "content": "import React from 'react';\nimport { graphql } from 'gatsby';\nimport _ from 'lodash';\nimport SEO from '../components/SEO';\nimport AsideMenu from '../components/AsideMenu';\nimport ReleaseKey from '../components/ReleaseNotes/ReleaseKey';\nimport ReleaseNotePost from '../components/ReleaseNotes/ReleaseNotePost';\nimport withSubNav from '../components/NavSub';\nimport './release-notes.scss';\nimport Layout from '../components/layout';\n\nclass ReleaseNotes extends React.Component {\n  getAsideLinks() {\n    const { data } = this.props;\n    const { edges } = data.releaseNotes;\n    const overview = {\n      tagName: 'h2',\n      textNode: 'Overview',\n      id: 'overview',\n    };\n\n    const asideLinks = edges.map((edge) => {\n      const link = {};\n      link.tagName = 'h2';\n      link.textNode = edge.node.frontmatter.date;\n      link.id = _.kebabCase(edge.node.frontmatter.date);\n      return link;\n    });\n\n    return [overview, ...asideLinks];\n  }\n\n  render() {\n    const { data, location } = this.props;\n    const { edges } = data.releaseNotes;\n    const asideLinks = this.getAsideLinks();\n    return (\n      <Layout location={location} subNav={true}>\n        <div className=\"container-lg\">\n          <SEO postNode={this.props} title=\"Release Notes\" description=\"SendGrid API and Marketing Campaigns Release Notes\" />\n          <div className=\"row\">\n            <div className=\"col-md-3\">\n              <AsideMenu asideLinks={asideLinks} pageType=\"release-notes\" />\n            </div>\n            <div className=\"col-md-9\">\n              <h1>Release Notes</h1>\n              <div className=\"release-notes-overview m-bottom-6\">\n                <h2 className=\"hidden\">\n                  <a href=\"#overview\" className=\"anchor\" data-slug=\"overview\">Overview</a>\n                </h2>\n                <p className=\"is-size-h3\">\n                  If you’re looking for SendGrid’s operational status, see our\n                  {' '}\n                  <a href=\"http://status.sendgrid.com/\">Status Page</a>\n                  .\n                </p>\n                <p className=\"is-size-h3\">Some categories featured in our release notes include:</p>\n              </div>\n              <ReleaseKey />\n              {edges.map(edge => (\n                <ReleaseNotePost\n                  key={edge.node.frontmatter.date}\n                  node={edge.node}\n                />\n              ))}\n            </div>\n          </div>\n        </div>\n      </Layout>\n\n    );\n  }\n}\n\nexport default ReleaseNotes;\n\nexport const pageQuery = graphql`\n  query releaseNote {\n    releaseNotes: allMarkdownRemark(\n      filter: { fields: {docType: { eq: \"release-notes\" } } },\n      sort: { fields: [frontmatter___date], order: DESC }\n    ) {\n      edges {\n        node {\n          htmlAst\n          frontmatter {\n            releaseType\n            date(formatString: \"Do MMMM YYYY\")\n          }\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "src/pages/release-notes.scss",
    "content": "@import '../scss/global/variables';\n@import '../scss/global/mixins';\n\n// release note cols\n.release-row {\n  display: flex;\n  align-items: stretch;\n  margin: 0 -20px;\n}\n\n.release-row .icons {\n  margin: -19px 20px 0;\n  flex: 0 0 70px;\n  position: relative;\n  text-align: center;\n  overflow: hidden;\n  font-size: $scaledown-1;\n  text-transform: uppercase;\n  line-height: $scaleup-1;\n  color: $slate-60;\n\n  @include colfax(600);\n\n  &::after {\n    content: '';\n    height: 100%;\n    width: 5px;\n    margin-left: -2px;\n    background: $slate-10;\n    display: block;\n    position: absolute;\n    left: 50%;\n  }\n}\n\n.release-row .html-ast {\n  margin: 0 20px;\n}\n\n.release-notes-overview p {\n  @include colfax(400);\n\n  color: $slate-80;\n}\n\n.release-notes-key {\n  display: flex;\n  padding: $scaleup-4;\n  background: $slate-02;\n  max-width: 670px;\n}\n\n.release-notes-key__icon {\n  @include colfax(600);\n\n  color: $slate-60;\n  flex: 1;\n  font-size: $scaledown-1;\n  line-height: normal;\n  margin: $scaledown-4;\n  text-align: center;\n  text-transform: uppercase;\n\n  > div {\n    padding-top: 60px;\n    margin-bottom: $scale-0;\n    background-size: 60px;\n    background-position: center;\n  }\n}\n\n.release-notes-key .release-notes-key__icon {\n  background-size: 60px;\n  background-position: center;\n}\n\n.icons__icon {\n  // background-position: 10px ;\n  padding: $scaleup-8 0 $scaledown-1;\n}\n\n.icon-partners {\n  background: url('../img/release-note-partners.svg') no-repeat;\n  background-position: center 14px;\n  background-size: 60px;\n}\n\n.icon-price {\n  background: url('../img/release-note-price.svg') no-repeat ;\n  background-position: center 14px;\n  background-size: 60px;\n}\n\n.icon-ui {\n  background: url('../img/release-note-ui.svg') no-repeat;\n  background-position: center 14px;\n  background-size: 60px;\n}\n\n.icon-api {\n  background: url('../img/release-note-api.svg') no-repeat;\n  background-position: center 14px;\n  background-size: 60px;\n}\n\n.icon-expert-services {\n  background: url('../img/release-note-expert-services.svg') no-repeat;\n  background-position: center 14px;\n  background-size: 60px;\n}\n"
  },
  {
    "path": "src/pages/site-map.jsx",
    "content": "import React from 'react';\nimport kebabCase from 'lodash/kebabCase';\nimport { Link, graphql } from 'gatsby';\nimport Layout from '../components/layout';\n\nexport default class siteMap extends React.Component {\n  render() {\n    const { data, location } = this.props;\n    const {\n      helpSupportCats,\n      forDevsCats,\n      pages,\n      allDocs,\n    } = data;\n\n    return (\n      <Layout location={location}>\n        <div className=\"container\">\n          <h1>Site Map</h1>\n          <div className=\"m-bottom-4\">\n            <h3>Help Support Categories</h3>\n            {helpSupportCats.group.map(cat => (\n              <div key={cat.fieldValue}>\n                <Link to={`/ui/${kebabCase(cat.fieldValue)}/`}>\n                  {`${cat.fieldValue} (${cat.totalCount})`}\n                </Link>\n              </div>\n            ))}\n          </div>\n          <div className=\"m-bottom-4\">\n            <h3>For Developers Categories</h3>\n            {forDevsCats.group.map(cat => (\n              <div key={cat.fieldValue}>\n                <Link to={`/for-developers/${kebabCase(cat.fieldValue)}/`}>\n                  {`${cat.fieldValue} (${cat.totalCount})`}\n                </Link>\n              </div>\n            ))}\n          </div>\n          <div className=\"m-bottom-4\">\n            <h3>Pages</h3>\n            {pages.edges.map(page => (\n              <div key={page.node.id}>\n                <Link to={page.node.path}>\n                  {page.node.id}\n                </Link>\n              </div>\n            ))}\n          </div>\n          <div className=\"m-bottom-4\">\n            <h3>All Docs</h3>\n            {allDocs.edges.map(doc => (\n              <div key={doc.node.id} className=\"single-doc m-top-2 m-bottom-2\">\n                <div>\n                  <strong>title:</strong>\n                  {' '}\n                  {doc.node.frontmatter.title}\n                </div>\n                <div>\n                  <strong>SEO - meta title:</strong>\n                  {' '}\n                  {doc.node.frontmatter.seo && doc.node.frontmatter.seo.title }\n                </div>\n                <div>\n                  <strong>SEO - meta description:</strong>\n                  {' '}\n                  {doc.node.frontmatter.seo && doc.node.frontmatter.seo.description }\n                </div>\n                <div>\n                  <strong>uri: </strong>\n                  <Link to={doc.node.fields.permalink}>\n                    {doc.node.fields.permalink}\n                    {' '}\n                  </Link>\n                </div>\n                <div>\n                  <strong>category: </strong>\n                  {doc.node.fields.category}\n                </div>\n                <div>\n                  <strong>group: </strong>\n                  {doc.node.fields.group}\n                </div>\n                <div>\n                  <strong>path: </strong>\n                  {doc.node.fileAbsolutePath}\n                </div>\n              </div>\n            ))}\n          </div>\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport const pageQuery = graphql`\n  query SiteMap {\n    helpSupportCats: allMarkdownRemark(\n      limit: 2000,\n      filter: { fields: {docType: { eq: \"ui\" } } }\n    ) {\n      group(field: fields___category) {\n        fieldValue\n        totalCount\n      }\n    }\n    forDevsCats: allMarkdownRemark(\n      limit: 2000,\n      filter: { fields: {docType: { eq: \"for-developers\" } } }\n    ) {\n      group(field: fields___category) {\n        fieldValue\n        totalCount\n      }\n    }\n    pages: allSitePage(\n      filter: {\n        path: {regex:\"/^((?!ui|for-developers\\/[^/]+).)*$/\"}\n      }\n    ) {\n      edges {\n        node {\n          path\n          id\n        }\n      }\n    }\n    allDocs: allMarkdownRemark(sort:{ fields: [fields___slug] }) {\n      edges {\n        node {\n          fields {\n            slug\n            permalink\n            docType\n            category\n            group\n          }\n          fileAbsolutePath\n          id\n          frontmatter {\n            title\n            seo {\n              title\n              description\n              keywords\n            }\n          }\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "src/scss/components/_accordions.scss",
    "content": ".accordion-wrapper {\n  background-color: $white;\n  border: 1px solid $slate-10;\n  border-radius: $border-radius;\n\n  &.is-editor {\n    width: 360px;\n    border-right: 0;\n    border-left: 0;\n    border-radius: 0;\n\n    .accordion-title {\n      padding: 20px 70px 20px 20px;\n    }\n\n    .accordion-content {\n      @include clearfix;\n      padding: 20px 15px;\n    }\n\n    .card.is-module {\n      float: left;\n      margin-right: 15px;\n      margin-bottom: 15px;\n    }\n\n    .card.is-module:nth-child(3n) {\n      margin-right: 0;\n    }\n\n    .card.is-module:nth-child(7),\n    .card.is-module:nth-child(8),\n    .card.is-module:nth-child(9) {\n      // add 5px to account for consistent bottom of 20px\n      margin-bottom: 5px;\n    }\n  }\n\n  p {\n    font-size: 13px;\n    line-height: 20px;\n  }\n}\n\n.accordion-panel {\n  border-bottom: 1px solid $slate-10;\n\n  &.has-child {\n    .accordion-wrapper {\n      border: 0;\n    }\n\n    .accordion-wrapper .accordion-content {\n      padding: 30px;\n    }\n\n    .accordion-content {\n      padding: 0;\n    }\n  }\n\n  &.is-visible {\n    > .accordion-title::after {\n      transform: rotate(0);\n    }\n  }\n\n  &:last-child {\n    border-bottom: 0;\n  }\n}\n\n.accordion-title {\n  position: relative;\n  padding: 15px 90px 15px 15px;\n  cursor: pointer;\n\n  &::after {\n    @include icon-font-base;\n    position: absolute;\n    top: 50%;\n    right: 30px;\n    margin-top: -10px;\n    font-size: 20px;\n    content: $icon-caret;\n    transform: rotate(-90deg);\n    transition: transform 0.3s;\n  }\n\n  h2,\n  h3,\n  h4 {\n    margin-bottom: 0;\n  }\n\n  h4 {\n    line-height: 20px;\n  }\n\n  p {\n    margin-top: 12px;\n    margin-bottom: 0;\n  }\n}\n\n.accordion-check-circle::before {\n  @include icon-font-base;\n  position: absolute;\n  left: 30px;\n  color: $slate-20;\n  content: $icon-status-positive;\n}\n\n.accordion-content {\n  display: none;\n  padding: 30px;\n  background-color: $slate-02;\n  border-top: 1px solid $slate-10;\n\n  &.accordion-list {\n    padding: 0;\n\n    li {\n      position: relative;\n      padding: 30px 60px;\n      border-bottom: 1px solid $slate-10;\n    }\n\n    li:last-child {\n      border-bottom: 0;\n    }\n\n    .is-complete::before {\n      color: $mantis;\n    }\n\n    .btn {\n      position: absolute;\n      top: 50%;\n      right: 60px;\n      margin-top: -22.5px;\n    }\n\n  }\n\n  p {\n    margin-bottom: 0;\n  }\n}\n\n.accordion-caret-left {\n\n  .accordion-title {\n    padding-left: 50px;\n  }\n\n  .accordion-title::after {\n    right: auto;\n    left: 15px;\n  }\n\n}\n\n.accordion-large {\n\n  .accordion-title {\n    padding: 30px 90px 30px 100px;\n\n    .accordion-icon {\n      position: absolute;\n      left: 30px;\n      width: 40px;\n      margin-right: 30px;\n      font-size: 40px;\n    }\n  }\n\n  .accordion-title::after {\n    margin-top: -20px;\n    font-size: 40px;\n  }\n\n  .accordion-content {\n    padding: 30px 100px;\n\n    &.accordion-list {\n      padding: 0;\n    }\n  }\n\n  .accordion-list {\n    li {\n      padding: 30px 100px;\n\n      &::before {\n        left: 70px;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_alerts.scss",
    "content": "// sass-lint:disable no-important\n// linting properties disabled due to potential for alert position to be overriden\n\n.alert {\n  position: relative;\n  z-index: 1000;\n  padding: 20px 0;\n  font-size: 13px;\n  text-align: center;\n\n  &.alert-success {\n    color: $alert-success-text;\n    background-color: $alert-success;\n\n    a {\n      color: $alert-success-text;\n    }\n\n    .btn-primary {\n      color: $alert-success-text;\n      background: $alert-success;\n      border-color: $alert-success-text;\n    }\n  }\n\n  &.alert-warning {\n    color: $alert-warning-text;\n    background-color: $alert-warning;\n\n    a {\n      color: $alert-warning-text;\n    }\n\n    .btn-primary {\n      color: $alert-warning-text;\n      background: $alert-warning;\n      border-color: $alert-warning-text;\n    }\n  }\n\n  &.alert-danger {\n    color: $alert-danger-text;\n    background-color: $alert-danger;\n\n    a {\n      color: $alert-danger-text;\n    }\n\n    .btn-primary {\n      color: $alert-danger-text;\n      background: $alert-danger;\n      border-color: $alert-danger-text;\n    }\n  }\n\n  &.alert-verification,\n  &.alert-trial {\n    color: $white;\n\n    a {\n      color: $white;\n    }\n  }\n\n  &.alert-verification {\n    background-color: $alert-verification;\n\n    .btn-primary {\n      margin-top: -5px;\n      margin-bottom: -5px;\n      color: $mantis;\n      background: $white;\n      border-color: $white;\n    }\n\n    .step,\n    .all-steps {\n      position: absolute;\n      max-width: 100%;\n      margin: 0;\n    }\n\n    .step {\n      left: 30px;\n      letter-spacing: 1px;\n      text-transform: uppercase;\n    }\n\n    .all-steps {\n      right: 30px;\n    }\n  }\n\n  &.alert-trial {\n    background-color: $alert-trial;\n\n    .btn-primary {\n      margin-top: -5px;\n      margin-bottom: -5px;\n      color: $white;\n      background: $slate;\n      border-color: $white;\n    }\n  }\n\n  &.alert-inline {\n    z-index: 0;\n    align-self: flex-end;\n    width: 100%;\n\n    p {\n      text-align: left;\n    }\n  }\n\n  &.is-hidden,\n  &.is-visible {\n    position: fixed;\n    left: 0;\n    width: 100%;\n    transition: top 0.5s;\n  }\n\n  &.is-hidden {\n    top: -60px;\n  }\n\n  &.is-visible {\n    top: 0 !important;\n  }\n\n  &.tiara-offset {\n    left: 180px;\n    width: calc(100vw - 180px);\n  }\n\n  a {\n    text-decoration: underline;\n  }\n\n  p {\n    position: relative;\n    display: inline-block;\n    max-width: 80%;\n    margin: 0 40px;\n    font-size: 13px;\n    line-height: 20px;\n  }\n\n  .sg-icon {\n    position: absolute;\n    top: 50%;\n    left: -40px;\n    margin-top: -10px;\n    font-size: 20px;\n\n    &.sg-icon-x {\n      right: -40px;\n      left: auto;\n      cursor: pointer;\n    }\n  }\n\n  .btn {\n    margin-left: 20px;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_algolia.scss",
    "content": ".algolia-autocomplete {\n\n  .ds-dropdown-menu {\n    width: 100% !important;\n    max-width: 100% !important;\n    min-width: 100% !important;\n    margin-top: 0 !important;\n    box-shadow: 0 5px 9px 0 rgba(118, 180, 238, 0.1) !important;\n    z-index: 3 !important;\n    border-radius: 0 0 2px 2px !important;\n\n    &::before {\n      display: none !important;\n    }\n\n    [class^=ds-dataset-] {\n      border: 0 !important;\n      border-radius: 0 0 2px 2px !important;\n      padding: $scaleup-3 !important;\n    }\n\n    .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content {\n      background: $sg-blue-10 !important;\n    }\n  }\n\n  .algolia-docsearch-footer {\n    font-size: $scaledown-2 !important;\n    color: $slate-40 !important;\n    width: auto !important;\n    height: auto !important;\n    margin-top: $scaleup-3 !important;\n  }\n\n  .algolia-docsearch-footer--logo {\n    text-indent: 0 !important;\n    background: transparent !important;\n    color: $slate-40 !important;\n    overflow: visible !important;\n    height: auto !important;\n    width: auto !important;\n    display: inline !important;\n  }\n\n  .algolia-docsearch-suggestion--subcategory-column {\n    color: $slate-60 !important;\n    font-size: $scaledown-1 !important;\n    letter-spacing: 0.6px !important;\n  }\n\n  .algolia-docsearch-suggestion--content:before {\n    background: $slate-10 !important;\n  }\n\n  .algolia-docsearch-suggestion--title {\n    color: $slate !important;\n    margin-top: 2px !important;\n    margin-bottom: 2px !important;\n    font-size: $scale-0 !important;\n    line-height: $scaleup-2 !important;\n  }\n\n  .algolia-docsearch-suggestion--wrapper {\n    padding: 10px 0 0 !important;\n    display: flex !important;\n    align-items: center !important;\n  }\n\n  .algolia-docsearch-suggestion--category-header {\n    color: $slate-80 !important;\n    font-size: $scaledown-1 !important;\n    letter-spacing: 0.6px !important;\n    text-transform: uppercase !important;\n    font-weight: 600 !important;\n  }\n\n  .algolia-docsearch-suggestion--highlight {\n    color: $sg-blue !important;\n    background: $sg-blue-10 !important;\n  }\n\n}\n\n.for-developers {\n  .algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] {\n    padding: $scale-0 !important;\n  }\n\n  .ds-dropdown-menu {\n    width: 200% !important;\n    max-width: 200% !important;\n    min-width: 200% !important;\n\n    @media (max-width: 610px) {\n      width: 100% !important;\n      max-width: 100% !important;\n      min-width: 100% !important;\n    }\n  }\n}\n\n@media (max-width: 768px) {\n\n  .algolia-autocomplete {\n\n    .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content {\n      padding: $scaledown-3 !important;\n    }\n\n    .algolia-docsearch-suggestion--wrapper {\n      padding: $scaledown-3 !important;\n      display: block !important;\n    }\n\n    .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header {\n      margin-top: $scaledown-1 !important;\n    }\n\n    .algolia-docsearch-suggestion {\n\n      .algolia-docsearch-suggestion--subcategory-column {\n        width: 100% !important;\n        margin-bottom: $scaledown-5 !important;\n        font-weight: normal !important;\n\n        &::after {\n          display: none !important;\n        }\n      }\n\n      .algolia-docsearch-suggestion--content {\n        width: 100% !important;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_badges.scss",
    "content": ".badge {\n  display: inline-block;\n  padding: 3px 6px;\n  margin-bottom: 3px;\n  font-size: 10px;\n  line-height: 1;\n  letter-spacing: 1px;\n  color: $white;\n  text-transform: uppercase;\n  vertical-align: middle;\n  background-color: $slate-40;\n  border-radius: $border-radius;\n\n  &.is-right {\n    margin-left: 6px;\n  }\n\n  &.is-left {\n    margin-right: 6px;\n  }\n\n  &.is-sender {\n    width: 60px;\n    margin-right: 6px;\n    text-align: center;\n  }\n\n  &.badge-category {\n    margin-right: 3px;\n    color: $slate-60;\n    cursor: pointer;\n    background: $white;\n    border: 1px solid $slate-40;\n    transition: color 0.3s, background-color 0.3s;\n\n    &:hover,\n    &.is-hovered {\n      color: $white;\n      background-color: $slate-40;\n    }\n  }\n\n  &.sg-blue {\n    background-color: $sg-blue;\n  }\n\n  &.slate {\n    background-color: $slate;\n  }\n\n  &.ron-burgundy {\n    background-color: $ron-burgundy;\n  }\n\n  &.burnt-orange {\n    background-color: $burnt-orange;\n  }\n\n  &.carrot {\n    background-color: $carrot;\n  }\n\n  &.mango {\n    background-color: $mango;\n  }\n\n  &.mantis {\n    background-color: $mantis;\n  }\n\n  &.spruce {\n    background-color: $spruce;\n  }\n\n  &.grass-stain {\n    background-color: $grass-stain;\n  }\n\n  &.lime {\n    background-color: $lime;\n  }\n\n  &.cobalt {\n    background-color: $cobalt;\n  }\n\n  &.bluebird {\n    background-color: $bluebird;\n  }\n\n  &.seafoam {\n    background-color: $seafoam;\n  }\n\n  &.caribbean {\n    background-color: $caribbean;\n  }\n\n  &.crown {\n    background-color: $crown;\n  }\n\n  &.screample {\n    background-color: $screample;\n  }\n\n  &.sangria {\n    background-color: $sangria;\n  }\n\n  &.lavender {\n    background-color: $lavender;\n  }\n\n  &.wild-strawberry {\n    background-color: $wild-strawberry;\n  }\n\n  &.steel {\n    background-color: $steel;\n  }\n}\n\n.tag--beta {\n  padding: $scaledown-7 $scaledown-6;\n  margin: 0 0 0 $scaledown-6;\n  display: inline-block;\n  position: relative;\n  top: -2px;\n  font-size: $scaledown-2;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.41px;\n  color: $white;\n  border-radius: $border-radius;\n  background: linear-gradient(125deg, rgba(207,153,236,1) 0%, rgba(124,77,255,1) 100%);\n}\n"
  },
  {
    "path": "src/scss/components/_breadcrumbs.scss",
    "content": ".breadcrumb {\n  padding-left: 0;\n\n  @media (max-width: $width-small) {\n    margin-top: $scaledown-1;\n    margin-bottom: $scaledown-1;\n  }\n\n  li {\n    display: inline-block;\n    font-size: 13px;\n    line-height: 20px;\n    text-transform: capitalize;\n    color: $slate;\n  }\n\n  li + li::before {\n    padding: 0 6px;\n    color: $steel;\n    content: \"/\\00a0\";\n  }\n}\n\n.nav-sub .row {\n  align-items: center;\n}\n\n.breadcrumb .breadcrumb-item-user-interface {\n  display: none;\n}\n"
  },
  {
    "path": "src/scss/components/_buttons.scss",
    "content": ".btn-list {\n  font-size: 0;\n\n  > .btn + .btn {\n    margin-left: 12px;\n  }\n}\n\n.btn {\n  position: relative;\n  display: inline-block;\n  padding: 11px 30px;\n  font-size: 13px;\n  line-height: 16px;\n  text-align: center;\n  text-decoration: none;\n  vertical-align: middle;\n  cursor: pointer;\n  border-style: solid;\n  border-width: 1px;\n  border-radius: $border-radius;\n  box-sizing: border-box;\n  transition: color 0.3s, background-color 0.3s, border-color 0.3s;\n  user-select: none;\n\n  &:hover,\n  &:focus {\n    color: $sg-blue;\n    background-color: $sg-blue-10;\n    border-color: $sg-blue-80;\n  }\n\n  &:active,\n  &.is-active {\n    @include btn-shadow;\n  }\n\n  &.is-disabled {\n    color: $btn-disabled-color;\n    pointer-events: none;\n    cursor: default;\n    background-color: $btn-disabled-bg;\n    border-color: $btn-disabled-border;\n\n    &.btn-secondary,\n    &.btn-danger {\n      color: $btn-disabled-secondary-color;\n      background-color: $btn-disabled-secondary-bg;\n      border-color: $btn-disabled-secondary-border;\n    }\n  }\n\n  &.has-icon,\n  &.btn-with-icon,\n  &.has-badge {\n    padding-right: 18px;\n    padding-left: 18px;\n  }\n\n  &.is-loading {\n    pointer-events: none;\n  }\n\n  .sg-icon,\n  .sg-loader,\n  .badge {\n    display: block;\n    float: left;\n    margin-right: 6px;\n  }\n\n  .badge {\n    margin-bottom: 0;\n  }\n}\n\n.btn-primary {\n  color: $btn-primary-color;\n  background-color: $btn-primary-bg;\n  border-color: $btn-primary-border;\n\n  &:hover,\n  &:focus {\n    color: $btn-primary-color;\n    background-color: $btn-primary-bg-hover;\n  }\n\n  &:active,\n  &.is-active {\n    @include btn-shadow;\n  }\n\n  &.has-badge .badge {\n    color: $btn-primary-badge-color;\n    background-color: $btn-primary-badge-bg;\n  }\n}\n\n.btn-secondary {\n  color: $btn-secondary-color;\n  background-color: $btn-secondary-bg;\n  border-color: $btn-secondary-border;\n\n  &:hover,\n  &:focus {\n    color: $btn-secondary-color;\n    background-color: $btn-secondary-bg-hover;\n  }\n\n  &:active,\n  &.is-active {\n    @include btn-shadow;\n  }\n\n  &.has-badge .badge {\n    color: $btn-secondary-badge-color;\n    background-color: $btn-secondary-badge-bg;\n  }\n}\n\n.btn-danger {\n  color: $btn-danger-color;\n  background-color: $btn-danger-bg;\n  border-color: $btn-danger-border;\n\n  &:hover,\n  &:focus {\n    color: $btn-danger-color;\n    background-color: $btn-danger-bg-hover;\n  }\n\n  &:active,\n  &.is-active {\n    @include btn-shadow;\n    color: $btn-danger-color;\n  }\n\n  &.has-badge .badge {\n    color: $btn-danger-badge-color;\n    background-color: $btn-danger-badge-bg;\n  }\n}\n\n.btn-small {\n  padding: 6px 18px;\n}\n\n.btn-dropdown {\n  padding-right: 30px;\n  padding-left: 18px;\n\n  &::before {\n    @include icon-font-base;\n    position: absolute;\n    top: 12px;\n    right: 13px;\n    color: inherit;\n    content: $icon-caret;\n  }\n\n  &.btn-small {\n    padding-right: 30px;\n    padding-left: 20px;\n\n    &::before {\n      top: 7px;\n      right: 10px;\n    }\n\n    &.btn-dropdown-gear {\n      padding: 0 15px 0 10px;\n    }\n\n    &.btn-dropdown-gear::before {\n      top: 3px;\n      right: 1px;\n    }\n  }\n}\n\n.btn-dropdown-gear {\n  border: 0;\n\n  &.is-active > .sg-icon {\n    transform: rotate(135deg);\n  }\n\n  &::before {\n    top: 14px;\n    font-size: 16px;\n    color: $btn-gear-color;\n  }\n\n  &.btn-primary::before,\n  &.btn-primary > .sg-icon {\n    color: $btn-gear-primary-color;\n  }\n\n  > .sg-icon {\n    display: block;\n    font-size: 18px;\n    color: $btn-gear-color;\n    transition: transform 0.5s;\n  }\n}\n\n.btn-on-dark.btn-secondary {\n  color: $btn-dark-color;\n  background-color: $btn-dark-bg;\n  border-color: $btn-dark-border;\n\n  &:hover,\n  &:focus {\n    background-color: $btn-dark-bg-hover;\n    border-color: $btn-dark-color;\n  }\n\n  &.is-disabled {\n    color: $btn-disabled-secondary-color;\n    background-color: $btn-dark-bg;\n    border-color: $btn-disabled-secondary-border;\n\n    &:hover,\n    &:focus {\n      background-color: inherit;\n    }\n  }\n\n  &.has-badge .badge {\n    color: $btn-dark-badge-color;\n    background-color: $btn-dark-badge-bg;\n  }\n}\n\n.btn-group {\n  display: inline-block;\n\n  > .btn-group-item {\n    float: left;\n    padding-right: 18px;\n    padding-left: 18px;\n    margin: 0;\n    color: $btn-group-color;\n    background-color: $btn-group-bg;\n    border-color: $btn-group-border;\n\n    &:hover,\n    &:focus {\n      background-color: $btn-group-bg-hover;\n    }\n\n    &:active {\n      @include btn-shadow;\n    }\n\n    &:first-child {\n      border-top-right-radius: 0;\n      border-bottom-right-radius: 0;\n    }\n\n    &:last-child {\n      margin-left: -1px;\n      border-bottom-right-radius: 0;\n      border-top-left-radius: 0;\n    }\n\n    &:not(:first-child):not(:last-child) {\n      margin-left: -1px;\n      border-radius: 0;\n    }\n\n    &.is-active {\n      color: $btn-group-color-active;\n      background-color: $btn-group-bg-active;\n      border-color: $btn-group-border-active;\n    }\n  }\n}\n\n.btn-group-stacked {\n  .btn-group-item {\n    display: block;\n    width: 100%;\n    margin: 10px 0;\n  }\n}\n\n.btn-selectable {\n  padding: 18px;\n  color: $btn-selectable-color;\n  text-align: left;\n  border-color: $btn-selectable-border;\n\n  &:hover {\n    border-color: $btn-selectable-border-hover;\n  }\n\n  &.is-active {\n    border-color: $btn-selectable-border-active;\n  }\n\n  &.has-icon,\n  &.btn-with-icon {\n    .sg-icon,\n    img {\n      position: absolute;\n      top: 50%;\n      left: 51px;\n      width: 25px;\n      height: 25px;\n      margin-top: -13px;\n      font-size: 25px;\n    }\n\n    .input-checkbox-label,\n    .input-radio-label,\n    .btn-content {\n      margin-left: 76px;\n    }\n  }\n\n  .input-checkbox-label,\n  .input-radio-label,\n  .btn-content {\n    margin-left: 33px;\n  }\n\n  .input-checkbox-label,\n  .input-radio-label {\n    position: static;\n    font-weight: bold;\n    color: $btn-selectable-color;\n\n    &::before {\n      position: absolute;\n      top: 50%;\n      left: 18px;\n      margin-top: -8px;\n      margin-right: 0;\n      margin-left: 0;\n    }\n  }\n\n  [type=\"checkbox\"]:checked + .input-checkbox-label::after,\n  [type=\"radio\"]:checked + .input-radio-label::after {\n    position: absolute;\n    top: 50%;\n    left: 23px;\n    margin-top: -3px;\n    margin-left: 0;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_cards.scss",
    "content": ".card {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  padding: 60px 30px;\n  background-color: $white;\n  border: 1px solid $sg-blue-10;\n  border-radius: $border-radius;\n  box-shadow: 8px 10px 0 0 rgba($sg-blue, 0.1);\n\n  h2,\n  p,\n  .card-icon {\n    flex-basis: 100%;\n  }\n\n  // bump icon font-size if placed inline w/ title\n  h2 .sg-icon {\n    margin-right: 6px;\n    font-size: 27px;\n    vertical-align: text-bottom;\n  }\n\n  p {\n    margin-bottom: 20px;\n  }\n\n  &__inner {\n    flex: 1 1 auto;\n  }\n\n  &__button {\n    flex: 1 1 100%;\n    align-self: flex-end;\n  }\n\n\n  &--glossary {\n    padding: $scaleup-4;\n  }\n\n  &__feedback {\n    margin-top: $scaleup-7;\n    padding: $scaleup-3;\n\n    .card__title {\n      margin-left: 0;\n      display: block;\n    }\n\n    p {\n      margin: 0;\n    }\n  }\n\n  &:hover {\n    .actions .sg-icon-ellipsis {\n      opacity: 0;\n    }\n\n    .action-icons {\n      opacity: 1;\n    }\n  }\n\n  &.is-thin {\n    padding: 20px;\n  }\n\n  &.is-inline {\n    justify-content: space-between;\n\n    .card-title {\n      flex-basis: auto;\n    }\n  }\n\n  &.is-centered {\n    justify-content: center;\n    text-align: center;\n  }\n\n  // height should be set inline, too difficult to determine one w/ dynamic content\n  &.is-fixed-height {\n    align-items: center;\n  }\n\n  &.is-split {\n    padding: 30px 0;\n\n    h2,\n    h3,\n    p {\n      padding: 0 30px;\n    }\n\n    .split-content {\n      width: 100%;\n      padding-top: 30px;\n      border-top: 1px solid $slate-10;\n    }\n\n    .split-content .details {\n      display: flex;\n      justify-content: space-between;\n      margin-bottom: 9px;\n    }\n\n    .split-content hr,\n    .split-content .input-range-wrap {\n      margin-right: 30px;\n      margin-left: 30px;\n    }\n  }\n\n  &.is-module {\n    align-items: center;\n    width: 100px;\n    height: 100px;\n    padding: 0;\n    cursor: move;\n    transition: border-color 0.3s;\n\n    &:hover {\n      border-color: $slate-20;\n    }\n\n    p {\n      margin-bottom: 0;\n      font-weight: 400;\n    }\n\n    .sg-icon {\n      display: block;\n      padding-bottom: 9px;\n      margin-right: 0;\n      font-size: 20px;\n      color: $slate-60;\n    }\n  }\n\n  .card-icon {\n    margin-bottom: 20px;\n    font-size: 40px;\n  }\n\n  .card-title {\n    margin-bottom: 0;\n    font-size: 20px;\n    line-height: 30px;\n  }\n\n  .card__link {\n    line-height: 28px;\n  }\n\n  .badge {\n    position: absolute;\n    top: 27px;\n  }\n\n  .card-unsub-prefs {\n    position: absolute;\n    top: 20px;\n    left: 0;\n    width: 100%;\n    font-size: 10px;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n\n    .sg-icon-check-circle {\n      color: $mantis;\n      vertical-align: sub;\n    }\n  }\n\n  .card-unsubs strong {\n    margin-right: 6px;\n  }\n\n  .card-id,\n  .actions,\n  .action-icons {\n    position: absolute;\n  }\n\n  .card-id {\n    bottom: 20px;\n    left: 20px;\n    margin-bottom: 0;\n  }\n\n  .actions {\n    right: 20px;\n    bottom: 20px;\n    text-align: right;\n  }\n\n  .action-icons {\n    top: 0;\n    right: 0;\n    width: 170px;\n    opacity: 0;\n  }\n\n  .action-icons,\n  .sg-icon-ellipsis {\n    transition: opacity 0.3s;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_center-modals.scss",
    "content": "// TODO: separated from _modals.scss for scoping reasons in mako\n// TODO: re-join with _modals.scss as soon as mako team can refactor the .center-modal class\n\n.center-modal {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  z-index: 999;\n  width: $center-modal-width;\n  padding: 60px;\n  margin-bottom: 45px;\n  margin-left: $center-modal-position;\n  pointer-events: none;\n  background-color: $center-modal-bg;\n  border-radius: $border-radius;\n  outline: none;\n  opacity: 0;\n  transition: top 0.3s, opacity 0.3s;\n\n  &.is-visible {\n    top: 100px;\n    pointer-events: all;\n    opacity: 1;\n  }\n\n  &.is-large {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 90%;\n    height: calc(90% - 60px);\n    max-height: 900px;\n    min-height: 530px;\n    padding: 0;\n    margin: 5%;\n    overflow: hidden;\n\n    &.has-padding {\n      padding: 20px;\n    }\n\n    .sg-icon-x {\n      top: 20px;\n    }\n  }\n\n  .modal-inner-scroll {\n    // removes height of title and footer buttons\n    height: calc(100% - 98px);\n    overflow: scroll;\n    border-radius: $border-radius;\n  }\n\n  .modal-footer {\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    width: 100%;\n    padding: 20px;\n    text-align: right;\n    background-color: $center-modal-bg;\n  }\n\n  .accordion-wrapper {\n    border: 0;\n  }\n\n  .accordion-content {\n    padding-right: 10px;\n    padding-left: 10px;\n    background-color: inherit;\n  }\n\n  .tab-wrapper {\n    padding-left: 30px;\n  }\n\n  .tab-panel {\n    display: none;\n    height: 100%;\n    padding: 30px;\n    overflow: scroll;\n\n    &.is-visible {\n      display: block;\n    }\n  }\n\n  .tab-wrapper ~ .tab-panel {\n    height: calc(100% - 60px);\n  }\n\n  .tab-panel img {\n    max-width: 100%;\n  }\n\n  .alert {\n    margin-bottom: 15px;\n  }\n\n  .alert .sg-icon-x {\n    top: 50%;\n  }\n\n  .sg-icon-x {\n    position: absolute;\n    top: 30px;\n    right: 30px;\n    font-size: 20px;\n    cursor: pointer;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_checkboxes-radios.scss",
    "content": ".input-checkbox-wrap,\n.input-radio-wrap {\n  margin-bottom: 20px;\n\n  .input-info {\n    display: block;\n    margin-bottom: 0;\n    margin-left: 21px;\n  }\n}\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  position: absolute;\n  margin: 0;\n  opacity: 0;\n\n  &:checked + .input-checkbox-label::before,\n  &:checked + .input-radio-label::before {\n    background-color: $sg-blue;\n    border-color: $sg-blue;\n  }\n\n  &:checked + .input-checkbox-label::after,\n  &:checked + .input-radio-label::after {\n    position: absolute;\n  }\n\n  &:checked + .input-checkbox-label::after {\n    @include icon-font-base;\n    top: 3px;\n    left: 3px;\n    font-size: 9px;\n    color: $white;\n    content: $icon-check;\n  }\n\n  &:checked + .input-radio-label::after {\n    top: 5px;\n    left: 5px;\n    width: 5px;\n    height: 5px;\n    background-color: $white;\n    border-radius: 5px;\n    content: \"\";\n  }\n\n  &:disabled + .input-checkbox-label,\n  &:disabled + .input-radio-label {\n    color: $steel;\n  }\n\n  &:disabled + .input-checkbox-label::before,\n  &:disabled + .input-radio-label::before {\n    background-color: $steel;\n    border-color: $steel;\n  }\n\n  &:disabled:not(:checked) + .input-checkbox-label::before,\n  &:disabled:not(:checked) + .input-radio-label::before {\n    background-color: $white;\n  }\n\n  &:focus + .input-checkbox-label::before,\n  &:focus + .input-radio-label::before {\n    border-color: $sg-blue;\n  }\n}\n\n.input-checkbox-label,\n.input-radio-label {\n  position: relative;\n  display: inline-block;\n  margin-left: 21px;\n  font-size: 13px;\n  line-height: 18px;\n  color: $slate;\n  cursor: pointer;\n\n  &::before {\n    display: inline-block;\n    width: 15px;\n    height: 15px;\n    margin-right: 6px;\n    text-indent: 0;\n    vertical-align: top;\n    background: $white;\n    border: 1px solid $slate-20;\n    content: \"\";\n  }\n\n  &::before,\n  &::after {\n    margin-left: -21px;\n  }\n\n  &:focus::before {\n    border-color: $sg-blue;\n  }\n}\n\n.input-checkbox-label {\n  &::before {\n    border-radius: $border-radius;\n  }\n}\n\n.input-radio-label {\n  &::before {\n    border-radius: 50%;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_confirmation-alerts.scss",
    "content": ".conf-alert {\n  @include dropdown-shadow;\n  width: 330px;\n  padding: 18px 30px;\n  background: $slate-02;\n  border: 1px solid $slate-10;\n}\n\n.sg-modal .conf-alert {\n  margin-top: -40px;\n  opacity: 0;\n  transition: margin-top 0.4s, opacity 0.4s;\n}\n\n.sg-modal.show .conf-alert,\n.sg-modal.is-visible .conf-alert {\n  margin-top: 0;\n  opacity: 1;\n}\n\n.conf-alert-header {\n  padding: 0;\n  margin: 0;\n  font-size: 13px;\n  font-weight: 600;\n  line-height: 18px;\n  color: $slate;\n}\n\n.conf-alert-header-with-icon {\n  position: relative;\n  padding-left: 20px;\n\n  i {\n    position: absolute;\n    top: 0;\n    left: -10px;\n  }\n}\n\n.conf-alert-body {\n  margin-top: 12px;\n}\n\n.conf-alert-text {\n  margin-bottom: 20px;\n  font-size: 12px;\n  line-height: 18px;\n  color: $slate;\n\n  &:last-child {\n    margin-bottom: 0;\n  }\n}\n\n.conf-alert-actions {\n  margin-top: 20px;\n  text-align: right;\n\n  .btn {\n    margin-left: 12px;\n\n    &:first-child {\n      margin-left: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_date-range.scss",
    "content": "// license: https://goo.gl/3WNzU\n// sass-lint:disable class-name-format, no-important, no-mergeable-selectors\n// linting properties disabled due to it being a modified 3rd party stylesheet\n\n.daterangepicker {\n  position: absolute;\n  top: 100px;\n  left: 20px;\n  width: 278px;\n  color: inherit;\n  background-color: $white;\n  border-radius: $border-radius;\n\n  &.dropdown-menu {\n    top: auto;\n    left: auto;\n    z-index: 3001;\n    display: none;\n    max-width: none;\n    padding: 0;\n    opacity: 1;\n    visibility: visible;\n  }\n\n  &.single {\n    .ranges,\n    .calendar {\n      float: none;\n    }\n  }\n\n  &.show-calendar {\n    .calendar {\n      display: block;\n    }\n  }\n\n  .calendar {\n    display: none;\n    max-width: 270px;\n\n    &.left {\n      border-right: 1px solid $slate-10;\n    }\n\n    &.single {\n      .calendar-table {\n        border: 0;\n      }\n    }\n\n    th,\n    td {\n      min-width: 30px;\n    }\n  }\n\n  .calendar-table {\n    background-color: $white;\n    border-radius: $border-radius;\n  }\n\n  table {\n    width: 100%;\n    margin: 0;\n    border-collapse: inherit;\n  }\n\n  thead tr:first-child {\n    height: 45px;\n  }\n\n  thead tr:last-child {\n    background-color: $slate-05;\n  }\n\n  td,\n  th {\n    width: 30px;\n    height: 30px;\n    font-size: 13px;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: middle;\n    border: 1px solid transparent;\n    border-radius: $border-radius;\n\n    &.prev,\n    &.next {\n      cursor: pointer;\n    }\n\n    &.available {\n      &:hover {\n        color: inherit;\n        border-color: transparent;\n\n        .sg-icon {\n          color: $sg-blue;\n        }\n      }\n    }\n\n    &.week {\n      font-size: 80%;\n      color: $slate-20;\n    }\n  }\n\n  td {\n    cursor: pointer;\n\n    &.off {\n      &,\n      &.in-range,\n      &.start-date,\n      &.end-date {\n        color: $slate-40;\n        background-color: $white;\n        border-color: transparent;\n      }\n    }\n\n    &.in-range {\n      color: $slate;\n      background-color: $sg-blue-10;\n      border-color: transparent;\n      border-radius: 0;\n    }\n\n    &.start-date {\n      border-radius: $border-radius 0 0 $border-radius;\n    }\n\n    &.end-date {\n      border-radius: 0 $border-radius $border-radius 0;\n    }\n\n    &.start-date.end-date {\n      border-radius: $border-radius;\n    }\n\n    &.active {\n      &,\n      &:hover {\n        color: $white;\n        background-color: $sg-blue;\n        border-color: transparent;\n      }\n    }\n  }\n\n  th {\n    font-size: 10px;\n    text-transform: uppercase;\n\n    &.prev .fa-chevron-left,\n    &.next .fa-chevron-right {\n      @include icon-font-base;\n      display: inline-block;\n\n      &::before {\n        content: $icon-caret;\n      }\n\n      &:hover {\n        color: $sg-blue;\n      }\n    }\n\n    &.prev .fa-chevron-left {\n      transform: rotate(90deg);\n    }\n\n    &.next .fa-chevron-right {\n      transform: rotate(-90deg);\n    }\n\n    &.month {\n      width: auto;\n      font-size: 13px;\n      font-weight: 600;\n    }\n\n  }\n\n  td,\n  option {\n    &.disabled {\n      color: $slate-40;\n      text-decoration: line-through;\n      cursor: not-allowed;\n    }\n  }\n\n  select {\n    &.monthselect,\n    &.yearselect {\n      height: auto;\n      padding: 1px;\n      margin: 0;\n      font-size: 12px;\n      cursor: default;\n    }\n\n    &.monthselect {\n      width: 56%;\n      margin-right: 2%;\n    }\n\n    &.yearselect {\n      width: 40%;\n    }\n\n    &.hourselect,\n    &.minuteselect,\n    &.secondselect,\n    &.ampmselect {\n      width: 50px;\n      margin-bottom: 0;\n    }\n  }\n\n  .daterangepicker_input {\n    position: relative;\n    display: none;\n\n    i {\n      position: absolute;\n      top: 8px;\n      left: 8px;\n    }\n  }\n\n  &.rtl {\n    .input-mini {\n      padding-right: 28px;\n      padding-left: 6px;\n    }\n\n    .daterangepicker_input i {\n      right: 8px;\n      left: auto;\n    }\n  }\n\n  .calendar-time {\n    position: relative;\n    padding-left: 28px;\n    margin: 5px auto;\n    line-height: 30px;\n    text-align: center;\n\n    select {\n      &.disabled {\n        color: $steel;\n        cursor: not-allowed;\n      }\n    }\n  }\n}\n\n.ranges {\n  float: none;\n  text-align: center;\n  border-bottom: 1px solid $slate-10;\n\n  ul {\n    width: 100%;\n    padding: 0;\n    margin: 0 auto;\n    list-style: none;\n  }\n\n  li {\n    display: inline-block;\n    width: 33.3333%;\n    padding: 12px;\n    font-size: 13px;\n    color: $sg-blue-80;\n    cursor: pointer;\n\n    &:hover {\n      color: $sg-blue;\n    }\n\n    &.active {\n      font-weight: 400;\n      color: $sg-blue;\n    }\n  }\n}\n\n.range_inputs {\n  display: none;\n}\n\n@media (min-width: 564px) {\n  .daterangepicker {\n    width: auto;\n\n    &.single {\n      .ranges {\n        ul {\n          width: 100%;\n        }\n      }\n\n      .calendar.left {\n        clear: none;\n      }\n\n      &.ltr {\n        .calendar {\n          float: left;\n        }\n      }\n\n      &.rtl {\n        .calendar {\n          float: right;\n        }\n      }\n    }\n\n    &.ltr {\n      text-align: left;\n      direction: ltr;\n\n      .calendar {\n        &.left {\n          margin-right: 0;\n          clear: left;\n\n          .calendar-table {\n            border-right: 0;\n            border-top-right-radius: 0;\n            border-bottom-right-radius: 0;\n          }\n        }\n\n        &.right {\n          margin-left: 0;\n\n          .calendar-table {\n            border-left: 0;\n            border-bottom-left-radius: 0;\n            border-top-left-radius: 0;\n          }\n        }\n      }\n\n      .left .daterangepicker_input {\n        padding-right: 12px;\n      }\n\n      .calendar {\n        float: left;\n      }\n    }\n\n    &.rtl {\n      text-align: right;\n      direction: rtl;\n\n      .calendar {\n        &.left {\n          margin-left: 0;\n          clear: right;\n\n          .calendar-table {\n            border-left: 0;\n            border-bottom-left-radius: 0;\n            border-top-left-radius: 0;\n          }\n        }\n\n        &.right {\n          margin-right: 0;\n\n          .calendar-table {\n            border-right: 0;\n            border-top-right-radius: 0;\n            border-bottom-right-radius: 0;\n          }\n        }\n      }\n\n      .left .daterangepicker_input {\n        padding-left: 12px;\n      }\n\n      .calendar.left .calendar-table {\n        padding-left: 12px;\n      }\n\n      .ranges,\n      .calendar {\n        float: right;\n        text-align: right;\n      }\n    }\n  }\n}\n\n@media (min-width: 730px) {\n  .daterangepicker {\n    .ranges {\n      width: auto;\n    }\n\n    .calendar.left {\n      clear: none !important;\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_dropdowns.scss",
    "content": ".dropdown {\n  position: relative;\n  cursor: pointer;\n\n  &.has-icon,\n  &.btn-with-icon,\n  &.has-badge {\n    padding-right: 30px;\n  }\n\n  &.is-active .dropdown-menu {\n    top: 100%;\n    z-index: $dropdown-menu-z-index;\n    opacity: 1;\n    visibility: visible;\n  }\n}\n\n.dropdown-menu {\n  @include dropdown-shadow;\n  position: absolute;\n  top: 50%;\n  left: 0;\n  display: inline-block; // only needed to override client css\n  min-width: 180px;\n  padding: 10px 0;\n  margin: 1px -1px;\n  overflow: hidden;\n  cursor: default;\n  background: $slate-02;\n  border: 1px solid $slate-10;\n  border-radius: $border-radius;\n  opacity: 0;\n  visibility: hidden;\n  transition: top 0.3s, opacity 0.3s;\n}\n\n// used by tiara in the account menu and switch subuser banner\n.dropdown-menu-account {\n  width: 175px;\n  margin-right: 2px;\n  margin-left: 2px;\n}\n\n.dropdown-menu-right-aligned {\n  right: 0;\n  left: inherit;\n}\n\n.dropdown-link {\n  display: block;\n  padding: 10px 18px 7px;\n  font-size: 13px;\n  line-height: 18px;\n  color: $slate-80;\n  text-align: left;\n  text-decoration: none;\n  white-space: nowrap;\n  cursor: pointer;\n\n  &:hover {\n    color: $slate;\n    background: $slate-10;\n  }\n\n  .sg-icon {\n    margin-right: 12px;\n  }\n}\n\n.dropdown-text {\n  display: block;\n  padding: 10px 30px 7px;\n  font-size: 13px;\n  line-height: 18px;\n  text-align: left;\n  white-space: nowrap;\n}\n\n.dropdown-item {\n  margin: 5px 25px;\n}\n\n.dropdown-input {\n  width: 100%;\n  padding: 3px 5px;\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": "src/scss/components/_dropzones.scss",
    "content": ".dropzone {\n  height: 200px;\n  margin-bottom: 20px;\n  background-color: $dropzone-bg;\n  border: 1px dashed $dropzone-border;\n  border-radius: $border-radius;\n  transition: background-color 0.3s, border-color 0.3s;\n\n  &.is-active {\n    background-color: $dropzone-bg-active;\n    border-color: $dropzone-border-active;\n  }\n\n  &.is-hovered,\n  &.is-editor {\n    background-color: $dropzone-hovered-bg;\n    border-color: $dropzone-hovered-border;\n  }\n\n  &.is-large {\n    height: 400px;\n  }\n\n  &.has-inline-alert {\n    display: flex;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_email-cards.scss",
    "content": ".email-card-wrap {\n  position: relative;\n  margin-bottom: 30px;\n}\n\n// modifiers for .is-editable\n.email-card-wrap.is-editable {\n  // show for all children except the 2nd to last (.email-card-add should be last)\n  &:not(:nth-last-child(2)) {\n    @include email-card-connector();\n  }\n}\n\n// modifiers for .is-live\n.email-card-wrap.is-live {\n  // show for all children except the last (.email-card-add should be hidden for .is-live)\n  &:not(:last-child) {\n    @include email-card-connector();\n  }\n\n  .email-card-details a {\n    color: $slate;\n    pointer-events: none;\n  }\n}\n\n// modifiers for is-paused\n.email-card-wrap.is-paused {\n  .email-card-send-time .btn {\n    border-top-color: $burnt-orange;\n  }\n}\n\n.email-card-send-time {\n  @include email-card-connector;\n  position: relative;\n  display: flex;\n  justify-content: center;\n  margin-bottom: 30px;\n}\n\n.email-card-send-time.has-value .btn {\n  width: 400px;\n  padding: 20px 0;\n  font-weight: 600;\n  color: $slate;\n  background-color: $white;\n  border: 1px solid $slate-20;\n  border-top: 2px solid $sg-blue;\n\n  &:hover::after {\n    @include icon-font-base;\n    position: absolute;\n    top: 50%;\n    right: 20px;\n    margin-top: -8px;\n    pointer-events: none;\n    content: $icon-pencil;\n  }\n}\n\n.email-card {\n  position: relative;\n  display: flex;\n  align-items: center;\n  padding-left: 68px;\n  border: 1px solid $slate-20;\n  border-radius: $border-radius;\n\n  // hide ellipsis and show action icons on hover\n  &:hover {\n    .sg-icon-ellipsis {\n      opacity: 0;\n    }\n\n    .action-icons {\n      opacity: 1;\n    }\n  }\n\n  p,\n  td {\n    margin-bottom: 0;\n    font-size: 13px;\n    line-height: 20px;\n  }\n}\n\n.email-card-wrap + .email-card-add {\n  display: flex;\n  justify-content: center;\n}\n\n.email-card-stats {\n  display: flex;\n  justify-content: space-around;\n  padding: 30px;\n  border: 1px solid $slate-20;\n  border-bottom: 0;\n  border-radius: $border-radius $border-radius 0 0;\n\n  .stat,\n  .label {\n    margin-bottom: 0;\n    text-align: center;\n  }\n\n  .stat {\n    margin-bottom: 0;\n    font-size: 20px;\n    line-height: 30px;\n  }\n\n  .delivered {\n    color: $stats-delivered;\n  }\n\n  .opens {\n    color: $stats-opens;\n  }\n\n  .unique-opens {\n    color: $stats-unique-opens;\n  }\n\n  .clicks {\n    color: $stats-clicks;\n  }\n\n  .unique-clicks {\n    color: $stats-unique-clicks;\n  }\n\n  .unsubscribes {\n    color: $stats-unsubscribes;\n  }\n\n  .spam-reports {\n    color: $stats-spam-reports;\n  }\n\n  .label {\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 15px;\n    text-transform: uppercase;\n  }\n}\n\n.email-card-stats + .email-card {\n  border-radius: 0 0 $border-radius $border-radius;\n}\n\n// absolute positioning to keep container/border 100% height\n.email-card-count {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 68px;\n  border-right: 1px solid $slate-20;\n\n  p {\n    font-weight: 600;\n    text-align: center;\n    text-transform: uppercase;\n    transform: rotate(270deg);\n  }\n}\n\n.email-card-content {\n  width: 166px;\n  padding: 18px;\n\n  img {\n    display: block;\n    max-width: 100%;\n    border: 1px solid $slate-40;\n    border-radius: $border-radius;\n  }\n\n  .btn {\n    width: 130px;\n    padding: 28px 12px;\n  }\n}\n\n.email-card-details {\n  flex-grow: 1;\n  padding: 18px 0;\n\n  table {\n    width: 100%;\n  }\n\n  td {\n    padding-bottom: 2px;\n  }\n\n  .label {\n    width: 120px;\n    font-weight: 600;\n  }\n}\n\n.email-row-actions {\n  position: relative;\n  align-self: center;\n  min-width: 160px;\n  padding-right: 18px;\n  margin-left: auto;\n  text-align: right;\n\n  .sg-icon {\n    vertical-align: middle;\n    transition: all 0.3s;\n  }\n\n  .sg-icon-ellipsis {\n    font-size: 20px;\n    opacity: 1;\n  }\n\n  .action-icons {\n    position: absolute;\n    top: 50%;\n    right: 12px;\n    display: inline-flex;\n    margin-top: -10px;\n    opacity: 0;\n    transition: opacity 0.3s;\n\n    span {\n      display: inline-block;\n      margin: 0 3px;\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_filters.scss",
    "content": ".filter-wrap {\n  margin-bottom: 30px;\n  border: 1px solid $slate-10;\n}\n\n.filter-header {\n  display: flex;\n  justify-content: space-between;\n  padding: 6px 12px;\n  background-color: $slate-05;\n\n  p {\n    margin-bottom: 0;\n  }\n\n  a {\n    border-bottom: 1px solid $sg-blue;\n  }\n\n  .filter-title,\n  .filter-search-toggle {\n    font-size: 13px;\n    line-height: 30px;\n  }\n\n  .filter-title {\n    font-weight: 600;\n  }\n\n  .filter-search-toggle {\n    line-height: 30px;\n  }\n}\n\n.filter-list {\n  padding: 12px;\n  background-color: $white;\n  border-top: 1px solid $slate-10;\n\n  .row {\n    position: relative;\n    min-height: 40px;\n    margin-bottom: 20px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n\n    &:hover .sg-icon-x {\n      display: block;\n    }\n  }\n\n  .input-text-wrap,\n  .input-select-wrap {\n    margin-bottom: 0;\n  }\n\n  .filter-remove {\n    line-height: 40px;\n    text-align: center;\n  }\n\n  .sg-icon-x {\n    position: absolute;\n    top: 15px;\n    right: -6px;\n    display: none;\n    font-size: 13px;\n    color: $ron-burgundy;\n    cursor: pointer;\n  }\n}\n\n.filter-search-basic {\n  padding-top: 10px;\n}\n\n.filter-buttons {\n  display: flex;\n  justify-content: space-between;\n}\n"
  },
  {
    "path": "src/scss/components/_horizontal-rules.scss",
    "content": "hr {\n  margin: $scale-base-up-06 0;\n  border: 1px solid $slate-20;\n  border-bottom: 0;\n\n  &.is-thin {\n    margin: $scale-base 0;\n  }\n\n  &.has-label {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    height: 1px;\n    overflow: visible;\n\n    &::after {\n      padding: 0 12px;\n      font-size: 13px;\n      line-height: 20px;\n      text-align: center;\n      background-color: $white;\n      content: attr(data-label);\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_loader.scss",
    "content": "@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes fadeInOut {\n  0%, \n  80%, \n  100% {\n    opacity: 0;\n  }\n\n  40% {\n    opacity: 1;\n  }\n}\n\n.sg-loader {\n  display: block;\n  width: 30px;\n  height: 30px;\n\n  &.is-centered {\n    position: relative;\n    top: 50%;\n    margin: 0 auto;\n    transform: translateY(-50%);\n  }\n\n  .logo-square {\n    opacity: 0;\n    transform: translateZ(0);\n    animation: fadeIn 1s infinite alternate;\n    will-change: opacity;\n  }\n\n  .bottom-left {\n    transform: translate(0, 20px);\n    animation-delay: 0s;\n  }\n\n  .bottom-left,\n  .top-right {\n    fill: $sg-blue;\n  }\n\n  .bottom-middle {\n    transform: translate(10px, 20px);\n  }\n\n  .middle-left {\n    transform: translate(0, 10px);\n  }\n\n  .bottom-middle,\n  .middle-left {\n    animation-delay: 0.2s;\n    fill: $logo-accent-light;\n  }\n\n  .middle {\n    transform: translate(10px, 10px);\n    animation-delay: 0.4s;\n    fill: $logo-accent-dark;\n  }\n\n  .top-middle {\n    transform: translate(10px, 0);\n  }\n\n  .middle-right {\n    transform: translate(20px, 10px);\n  }\n\n  .top-middle,\n  .middle-right {\n    animation-delay: 0.6s;\n    fill: $logo-accent-medium;\n  }\n\n  .top-right {\n    transform: translate(20px, 0);\n    animation-delay: 0.8s;\n  }\n\n  &.is-large {\n    width: 60px;\n    height: 60px;\n\n    .bottom-left {\n      transform: translate(0, 40px);\n    }\n\n    .bottom-middle {\n      transform: translate(20px, 40px);\n    }\n\n    .middle-left {\n      transform: translate(0, 20px);\n    }\n\n    .middle {\n      transform: translate(20px, 20px);\n    }\n\n    .top-middle {\n      transform: translate(20px, 0);\n    }\n\n    .middle-right {\n      transform: translate(40px, 20px);\n    }\n\n    .top-right {\n      transform: translate(40px, 0);\n    }\n  }\n\n  &.is-small {\n    width: 15px;\n    height: 15px;\n\n    .bottom-left {\n      transform: translate(0, 10px);\n    }\n\n    .bottom-middle {\n      transform: translate(5px, 10px);\n    }\n\n    .middle-left {\n      transform: translate(0, 5px);\n    }\n\n    .middle {\n      transform: translate(5px, 5px);\n    }\n\n    .top-middle {\n      transform: translate(5px, 0);\n    }\n\n    .middle-right {\n      transform: translate(10px, 5px);\n    }\n\n    .top-right {\n      transform: translate(10px, 0);\n    }\n  }\n\n  &.loader-on-dark {\n    .bottom-left,\n    .top-right {\n      fill: $loader-dark-solid;\n    }\n\n    .bottom-middle,\n    .middle-left {\n      fill: $loader-dark-light;\n    }\n\n    .middle-right,\n    .top-middle {\n      fill: $loader-dark-medium;\n    }\n\n    .middle {\n      fill: $loader-dark-medium-solid;\n    }\n  }\n}\n\n.fragment-loader {\n  width: 30px;\n  height: 10px;\n\n  .fragment-square {\n    opacity: 0;\n    transform: translateZ(0);\n    animation: fadeInOut 1.6s infinite both;\n    will-change: opacity;\n    fill: $slate-40;\n  }\n\n  .left {\n    transform: translate(0, 0);\n    animation-delay: 0;\n  }\n\n  .middle {\n    transform: translate(10px, 0);\n    animation-delay: 0.2s;\n  }\n\n  .right {\n    transform: translate(20px, 0);\n    animation-delay: 0.4s;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_meters.scss",
    "content": ".meter-container {\n  margin-top: 13px;\n  line-height: 11px;\n}\n\n.meter-title {\n  font-size: 10px;\n  letter-spacing: 1px;\n  color: $slate-80;\n  text-transform: uppercase;\n}\n\n.meter-value {\n  font-size: 10px;\n  font-weight: 600;\n  letter-spacing: 1px;\n  color: $slate-80;\n  white-space: nowrap;\n}\n\n.meter-bar {\n  width: 100%;\n  height: 10px;\n  margin-top: 3px;\n  background: transparent;\n  border: 1px solid $slate-10;\n  border-radius: 4px;\n}\n\n.meter-bar-fill {\n  height: 8px;\n  border-radius: 4px;\n\n  &.is-below-25 {\n    background: $ron-burgundy;\n  }\n\n  &.is-below-50 {\n    background: $carrot;\n  }\n\n  &.is-above-50 {\n    background: $mantis;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_modals.scss",
    "content": ".modal-title {\n  float: left;\n  margin-top: 7px;\n  font-size: 20px;\n  line-height: 30px;\n  color: $slate;\n  text-transform: none;\n}\n\n.sg-modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $modal-z-index;\n  display: none;\n  word-break: normal;\n  background: $modal-bg;\n  opacity: 0;\n  transition: opacity 0.35s;\n\n  &.show,\n  &.is-visible {\n    display: block;\n    opacity: 1;\n  }\n}\n\n.modal-open {\n  overflow: scroll;\n}\n\n.sg-modal-content {\n  position: absolute;\n  top: 150px;\n  left: 50%;\n\n  &.conf-alert {\n    margin-left: -165px;\n  }\n}\n\n.side-modal {\n  position: fixed;\n  top: 0;\n  right: -720px;\n  z-index: 999;\n  width: 720px;\n  height: 100%;\n  padding: 45px 105px 90px;\n  overflow: scroll;\n  background-color: $white;\n  box-shadow: $side-modal-shadow;\n  transition: right 0.5s;\n\n  &.is-visible {\n    right: 0;\n  }\n\n  h2,\n  p,\n  fieldset,\n  .alert,\n  .input-text-wrap,\n  .input-select-wrap {\n    margin-bottom: 30px;\n  }\n\n  fieldset:last-of-type {\n    margin-bottom: 45px;\n  }\n\n  fieldset *:last-child {\n    margin-bottom: 0;\n  }\n\n  .alert {\n    margin: 0 -105px;\n\n    p {\n      margin-bottom: 0;\n    }\n  }\n\n  .tab-wrapper.is-ab-testing {\n    padding-bottom: 1px;\n    margin: 0 -105px 20px;\n    border-top: 1px solid $slate-10;\n  }\n\n  .btn-list {\n    display: flex;\n    justify-content: flex-end;\n  }\n}\n\n.modal-mask,\n.side-modal-mask {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 998;\n  pointer-events: none;\n  background: $modal-bg;\n  opacity: 0;\n  transition: opacity 0.5s;\n\n  &.is-visible {\n    pointer-events: all;\n    opacity: 1;\n  }\n}\n\nbody {\n  &.modal-open {\n    overflow: hidden;\n    overflow-y: scroll;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_numbered-steps.scss",
    "content": ".numbered-steps {\n  // using child selector so nested <li>'s within this component doesn't inherit its styles\n  > li {\n    position: relative;\n    padding-left: 40px;\n    margin-bottom: 30px;\n\n    &::before {\n      position: absolute;\n      left: 0;\n      display: block;\n      width: 30px;\n      height: 30px;\n      font-size: 13px;\n      line-height: 30px;\n      text-align: center;\n      background-color: $white;\n      border: 1px solid $slate-20;\n      border-radius: 50%;\n    }\n\n    &:nth-child(1)::before {\n      content: \"1\";\n    }\n\n    &:nth-child(2)::before {\n      content: \"2\";\n    }\n\n    &:nth-child(3)::before {\n      content: \"3\";\n    }\n\n    &:nth-child(4)::before {\n      content: \"4\";\n    }\n\n    &:nth-child(5)::before {\n      content: \"5\";\n    }\n\n    &:nth-child(6)::before {\n      content: \"6\";\n    }\n\n    &:nth-child(7)::before {\n      content: \"7\";\n    }\n\n    &:nth-child(8)::before {\n      content: \"8\";\n    }\n\n    &:nth-child(9)::before {\n      content: \"9\";\n    }\n  }\n\n  h3 {\n    margin-bottom: 6px;\n  }\n\n  p {\n    margin-bottom: 6px;\n    font-size: 13px;\n    line-height: 18px;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_pagination.scss",
    "content": ".pagination {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  clear: both;\n  text-align: center;\n}\n\n.pagination-prev {\n  float: left;\n}\n\n.pagination-next {\n  float: right;\n}\n\n.pagination-links {\n  display: inline-block;\n  margin-top: 10px;\n}\n\n.pagination-link {\n  padding: 8px;\n  font-size: 13px;\n  color: $slate;\n  text-decoration: none;\n  cursor: pointer;\n\n  &:hover,\n  &.is-active {\n    color: $sg-blue;\n  }\n\n  &.is-active {\n    font-weight: 600;\n  }\n}\n\n.pagination-ellipses {\n  padding: 10px;\n}\n"
  },
  {
    "path": "src/scss/components/_progress-stages.scss",
    "content": ".progress-container {\n  min-height: 40px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.progress-stages {\n  @include clearfix;\n  position: relative;\n  padding: 0;\n  margin-left: 30px;\n  list-style: none;\n\n  label {\n    position: absolute;\n    bottom: -25px;\n    left: -33px;\n    width: 80px;\n    font-size: 12px;\n    text-align: center;\n  }\n\n  li {\n    position: relative;\n    float: left;\n    width: 16px;\n    height: 16px;\n    margin-left: 80px;\n    color: $slate-80;\n    background-color: transparent;\n    border: 1px solid $slate-80;\n    border-radius: 50%;\n    opacity: 0.6;\n\n    &::after {\n      display: block;\n      width: 75px;\n      margin-top: 6px;\n      margin-left: 17px;\n      border-bottom: 1px solid $slate-80;\n      content: \"\";\n    }\n\n    &::before {\n      position: absolute;\n      width: 14px;\n      padding-top: 3px;\n      font-size: 9px;\n      line-height: 9px;\n      text-align: center;\n    }\n\n    &:nth-child(1)::before {\n      content: \"1\";\n    }\n\n    &:nth-child(2)::before {\n      content: \"2\";\n    }\n\n    &:nth-child(3)::before {\n      content: \"3\";\n    }\n\n    &:nth-child(4)::before {\n      content: \"4\";\n    }\n\n    &:nth-child(5)::before {\n      content: \"5\";\n    }\n\n    &:nth-child(6)::before {\n      content: \"6\";\n    }\n\n    &:nth-child(7)::before {\n      content: \"7\";\n    }\n\n    &:nth-child(8)::before {\n      content: \"8\";\n    }\n\n    &:nth-child(9)::before {\n      content: \"9\";\n    }\n\n    &:first-child {\n      margin-left: 5px;\n    }\n\n    &:last-child::after {\n      display: none;\n    }\n\n    &.is-selected,\n    &.is-done,\n    &.selected,\n    &.done {\n      background-color: $slate-80;\n      opacity: 1;\n    }\n\n    &.is-selected::before,\n    &.is-done::before,\n    &.selected::before,\n    &.done::before {\n      color: $white;\n    }\n\n    &.is-selected label,\n    &.selected label {\n      font-weight: 600;\n    }\n\n    &.is-done::before,\n    &.done::before {\n      font-family: \"styleguideicons\";\n      font-size: 6px;\n      content: $icon-check;\n      speak: none;\n    }\n  }\n}\n\n.progress-container.is-vertical,\n.progress-container.vertical {\n  .progress-stages {\n    margin-left: 0;\n  }\n\n  .progress-stages li {\n    float: none;\n    margin-bottom: 40px;\n    margin-left: 0;\n\n    &::after {\n      width: 0;\n      height: 36px;\n      margin-top: 17px;\n      margin-left: 6px;\n      border-bottom: 0;\n      border-left: 1px solid $slate-80;\n    }\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  label {\n    top: 2px;\n    left: 20px;\n    width: 120px;\n    line-height: 12px;\n    text-align: left;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_ranges.scss",
    "content": "// sass-lint:disable no-vendor-prefixes\n// linting disabled due to browser specific styles\n\n@mixin range-slider-thumb {\n  width: 15px;\n  height: 15px;\n  cursor: pointer;\n  background: $white;\n  border: 1px solid $slate-20;\n  border-radius: 50%;\n}\n\n@mixin range-slider-track {\n  width: 100%;\n  height: 6px;\n  margin: 0;\n  background-color: $sg-blue;\n  background-image: linear-gradient(90deg, $slate-20 100%, $sg-blue 100%);\n  background-repeat: no-repeat;\n  border-radius: 3px;\n  -webkit-appearance: none;\n}\n\n.input-range-wrap {\n  position: relative;\n  min-height: 12px;\n  margin-bottom: 20px;\n}\n\n[type=\"range\"] {\n  @include range-slider-track;\n\n  &::-webkit-slider-thumb {\n    @include range-slider-thumb;\n    display: block;\n    overflow: visible;\n    -webkit-appearance: none;\n  }\n\n  &::-moz-range-thumb {\n    @include range-slider-thumb;\n  }\n\n  &::-moz-range-progress {\n    height: 6px;\n    background-color: $sg-blue;\n  }\n\n  &::-ms-thumb {\n    @include range-slider-thumb;\n  }\n\n  &::-ms-fill-lower {\n    background-color: $sg-blue;\n  }\n\n  &::fill-lower {\n    background-color: $sg-blue;\n  }\n}\n\n.input-range-percent {\n  margin-top: 6px;\n  font-size: 12px;\n  text-align: center;\n}\n\n.input-multi-range-label {\n  position: relative;\n  display: inline-block;\n  width: 12px;\n  height: 12px;\n  overflow: hidden;\n  cursor: pointer;\n\n  &::before {\n    display: inline-block;\n    width: 12px;\n    height: 12px;\n    text-indent: 0;\n    vertical-align: top;\n    background-color: $slate-20;\n    border: 1px solid $slate-20;\n    border-radius: 50%;\n    content: \"\";\n  }\n\n  &:focus::before {\n    border-color: $sg-blue;\n  }\n}\n\n.input-multi-range {\n  position: absolute;\n  top: 0;\n  z-index: 2;\n  display: inline-block;\n  height: 12px;\n\n  &:nth-child(1) {\n    left: 0;\n  }\n\n  &:nth-child(2) {\n    left: 50%;\n    margin-left: -6px;\n  }\n\n  &:nth-child(3) {\n    right: 0;\n    left: auto;\n  }\n\n  &.is-not-selected .input-multi-range-label::before {\n    background-color: $sg-blue;\n    border-color: $sg-blue;\n  }\n\n  &.is-selected + .is-not-selected .input-multi-range-label::before {\n    background-color: $slate-20;\n    border-color: $slate-20;\n  }\n\n  [type=\"radio\"]:checked + .input-multi-range-label::before {\n    background-color: $white;\n  }\n}\n\n.input-multi-range-track {\n  position: absolute;\n  top: 3px;\n  z-index: 1;\n  width: 100%;\n  height: 6px;\n  background: $slate-20;\n  border-radius: 3px;\n\n  .input-multi-range-fill {\n    width: 0;\n    height: 6px;\n    background-color: $sg-blue;\n    border-radius: 3px;\n  }\n}\n\n.input-range-small {\n\n  .input-multi-range {\n    height: 9px;\n  }\n\n  .input-multi-range-label,\n  .input-multi-range-label::before {\n    width: 9px;\n    height: 9px;\n  }\n\n  .input-multi-range-track,\n  .input-multi-range-fill {\n    top: 6px;\n    height: 3px;\n  }\n\n}\n"
  },
  {
    "path": "src/scss/components/_segment-terms.scss",
    "content": ".segment-term-wrap {\n  p {\n    font-size: 13px;\n    line-height: 18px;\n  }\n}\n\n.segment-term-title {\n  margin-bottom: 12px;\n  font-weight: 600;\n  text-transform: uppercase;\n}\n\n.segment-term {\n  position: relative;\n  display: inline-block;\n  padding: 20px 60px 20px 20px;\n  margin-bottom: 12px;\n  background: $white;\n  border: 1px solid $slate-10;\n  border-radius: $border-radius;\n\n  &:hover {\n    .segment-term-edit {\n      opacity: 1;\n    }\n  }\n\n  &.has-separator::after {\n    position: absolute;\n    bottom: -43px;\n    left: 60px;\n    width: 1px;\n    height: 42px;\n    border-left: 1px solid $slate-10;\n    content: \"\";\n  }\n\n  &.is-editable {\n    display: inline-flex;\n    align-items: center;\n    padding: 20px;\n\n    @media (max-width: $segment-term-max-width) {\n      display: block;\n      padding: 30px;\n      text-align: center;\n    }\n\n    .input-select-wrap {\n      min-width: 200px;\n      margin-right: 20px;\n      margin-bottom: 0;\n\n      @media (max-width: $segment-term-max-width) {\n        margin-bottom: 30px;\n      }\n    }\n\n    .input-select-label {\n      display: none;\n    }\n\n    .btn-list {\n      min-width: 96px;\n    }\n\n    .btn {\n      padding-top: 6px;\n      padding-bottom: 6px;\n    }\n\n    .btn-danger {\n      padding: 6px;\n      color: $ron-burgundy;\n      background-color: $white;\n      border-color: $white;\n    }\n\n    .btn .sg-icon {\n      margin: 0;\n    }\n\n    .sg-icon-check-thin {\n      font-weight: bold;\n    }\n  }\n\n  p {\n    margin-bottom: 0;\n  }\n\n  .input-select-wrap {\n    text-align: left;\n  }\n\n  .segment-term-edit {\n    position: absolute;\n    top: 50%;\n    right: 20px;\n    margin-top: -8px;\n    cursor: pointer;\n    opacity: 0;\n  }\n\n  + .btn-list {\n    margin-top: 8px;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_selects.scss",
    "content": "// sass-lint:disable no-vendor-prefixes\n// linting disabled due to browser specific styles\n\n.input-select-wrap {\n  position: relative;\n  width: 100%;\n  margin-bottom: 20px;\n\n  .input-select-label {\n    display: block;\n    font-size: 12px;\n    line-height: 15px;\n    cursor: pointer;\n  }\n\n  &.is-required {\n    label::after {\n      position: absolute;\n      top: 4px;\n      width: 4px;\n      height: 4px;\n      margin-left: 5px;\n      background: $ron-burgundy;\n      border-radius: 4px;\n      content: \"\";\n    }\n  }\n\n  &.is-disabled {\n    .input-select-label {\n      cursor: default;\n    }\n\n    .input-select-label,\n    .input-select::after {\n      color: $select-disabled-color;\n    }\n  }\n\n  &.is-error {\n    .input-select-label {\n      color: $slate-60;\n    }\n\n    .input-select,\n    .select2-container {\n      border-bottom-color: $ron-burgundy;\n      box-shadow: $ron-burgundy 0 1px 0;\n    }\n  }\n\n  .option-filter {\n    display: inline-block;\n    width: 12px;\n    height: 12px;\n    line-height: 12px;\n    border-radius: 100%;\n\n    &.option-filter-delivered {\n      background-color: $mantis;\n    }\n\n    &.option-filter-processed {\n      background-color: $slate-20;\n    }\n\n    &.option-filter-not-delivered {\n      background-color: $ron-burgundy;\n    }\n  }\n}\n\n.input-select {\n  position: relative;\n  background-color: transparent;\n  border-bottom: 1px solid $slate-20;\n  outline: 0;\n  box-shadow: transparent 0 1px 0;\n\n  &::after {\n    @include icon-font-base;\n    position: absolute;\n    top: 5px;\n    right: 0;\n    color: $slate-60;\n    pointer-events: none;\n    content: $icon-caret;\n  }\n\n  select {\n    display: block;\n    width: 100%;\n    height: 24px;\n    font-size: 13px;\n    line-height: 24px;\n    color: $slate;\n    background-color: transparent;\n    border: 0;\n    outline: 0;\n    box-shadow: none;\n    -moz-appearance: none;\n    -webkit-appearance: none;\n    -moz-margin-start: -3px;\n\n    &:-moz-focusring {\n      color: transparent;\n      text-shadow: 0 0 0 $slate;\n    }\n\n    &::-ms-expand {\n      display: none;\n    }\n\n    &[disabled] {\n      color: $select-disabled-color;\n      background-color: transparent;\n    }\n  }\n\n  &.is-focused {\n    border-bottom-color: $sg-blue;\n    box-shadow: $sg-blue 0 1px 0;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_switches.scss",
    "content": ".switch {\n  position: relative;\n  display: inline-block;\n  font-size: 10px;\n  background: $white;\n  border: 1px solid $slate-20;\n  border-radius: $border-radius;\n  user-select: none;\n\n  &.is-disabled,\n  &.is-switch-disabled {\n    .switch-selector {\n      background: $steel;\n    }\n\n    .switch-label {\n      cursor: default;\n    }\n  }\n}\n\n.switch-checkbox {\n  display: none;\n}\n\n.switch-label {\n  position: relative;\n  z-index: $switch-option-z-index;\n  font-size: 0;\n  cursor: pointer;\n}\n\n.switch-option {\n  position: relative;\n  z-index: $switch-option-z-index;\n  display: inline-block;\n  width: 29px;\n  height: 28px;\n  font-size: 10px;\n  line-height: 30px;\n  color: $slate-60;\n  text-align: center;\n  text-transform: uppercase;\n  transition: color 0.25s;\n}\n\n.switch-option-off {\n  color: $white;\n}\n\n.switch-selector {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  z-index: $switch-selector-z-index;\n  display: inline-block;\n  width: 30px;\n  height: 30px;\n  background: $sg-blue;\n  border-radius: $border-radius;\n  transition: left 0.25s;\n}\n\n.switch-checkbox:checked {\n  ~ .switch-selector {\n    left: 30px;\n  }\n\n  ~ .switch-label {\n    .switch-option-off {\n      color: $slate-60;\n    }\n\n    .switch-option-on {\n      color: $white;\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_tables.scss",
    "content": "// sass-lint:disable force-attribute-nesting\n// linting disabled due to complexity of moving styles\n.table-col-100 {\n  width: 100px;\n}\n\n.table-col-150 {\n  width: 150px;\n}\n\n.table-col-200 {\n  width: 200px;\n}\n\n.table-wrap {\n  width: 100%;\n  // override app max-width that causes some issues w/ checkbox tables\n  max-width: none;\n  margin-bottom: 20px;\n  overflow: scroll;\n\n  table {\n    table-layout: fixed;\n    width: 100%;\n  }\n\n  table.auto {\n    table-layout: auto;\n  }\n\n  // pull checkbox cells into grid gutters\n  &.has-checkboxes {\n    width: calc(100% + 30px);\n    margin-left: -30px;\n  }\n\n  tr {\n    font-size: 13px;\n    line-height: 20px;\n    border: 1px solid $slate-10;\n    border-bottom: 0;\n    transition: background-color 0.3s;\n\n    // don't color checkbox cells when rows are selected\n    &.is-selected td:not(.table-checkbox) {\n      background-color: $slate-02;\n    }\n\n    // show checkboxes on hover/is-selected\n    &:hover .input-checkbox-wrap,\n    &.is-selected .input-checkbox-wrap {\n      visibility: visible;\n    }\n\n    // hide the ellipsis on hover\n    &:hover .sg-icon-ellipsis {\n      opacity: 0;\n    }\n\n    // show the action icons on hover\n    &:hover .action-icons {\n      opacity: 1;\n    }\n\n    &:hover .editor-type,\n    &.is-selected .editor-type {\n      display: block;\n    }\n\n    &:last-of-type {\n      border-bottom: 1px solid $slate-10;\n    }\n\n    &.is-disabled td {\n      background-color: $slate-05;\n    }\n  }\n\n  td,\n  th {\n    padding: 20px 12px;\n\n    &.table-checkbox {\n      border-color: transparent;\n    }\n\n    &.table-checkbox:hover,\n    &.table-checkbox.is-selected {\n      background-color: transparent;\n    }\n\n    &.align-center {\n      text-align: center;\n    }\n\n    &.actions,\n    &.align-right {\n      text-align: right;\n    }\n  }\n\n  td {\n    // word-break: break-all;\n    vertical-align: middle;\n\n    p {\n      margin-bottom: 0;\n      font-size: 13px;\n      line-height: 20px;\n    }\n\n    &.table-checkbox {\n      border-right-color: $slate-10;\n    }\n\n    &:not(.table-checkbox) {\n      background-color: $white;\n\n      // fix padding when one or more checkboxes and radio buttons are\n      // embedded within table cells.\n\n      [class^=\"input-\"][class$=\"-wrap\"] {\n        margin-bottom: 0;\n      }\n\n      [class^=\"input-\"][class$=\"-wrap\"] + [class^=\"input-\"][class$=\"-wrap\"] {\n        margin-top: 20px;\n      }\n    }\n\n    &.contact,\n    &.campaign-name,\n    &.list-name {\n      font-weight: 600;\n    }\n\n    &.campaign-name p {\n      position: relative;\n    }\n\n    &.campaign-name .sg-icon {\n      margin: 0;\n      cursor: help;\n    }\n\n    .editor-type {\n      position: absolute;\n      left: -20px;\n      display: none;\n      line-height: 1;\n    }\n\n    &.is-verified .sg-icon {\n      color: $mantis;\n    }\n\n    &.is-not-verified .sg-icon {\n      color: $ron-burgundy;\n    }\n\n    // set relative positioning for tooltips and inline-flex to keep width dynamic\n    .categories {\n      position: relative;\n      display: inline-flex;\n    }\n  }\n\n  th {\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 15px;\n    letter-spacing: 1px;\n    color: $slate-60;\n    text-align: left;\n    text-transform: uppercase;\n    vertical-align: middle;\n\n    &.sort {\n      cursor: pointer;\n    }\n\n    &.sort-asc,\n    &.sort-desc {\n      font-weight: 600;\n      color: $slate;\n    }\n\n    &.sort-asc::after,\n    &.sort-desc::after {\n      @include icon-font-base;\n      font-size: 20px;\n      color: $sg-blue;\n      vertical-align: middle;\n    }\n\n    &.sort-asc::after {\n      content: $icon-sort-asc;\n    }\n\n    &.sort-desc::after {\n      content: $icon-sort-desc;\n    }\n\n    // always show the <th> checkbox\n    .input-checkbox-wrap {\n      visibility: visible;\n    }\n\n    // remove spacing from top and bottom of button to reduce height of <th>\n    .btn-dropdown {\n      z-index: 1;\n      padding-top: 0;\n      padding-bottom: 0;\n    }\n\n    // stop gear from jumping up a few pixels on rotate\n    .sg-icon-gear {\n      letter-spacing: 0;\n    }\n\n    // adjust the position of the gear's caret\n    .btn-dropdown-gear::before {\n      top: 0;\n    }\n\n    // adjustments to dropdown menu for <th>\n    .dropdown-menu {\n      right: 0;\n      left: auto;\n      letter-spacing: 0;\n      text-transform: none;\n    }\n  }\n\n  // remove borders and background hovers on <thead> rows\n  thead tr {\n    border-color: transparent;\n  }\n\n  // auto width if you don't want 100% width tables\n  &.is-auto-width {\n    width: auto;\n  }\n\n  // tighten up row spacing\n  &.is-thin {\n    td {\n      padding-top: 12px;\n      padding-bottom: 12px;\n    }\n  }\n\n  // striped rows\n  &.is-striped {\n    tr:nth-child(even) td:not(.table-checkbox) {\n      background-color: $slate-02;\n    }\n  }\n\n  // checkbox cells\n  .table-checkbox {\n    width: 30px;\n    padding-right: 0;\n    padding-left: 0;\n    border: 1px solid $white;\n    border-right: 1px solid $slate-10;\n  }\n\n  // rows that have a relationship to a set of rows beneath them\n  .segment-item {\n    .cell-label {\n      width: 120px;\n      padding-left: 40px;\n      border-top: 1px solid $white;\n    }\n\n    // dotted connector for showing relationships between rows\n    .cell-label::before {\n      position: absolute;\n      top: -20px;\n      left: 17px;\n      width: 6px;\n      height: 51px;\n      border-bottom: 1px solid $slate-20;\n      border-left: 1px solid $slate-20;\n      content: \"\";\n    }\n\n    .label {\n      margin-left: 9px;\n    }\n  }\n\n  // hide row checkboxes by default\n  .table-checkbox .input-checkbox-wrap {\n    margin-bottom: 0;\n    visibility: hidden;\n  }\n\n  .badge {\n    margin-bottom: 0;\n    line-height: 10px;\n  }\n\n  .label + .date {\n    padding-left: 21px;\n  }\n\n  .date,\n  .email,\n  .subject {\n    display: block;\n  }\n\n  .date {\n    font-size: 12px;\n    color: $steel;\n  }\n\n  .email {\n    font-weight: 600;\n  }\n\n  .subject {\n    font-weight: 400;\n  }\n\n  .stats {\n    position: relative;\n\n    &.delivered .stats-line {\n      background-color: $stats-delivered;\n    }\n\n    &.opens .stats-line {\n      background-color: $stats-opens;\n    }\n\n    &.unique-opens .stats-line {\n      background-color: $stats-unique-opens;\n    }\n\n    &.clicks .stats-line {\n      background-color: $stats-clicks;\n    }\n\n    &.unique-clicks .stats-line {\n      background-color: $stats-unique-clicks;\n    }\n\n    &.unsubscribes .stats-line {\n      background-color: $stats-unsubscribes;\n    }\n\n    &.spam-reports .stats-line {\n      background-color: $stats-spam-reports;\n    }\n  }\n\n  .stats-line {\n    position: absolute;\n    bottom: -1px;\n    left: 0;\n    height: 2px;\n  }\n\n  .sg-icon {\n    vertical-align: middle;\n    transition: opacity 0.3s;\n  }\n\n  .sg-icon-ellipsis {\n    font-size: 20px;\n    opacity: 1;\n  }\n\n  .actions {\n    position: relative;\n  }\n\n  .action-icons {\n    position: absolute;\n    top: 50%;\n    right: 6px;\n    display: inline-flex;\n    margin-top: -10px;\n    opacity: 0;\n    transition: opacity 0.3s;\n\n    span {\n      display: inline-block;\n      margin: 0 3px;\n    }\n  }\n}\n\n// pull table state up into bottom of table\n.table-wrap + .table-state {\n  margin: -20px 0 20px;\n  border-top: 0;\n}\n\n.table-state {\n  padding: 20px;\n  margin-bottom: 20px;\n  text-align: center;\n  background-color: $slate-02;\n  border: 1px solid $slate-10;\n\n  // increase padding for empty states\n  &.is-empty {\n    padding: 60px;\n    margin-bottom: 30px;\n    background-color: $white;\n    border-radius: $border-radius;\n  }\n\n  &.is-empty .sg-icon {\n    display: block;\n    margin-bottom: 20px;\n    font-size: 40px;\n  }\n\n  p {\n    max-width: 720px;\n    margin: 0 auto 20px;\n    font-size: 13px;\n    line-height: 20px;\n\n    &:last-of-type {\n      margin-bottom: 0;\n    }\n  }\n\n  .btn-list {\n    margin-top: 20px;\n\n    .sg-icon {\n      margin-bottom: 0;\n      font-size: 16px;\n    }\n  }\n}\n\n.cell-label {\n  position: relative;\n\n  .label {\n    position: relative;\n    display: inline-block;\n    min-width: 70px; // prevent labels from word-breaking\n    margin-left: 21px;\n    font-size: 12px;\n    line-height: 20px;\n\n    // label dots\n    &::before {\n      position: absolute;\n      top: 3px;\n      left: -21px;\n      width: 12px;\n      height: 12px;\n      background-color: $slate-20;\n      border-radius: 50%;\n      content: \"\";\n    }\n\n    &-sent,\n    &-delivered {\n      @include table-label($mantis);\n    }\n\n    &-scheduled {\n      @include table-label($cobalt);\n    }\n\n    &-pick-winner {\n      @include table-label($wild-strawberry);\n    }\n\n    &-draft,\n    &-global {\n      @include table-label($steel);\n    }\n\n    &-list,\n    &-progress {\n      @include table-label($bluebird);\n    }\n\n    &-segment {\n      @include table-label($seafoam);\n    }\n\n    &-bounced,\n    &-canceled,\n    &-paused {\n      @include table-label($ron-burgundy);\n    }\n\n    &-optimized {\n      @include table-label($burnt-orange);\n    }\n\n    &-ab-test {\n      display: block;\n      font-size: 11px;\n      line-height: 15px;\n    }\n\n    // remove status dot for a/b test labels\n    &-ab-test::before {\n      content: none;\n    }\n  }\n}\n\n.compare-table-wrap {\n  font-size: 13px;\n\n  tr {\n    &:hover td {\n      background: $slate-05;\n    }\n\n    &.no-highlight:hover td {\n      background: transparent;\n    }\n\n    &.spacer {\n      height: 12px;\n    }\n\n    &.spacer td {\n      padding: 0;\n    }\n\n    &.is-top td {\n      font-weight: 600;\n    }\n\n    &.is-bottom td {\n      padding-bottom: 20px;\n    }\n\n    &.is-bottom .val {\n      border-bottom: 1px solid $compare-border-color;\n    }\n  }\n\n  th {\n    padding: 1em;\n    font-size: 12px;\n    letter-spacing: 1px;\n    color: $white;\n    text-align: center;\n    text-transform: uppercase;\n    background: $sg-blue;\n\n    &.alt {\n      background: $mantis;\n    }\n\n    &.transparent {\n      background: transparent;\n    }\n  }\n\n  td {\n    padding: 14px 10px;\n\n    &.val {\n      text-align: center;\n      border-left: 1px solid $compare-border-color;\n    }\n\n    &.val.val-alt {\n      border-right: 1px solid $compare-border-color;\n      border-left: 1px solid $compare-border-color;\n    }\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_tabs.scss",
    "content": ".tab-wrapper {\n  display: flex;\n  justify-content: flex-start;\n  border-bottom: 1px solid $slate-10;\n  padding-left: 0;\n\n  &.is-centered {\n    justify-content: center;\n  }\n\n  &.is-centered.has-button {\n    position: relative;\n  }\n\n  &.zero-border {\n    border-bottom: 0;\n\n    // remove negative margin on zero-border\n    .tab {\n      margin-bottom: 0;\n    }\n  }\n\n  &.is-editor,\n  &.is-ab-testing {\n    .tab {\n      justify-content: center;\n      padding-right: 0;\n      padding-left: 0;\n    }\n\n    &.is-3-up .tab {\n      width: 33.3333%;\n    }\n\n    &.is-4-up .tab {\n      width: 25%;\n    }\n  }\n\n  &.is-ab-testing {\n    &.is-2-up .tab {\n      width: 50%;\n    }\n\n    &.is-5-up .tab {\n      width: 20%;\n    }\n\n    &.is-6-up .tab {\n      width: 16.6667%;\n    }\n\n    .tab {\n      background-color: $slate-05;\n      border-right: 1px solid $slate-10;\n      transition: background-color 0.3s;\n    }\n\n    .tab:hover {\n      background-color: $slate-02;\n    }\n\n    .tab:last-of-type {\n      border-right: 0;\n    }\n\n    .tab.is-active {\n      background-color: $white;\n      border-bottom: 0;\n    }\n  }\n}\n\n.tab {\n  display: flex;\n  // less 2px on bottom to account for borders\n  padding: 20px 30px 18px;\n  // negative margin to pull active states down to cover the wrapper border\n  margin-bottom: -1px;\n  font-size: 13px;\n  font-weight: 400;\n  line-height: 20px;\n  cursor: pointer;\n\n  &.is-active {\n    color: $sg-blue;\n    border-bottom: 2px solid $sg-blue;\n  }\n\n  &.is-btn-left {\n    position: absolute;\n    left: 0;\n    padding: 15px 0;\n  }\n\n  .badge {\n    height: 16px;\n    margin: 2px 0;\n    line-height: 1;\n  }\n}\n\n// TODO: remove\n.tab-active {\n  color: $sg-blue;\n  border-bottom: 2px solid $sg-blue;\n}\n\n.tab-number {\n  width: 30px;\n  height: 20px;\n  margin-left: 12px;\n  font-weight: 600;\n  color: $slate-80;\n  text-align: center;\n  background-color: $slate-10;\n  border-radius: 15px;\n}\n"
  },
  {
    "path": "src/scss/components/_text-inputs.scss",
    "content": "input {\n  &:focus,\n  &:active {\n    outline: 0;\n  }\n}\n\n.input-info,\n.input-text-info {\n  display: inline-block;\n  padding-top: 6px;\n  font-size: 12px;\n  line-height: 18px;\n\n  &.danger {\n    color: $ron-burgundy;\n  }\n}\n\n.input-text-wrap {\n  position: relative;\n  padding-top: 15px;\n  margin-bottom: 20px;\n\n  &.is-required {\n    label::after {\n      position: absolute;\n      top: 6px;\n      right: -9px;\n      width: 4px;\n      height: 4px;\n      background: $ron-burgundy;\n      border-radius: 4px;\n      content: \"\";\n    }\n  }\n\n  &.is-focused,\n  &.has-value {\n    .input-text-label {\n      top: 0;\n      font-size: 12px;\n      line-height: 15px;\n    }\n\n    label::after {\n      top: 4px;\n    }\n  }\n\n  &.is-disabled {\n    .input-text-label {\n      color: $text-input-disabled-color;\n    }\n\n    [type=\"text\"],\n    [type=\"password\"],\n    [type=\"number\"],\n    [type=\"email\"],\n    [type=\"tel\"] {\n      pointer-events: none;\n      border-bottom-color: $text-input-disabled-border;\n    }\n  }\n\n  &.is-error,\n  &.is-error.is-focused,\n  &.is-error.has-value {\n    [type=\"text\"],\n    [type=\"password\"],\n    [type=\"number\"],\n    [type=\"email\"],\n    [type=\"tel\"] {\n      border-bottom-color: $ron-burgundy;\n      box-shadow: $ron-burgundy 0 1px 0;\n    }\n  }\n\n  &.is-valid::after,\n  &.is-invalid::after,\n  &.is-search::after {\n    @include icon-font-base;\n    position: absolute;\n    top: 19px;\n    right: 0;\n    pointer-events: none;\n  }\n\n\n  &.is-valid::after {\n    color: $mantis;\n    content: $icon-status-positive;\n  }\n\n  &.is-invalid::after {\n    color: $ron-burgundy;\n    content: $icon-status-negative;\n  }\n\n  &.is-search {\n    &::after {\n      content: $icon-search;\n    }\n\n    &.is-focused::after {\n      font-weight: bold;\n      color: $sg-blue;\n    }\n  }\n\n  &.is-calendar {\n    &::before {\n      @include icon-font-base;\n      position: absolute;\n      top: 19px;\n      right: 0;\n      pointer-events: none;\n      content: $icon-calendar;\n    }\n\n    &.is-focused::before {\n      color: $sg-blue;\n    }\n  }\n\n  &.has-units {\n    &[class*=\"has-arrow-\"]::before {\n      @include icon-font-base;\n      position: absolute;\n      top: 19px;\n      left: 0;\n    }\n\n    &.has-arrow-top::before {\n      content: $icon-sort-asc;\n    }\n\n    &.has-arrow-right::before {\n      content: $icon-sort-asc;\n      transform: rotate(90deg);\n    }\n\n    &.has-arrow-bottom::before {\n      content: $icon-sort-desc;\n    }\n\n    &.has-arrow-left::before {\n      content: $icon-sort-asc;\n      transform: rotate(-90deg);\n    }\n\n    &::after {\n      position: absolute;\n      top: 20px;\n      right: 3px;\n      font-size: 12px;\n      content: attr(data-units);\n    }\n\n    &[class*=\"has-arrow-\"] [type=\"text\"],\n    &[class*=\"has-arrow-\"] [type=\"number\"] {\n      padding-right: 20px;\n      padding-left: 20px;\n      text-align: right;\n    }\n  }\n\n  &.is-large {\n    .input-text-label {\n      top: 15px;\n      font-size: 18px;\n      line-height: 27px;\n    }\n\n    [type=\"text\"],\n    [type=\"password\"],\n    [type=\"number\"],\n    [type=\"email\"],\n    [type=\"tel\"] {\n      font-size: 18px;\n      line-height: 27px;\n    }\n  }\n\n  &.is-large.is-focused,\n  &.is-large.has-value {\n    .input-text-label {\n      top: 0;\n      font-size: 12px;\n      line-height: 15px;\n    }\n  }\n\n  [type=\"text\"],\n  [type=\"password\"],\n  [type=\"number\"],\n  [type=\"email\"],\n  [type=\"tel\"] {\n    display: block;\n    width: 100%;\n    padding: 0;\n    font-size: 13px;\n    line-height: 24px;\n    color: $slate;\n    background-color: transparent;\n    border: 0;\n    border-bottom: 1px solid $slate-20;\n    box-shadow: transparent 0 1px 0;\n    transition: 0.3s border-color, 0.3s box-shadow;\n\n    &:focus {\n      border-color: $sg-blue;\n      box-shadow: $sg-blue 0 1px 0;\n    }\n\n    &:disabled {\n      background: transparent;\n    }\n  }\n\n  // add right padding to push number selector over so it doesn't overlap icons\n  [type=\"number\"] {\n    padding-right: 20px;\n  }\n}\n\n.input-text-label {\n  position: absolute;\n  top: 18px;\n  display: inline-block;\n  font-size: 13px;\n  line-height: 18px;\n  pointer-events: none;\n  transition: 0.3s top, 0.3s font-size;\n  transition-timing-function: cubic-bezier(0.02, 0.01, 0.47, 1);\n}\n\n.input-info-tooltip {\n  position: absolute;\n  top: 19px;\n  right: 0;\n}\n\n.input-search-results {\n  @include dropdown-shadow;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  width: 100%;\n  background-color: $slate-02;\n  border: 1px solid $slate-10;\n  border-radius: $border-radius;\n\n  .loading {\n    display: none;\n\n    &.is-visible {\n      display: block;\n    }\n  }\n}\n\n.search-results-title,\n.search-result {\n  padding: 9px 18px 9px 30px;\n  font-size: 13px;\n  line-height: 18px;\n}\n\n.search-results-title {\n  margin-bottom: 0;\n  color: $slate;\n  background-color: $text-input-search-title-bg;\n}\n\n.search-results {\n  padding: 0;\n  margin: 0;\n}\n\n.search-result {\n  overflow: hidden;\n  color: $slate-80;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  transition: 0.3s color, 0.3s background-color;\n\n  &:hover {\n    color: $slate;\n    cursor: pointer;\n    background-color: $slate-05;\n  }\n}\n"
  },
  {
    "path": "src/scss/components/_textareas.scss",
    "content": "textarea {\n  display: block;\n  width: 100%;\n  height: 25px;\n  padding: 0;\n  overflow: hidden;\n  font-size: 13px;\n  line-height: 25px;\n  color: $slate;\n  background-color: transparent;\n  border: 0;\n  border-bottom: 1px solid $slate-20;\n  box-shadow: transparent 0 1px 0;\n  transition: 0.3s border-color, 0.3s box-shadow;\n  resize: none;\n\n  &:focus,\n  &:active {\n    outline: 0;\n  }\n\n  &:focus {\n    border-color: $sg-blue;\n    box-shadow: $sg-blue 0 1px 0;\n  }\n\n  &:disabled {\n    background: transparent;\n  }\n}\n\n.textarea-wrap {\n  position: relative;\n  max-width: 100%;\n  padding-top: 15px;\n  margin-bottom: 20px;\n\n  &.is-required {\n    label::after {\n      position: absolute;\n      top: 6px;\n      right: -9px;\n      width: 4px;\n      height: 4px;\n      background: $ron-burgundy;\n      border-radius: 4px;\n      content: \"\";\n    }\n  }\n\n  &.is-focused,\n  &.has-value {\n    .textarea-label {\n      top: 0;\n      font-size: 12px;\n      line-height: 15px;\n    }\n\n    label::after {\n      top: 4px;\n    }\n  }\n\n  &.is-disabled {\n    pointer-events: none;\n    border-bottom-color: $text-area-disabled-border;\n\n    .textarea-label {\n      color: $text-area-disabled-color;\n    }\n\n    .textarea-info {\n      color: $text-area-disabled-color;\n    }\n  }\n\n  &.is-error {\n    border-bottom-color: $ron-burgundy;\n    box-shadow: $ron-burgundy 0 1px 0;\n  }\n\n  &.is-scrollable {\n    overflow: auto;\n  }\n\n  .input-info-tooltip {\n    top: auto;\n    bottom: 6px;\n  }\n}\n\n.textarea-info {\n  display: inline-block;\n  padding-top: 6px;\n  font-size: 12px;\n  line-height: 15px;\n  color: $slate-40;\n\n  &.danger {\n    color: $ron-burgundy;\n  }\n}\n\n.textarea-label {\n  position: absolute;\n  top: 18px;\n  display: inline-block;\n  font-size: 13px;\n  line-height: 18px;\n  transition: 0.3s top, 0.3s font-size;\n  transition-timing-function: cubic-bezier(0.02, 0.01, 0.47, 1);\n}\n\n.textarea-tooltip {\n  position: absolute;\n  top: 19px;\n  right: 0;\n}\n"
  },
  {
    "path": "src/scss/components/_tooltips.scss",
    "content": "// license: https://goo.gl/f4lsjz\n// scss-lint:disable NestingDepth\n// linting property disabled due to it being a modified 3rd party stylesheet\n\n[data-tooltip] {\n  position: relative;\n\n  &::after {\n    @include base-effects();\n    position: absolute;\n    z-index: 100;\n    padding: 6px 12px;\n    font-size: $tooltip-font-size;\n    font-weight: normal;\n    line-height: $tooltip-line-height;\n    letter-spacing: normal;\n    color: $white;\n    text-align: left;\n    word-break: keep-all;\n    white-space: nowrap;\n    background: $tooltip-bg;\n    border-radius: $border-radius;\n    content: attr(data-tooltip);\n  }\n\n  &::before {\n    @include svg-arrow($tooltip-bg);\n    @include base-effects();\n    position: absolute;\n    z-index: 10;\n    content: \"\";\n  }\n\n  &:hover,\n  &.is-hovered,\n  &[data-tooltip-visible] {\n    &::before,\n    &::after {\n      @include opacity(1);\n      pointer-events: auto;\n    }\n  }\n\n  &[data-tooltip-break] {\n    &::after {\n      white-space: normal;\n    }\n  }\n\n  &[data-tooltip-pos=\"up\"] {\n    &::after {\n      @include transform(translate(-50%, 10px));\n      @include transform-origin(top);\n      bottom: 100%;\n      left: 50%;\n      margin-bottom: 5px + $tooltip-arrow-height;\n    }\n\n    &::before {\n      @include transform(translate(-50%, 10px));\n      @include transform-origin(top);\n      bottom: 100%;\n      left: 50%;\n      margin-bottom: 5px;\n    }\n\n    &:hover,\n    &.is-hovered,\n    &[data-tooltip-visible] {\n      &::after {\n        @include transform(translate(-50%, 0));\n      }\n\n      &::before {\n        @include transform(translate(-50%, 0));\n      }\n    }\n  }\n\n  &[data-tooltip-pos=\"down\"] {\n    &::after {\n      @include transform(translate(-50%, -10px));\n      top: 100%;\n      left: 50%;\n      margin-top: 5px + $tooltip-arrow-height;\n    }\n\n    &::before {\n      @include svg-arrow($tooltip-bg, \"down\");\n      @include transform(translate(-50%, -10px));\n      top: 100%;\n      left: 50%;\n      margin-top: 5px;\n    }\n\n    &:hover,\n    &.is-hovered,\n    &[data-tooltip-visible] {\n      &::after {\n        @include transform(translate(-50%, 0));\n      }\n\n      &::before {\n        @include transform(translate(-50%, 0));\n      }\n    }\n  }\n\n  &[data-tooltip-pos=\"left\"] {\n    &::after {\n      @include transform(translate(10px, -50%));\n      top: 50%;\n      right: 100%;\n      margin-right: 5px + $tooltip-arrow-height;\n    }\n\n    &::before {\n      @include svg-arrow($tooltip-bg, \"left\");\n      @include transform(translate(10px, -50%));\n      top: 50%;\n      right: 100%;\n      margin-right: 5px;\n    }\n\n    &:hover,\n    &.is-hovered,\n    &[data-tooltip-visible] {\n      &::after {\n        @include transform(translate(0, -50%));\n      }\n\n      &::before {\n        @include transform(translate(0, -50%));\n      }\n    }\n  }\n\n  &[data-tooltip-pos=\"right\"] {\n    &::after {\n      @include transform(translate(-10px, -50%));\n      top: 50%;\n      left: 100%;\n      margin-left: 5px + $tooltip-arrow-height;\n    }\n\n    &::before {\n      @include svg-arrow($tooltip-bg, \"right\");\n      @include transform(translate(-10px, -50%));\n      top: 50%;\n      left: 100%;\n      margin-left: 5px;\n    }\n\n    &:hover,\n    &.is-hovered,\n    &[data-tooltip-visible] {\n      &::after {\n        @include transform(translate(0, -50%));\n      }\n\n      &::before {\n        @include transform(translate(0, -50%));\n      }\n    }\n  }\n\n  &[data-tooltip-length=\"small\"] {\n    &::after {\n      width: 80px;\n      white-space: normal;\n    }\n  }\n\n  &[data-tooltip-length=\"medium\"] {\n    &::after {\n      width: 150px;\n      white-space: normal;\n    }\n  }\n\n  &[data-tooltip-length=\"large\"] {\n    &::after {\n      width: 260px;\n      white-space: normal;\n    }\n  }\n\n  &[data-tooltip-length=\"xlarge\"] {\n    &::after {\n      width: 380px;\n      white-space: normal;\n\n      @media screen and (max-width: 768px) {\n        width: 90vw;\n        white-space: normal;\n      }\n    }\n  }\n\n  &.has-underline {\n    cursor: help;\n    border-bottom: 1px dotted $slate-40;\n  }\n}\n\n[data-tooltip],\n.input-info-tooltip {\n  .sg-icon {\n    margin-left: 3px;\n    color: $slate-60;\n    vertical-align: middle;\n    cursor: pointer;\n    transition: 0.3s color;\n\n    &:hover,\n    &.is-hovered {\n      color: $slate;\n    }\n  }\n}\n\n.tooltip-js-content {\n  position: absolute;\n  left: -10000px;\n  z-index: $info-popup-z-index;\n  width: 240px;\n  padding: 12px;\n  margin-left: 6px;\n  font-size: 12px;\n  line-height: 18px;\n  letter-spacing: normal;\n  color: $white;\n  word-break: normal;\n  background: $slate;\n  border-radius: $border-radius;\n  opacity: 0;\n  transition: 0.3s opacity, 0s left 0.3s;\n\n  &::after {\n    position: absolute;\n    top: 50%;\n    left: -3px;\n    width: 8px;\n    height: 8px;\n    margin-top: -4px;\n    background: $slate;\n    border-radius: $border-radius;\n    content: \"\";\n    transform: rotate(45deg);\n  }\n\n  &.is-visible {\n    left: 100%;\n    overflow: visible;\n    opacity: 1;\n    transition: 0.5s opacity;\n  }\n\n  &.is-left {\n    &.is-visible {\n      right: 22px;\n      left: auto;\n    }\n\n    &::after {\n      right: -3px;\n      left: auto;\n    }\n  }\n\n  &[data-tooltip-length=\"small\"] {\n    width: 80px;\n  }\n\n  &[data-tooltip-length=\"medium\"] {\n    width: 150px;\n  }\n\n  &[data-tooltip-length=\"large\"] {\n    width: 240px;\n  }\n\n  &[data-tooltip-length=\"xlarge\"] {\n    width: 380px;\n  }\n\n  p {\n    margin-bottom: 12px;\n    font-size: inherit;\n    line-height: inherit;\n    color: inherit;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  a {\n    color: $white;\n    text-decoration: underline;\n  }\n}\n"
  },
  {
    "path": "src/scss/global/_grid.scss",
    "content": "\n$grid-container-max: 930px;\n$grid-container-lg-max: 1200px;\n$grid-container-gutter: 20px;\n$grid-columns: 12;\n$grid-gutter: 2%;\n\n$width-small: 610px;\n$width-medium: 990px;\n$width-large: 1200px;\n\n.container {\n  max-width: $grid-container-max;\n  padding-right: $grid-container-gutter;\n  padding-left: $grid-container-gutter;\n  margin: 0 auto;\n}\n\n.container-lg {\n  max-width: $grid-container-lg-max;\n  padding-right: $grid-container-gutter;\n  padding-left: $grid-container-gutter;\n  margin: 0 auto;\n}\n\n.row {\n  display: grid;\n  grid-template-columns: repeat($grid-columns, 1fr);\n  grid-column-gap: $grid-gutter;\n\n  // span the full width of the grid if a column class is not assigned\n  > :not([class*='col-']) {\n    grid-column: span $grid-columns;\n  }\n}\n\n// grid mixin\n@mixin createGrid($grid-columns, $col-size: null, $build-offset: false) {\n  @for $x from 1 through $grid-columns {\n    $col-class: if($col-size, '#{$col-size}-#{$x}', '#{$x}');\n\n    .col-#{$col-class} {\n      grid-column: span #{$x};\n      @for $y from 1 to $grid-columns {\n        $grid-column-lines: ($grid-columns + 1);\n        $grid-column-start: ($y + 1);\n        $grid-column-end: ($x + $y + 1);\n        $grid-column-total: ($x + $y);\n\n        $col-class: if($col-size, '#{$col-size}-#{$y}', '#{$y}');\n\n        // Only add offset to media queries\n        @if ($grid-column-total <= $grid-columns and $build-offset) {\n          &.col-offset-#{$col-class} {\n            grid-column-start: $grid-column-start;\n            grid-column-end: $grid-column-end;\n          }\n        }\n      }\n    }\n  }\n}\n\n@include createGrid($grid-columns, 'xs');\n@include createGrid($grid-columns, 'sm');\n@include createGrid($grid-columns, 'md');\n@include createGrid($grid-columns, 'lg');\n\n// large\n@media (min-width: $width-medium) {\n  @include createGrid($grid-columns, 'lg', true);\n}\n\n// medium\n@media (min-width: $width-small) and (max-width: $width-medium) {\n  @include createGrid($grid-columns, 'md', true);\n}\n\n// stack md and lg columns up to small\n@media (max-width: $width-small) {\n  [class*='col-lg'],\n  [class*='col-md'] {\n    // grid-column-start: 1;\n    grid-column: span 12;\n    margin-bottom: $scale-0;\n  }\n}\n\n// small\n@media (max-width: $width-small) {\n  @include createGrid($grid-columns, 'sm', true);\n}\n"
  },
  {
    "path": "src/scss/global/_main.scss",
    "content": "@import '../../scss/global/variables';\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nbody {\n  background-color: $slate-10;\n}\n\na,\na:hover,\na:active,\na:focus,\nbutton,\nbutton:hover,\nbutton:active,\nbutton:focus {\n  outline: none;\n}\n\na,\n.link {\n  color: $sg-blue-80;\n  text-decoration: none;\n  transition: color 0.3s;\n\n  &:hover {\n    color: $sg-blue;\n  }\n}\n\nimg {\n  max-width: 100%;\n  height: auto;\n}\n\n.docs-wrap {\n  max-width: 1600px;\n  margin: 0 auto;\n  background-color: #fff;\n  box-shadow: 0 1px 3px 0 rgba(41,70,97,.2);\n}\n\n.main {\n  padding: $scaleup-6 0;\n}\n\n.card__link {\n  display: block;\n  width: 100%;\n  margin-bottom: $scaleup-1;\n}\n\n.btn-white {\n  color: $sg-blue;\n  background-color: $white;\n  border-color: $white;\n\n  &:hover,\n  &:focus {\n    color: $sg-blue;\n    background-color: $white;\n  }\n\n  &:active,\n  &.is-active {\n    @include btn-shadow;\n  }\n}\n"
  },
  {
    "path": "src/scss/global/_mixins.scss",
    "content": "// sendgrid style-guide mixins\n// sass-lint:disable no-color-literals, no-vendor-prefixes\n// linting disabled due to mixins from 3rd parties\n\n// colfax\n@mixin colfax($font-weight: 400) {\n  font-family: Colfax, Helvetica, Arial, sans-serif;\n  font-style: normal;\n  font-weight: $font-weight;\n}\n\n// base icon font styles\n@mixin icon-font-base {\n  font-family: \"styleguideicons\";\n  font-size: 16px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  text-transform: none;\n  speak: none;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// transition\n@mixin transition($args...) {\n  transition: $args;\n}\n\n// transform\n@mixin transform($val) {\n  transform: $val;\n}\n\n// transform origin\n@mixin transform-origin($val) {\n  -webkit-transform-origin: $val;\n  -moz-transform-origin: $val;\n  -ms-transform-origin: $val;\n  transform-origin: $val;\n}\n\n// opacity\n@mixin opacity($trans) {\n  opacity: $trans;\n}\n\n// clear floats\n@mixin clearfix {\n  &::before,\n  &::after {\n    display: table;\n    content: \"\";\n  }\n\n  &::after {\n    clear: both;\n  }\n}\n\n// text image replacement\n@mixin text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n@mixin btn-shadow {\n  box-shadow: 0 1px 4px 0 rgba($sg-blue, 0.2);\n}\n\n@mixin dropdown-shadow {\n  box-shadow: 0 2px 6px 0 rgba($slate, 0.2);\n}\n\n// table labels and statuses\n@mixin table-label($color) {\n  color: $color;\n\n  &::before {\n    background-color: $color;\n  }\n}\n\n// tooltip svg arrows\n@mixin svg-arrow($color, $position: up) {\n  $width:   18px;\n  $height:  6px;\n  $degrees: 0;\n  @if ($position == down) {\n    $degrees: 180 18 6;\n  } @else if ($position == left) {\n    $degrees: -90 18 18;\n    $width: 6px;\n    $height: 18px;\n  } @else if ($position == right) {\n    $degrees: 90 6 6;\n    $width: 6px;\n    $height: 18px;\n  }\n  width: $width;\n  height: $height;\n  background: no-repeat url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http://www.w3.org/2000/svg%22%20width%3D%22#{$width * 2}%22%20height%3D%22#{$height * 2}%22%3E%3Cpath%20fill%3D%22#{$color}%22%20transform%3D%22rotate(#{$degrees})%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E\");\n  background-size: 100% auto;\n}\n\n// tooltip base effects\n@mixin base-effects {\n  @include opacity(0);\n  @include transition(all 0.2s ease-out 0.2s);\n  pointer-events: none;\n}\n\n// meter base percentage\n@mixin base-percentage-meter {\n  height: 8px;\n  border-radius: 4px;\n}\n\n// meter percentage\n@mixin percentage-meter($start, $stop) {\n  @include base-percentage-meter;\n  @include background-image(linear-gradient(center left, $start, $stop));\n}\n\n// connector and arrow for email-cards\n@mixin email-card-connector($color: $slate-20) {\n  &::before {\n    position: absolute;\n    right: 50%;\n    bottom: -25px;\n    width: 2px;\n    height: 25px;\n    margin-left: -1px;\n    border-left: 1px solid $color;\n    content: \"\";\n  }\n\n  &::after {\n    position: absolute;\n    right: calc(50% - 3.5px); // subpixel value to align point of arrow w/ border above\n    bottom: -30px;\n    border-top: 5px solid $color;\n    border-right: 5px solid transparent;\n    border-left: 5px solid transparent;\n    content: \"\";\n  }\n}\n"
  },
  {
    "path": "src/scss/global/_reset.scss",
    "content": "// license: https://goo.gl/orO1kX\n// sass-lint:disable single-line-per-selector, no-duplicate-properties\n// linting property disabled due to it being a 3rd party stylesheet\n\n@mixin meyer-reset {\n  html, body, div, span, applet, object, iframe,\n  h1, h2, h3, h4, h5, h6, p, blockquote, pre,\n  a, abbr, acronym, address, big, cite, code,\n  del, dfn, em, img, ins, kbd, q, s, samp,\n  small, strike, strong, sub, sup, tt, var,\n  b, u, i, center,\n  dl, dt, dd, ol, ul, li,\n  fieldset, form, label, legend,\n  table, caption, tbody, tfoot, thead, tr, th, td,\n  article, aside, canvas, details, embed,\n  figure, figcaption, footer, header, hgroup,\n  menu, nav, output, ruby, section, summary,\n  time, mark, audio, video {\n    padding: 0;\n    margin: 0;\n    font: inherit;\n    font-size: 100%;\n    vertical-align: baseline;\n    border: 0;\n  }\n\n  article, aside, details, figcaption, figure,\n  footer, header, hgroup, menu, nav, section {\n    display: block;\n  }\n\n  body {\n    line-height: 1;\n  }\n\n  ol, ul {\n    list-style: none;\n  }\n\n  blockquote, q {\n    quotes: none;\n  }\n\n  blockquote {\n    &::before,\n    &::after {\n      content: \"\";\n      content: none;\n    }\n  }\n\n  q {\n    &::before,\n    &::after {\n      content: \"\";\n      content: none;\n    }\n  }\n\n  table {\n    border-collapse: collapse;\n    border-spacing: 0;\n  }\n}\n\n@include meyer-reset;\n"
  },
  {
    "path": "src/scss/global/_typography.scss",
    "content": "// sass-lint:disable indentation, no-duplicate-properties\n// linting disabled due to @font-face declartions supporting multiple types\n\n// colfax - http://goo.gl/U2k5AW\n@font-face {\n  font-family: 'Colfax';\n  font-style: normal;\n  font-weight: 300;\n  src: url('#{$font-path}/colfax/colfax-light.woff2') format('woff2'),\n    url('#{$font-path}/colfax/colfax-light.woff') format('woff');\n}\n\n@font-face {\n  font-family: 'Colfax';\n  font-style: normal;\n  font-weight: 400;\n  src: url('#{$font-path}/colfax/colfax-regular.woff2') format('woff2'),\n    url('#{$font-path}/colfax/colfax-regular.woff') format('woff');\n}\n\n@font-face {\n  font-family: 'Colfax';\n  font-style: normal;\n  font-weight: 600;\n  src: url('#{$font-path}/colfax/colfax-medium.woff2') format('woff2'),\n    url('#{$font-path}/colfax/colfax-medium.woff') format('woff');\n}\n\n// icon font - http://icomoon.com\n@font-face {\n  font-family: 'styleguideicons';\n  font-style: normal;\n  font-weight: normal;\n  src: url('#{$font-path}/icons/style-guide-icons.eot');\n  src: url('#{$font-path}/icons/style-guide-icons.eot#iefix')\n      format('embedded-opentype'),\n    url('#{$font-path}/icons/style-guide-icons.ttf') format('truetype'),\n    url('#{$font-path}/icons/style-guide-icons.woff') format('woff'),\n    url('#{$font-path}/icons/style-guide-icons.svg#style-guide-icons')\n      format('svg');\n}\n\nbody {\n  @include colfax();\n  color: $slate-80;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\nh1,\nh2,\nh3,\nh4,\n.is-size-h1,\n.is-size-h2,\n.is-size-h3,\n.is-size-h4 {\n  font-weight: 600;\n  color: $slate;\n}\n\nh1,\n.is-size-h1 {\n  margin-bottom: 27px;\n  font-size: $scaleup-5;\n  line-height: $scaleup-6;\n  letter-spacing: -1px;\n}\n\nh2,\n.is-size-h2 {\n  margin-bottom: 18px;\n  font-size: 25px;\n  line-height: 30px;\n  letter-spacing: -0.5px;\n}\n\nh3,\n.is-size-h3 {\n  margin-bottom: 12px;\n  font-size: 18px;\n  line-height: 25px;\n}\n\nh4,\n.is-size-h4 {\n  margin-bottom: 9px;\n  font-size: 12px;\n  line-height: 15px;\n  letter-spacing: 1px;\n  color: $slate-80;\n  text-transform: uppercase;\n}\n\np,\n.is-p {\n  margin-bottom: 20px;\n  font-size: 16px;\n  line-height: 27px;\n\n  .sg-icon {\n    margin-right: 6px;\n    vertical-align: text-bottom;\n  }\n}\n\nol,\nul {\n  font-size: 13px;\n  line-height: 20px;\n  padding-left: $scaleup-1;\n}\n\nstrong {\n  font-weight: 600;\n}\n\nem {\n  font-style: italic;\n}\n\nstrong em,\nem strong {\n  font-style: italic;\n  font-weight: 600;\n}\n\nabbr {\n  text-decoration: none;\n  background-image: linear-gradient(to right, $slate 33%, $white 0%);\n  background-position: bottom;\n  background-repeat: repeat-x;\n  background-size: 3px 1px;\n}\n\n// TODO: only used in tables-empty.njk\n// remove after verifying that nothing is broken (replace w/ .is-centered ?)\n.is-center {\n  text-align: center;\n}\n\n.error {\n  color: $ron-burgundy;\n}\n\nsmall,\n.small {\n  font-size: 13px;\n  line-height: 20px;\n}\n\n.mono {\n  font-family: 'Andale Mono', Monaco, Consolas, 'Lucida Console', monospace;\n}\n\n.highlighter {\n  background-color: $color-highlighter;\n}\n\n.status-highlighter {\n  color: $mantis;\n}\n\n.is-weight-light {\n  font-weight: 300;\n}\n\n.is-weight-medium {\n  font-weight: 600;\n}\n\n.sg-icon {\n  @include icon-font-base;\n\n  &.is-size-20 {\n    font-size: 20px;\n  }\n\n  &.is-size-30 {\n    font-size: 30px;\n  }\n\n  &.is-size-40 {\n    font-size: 40px;\n  }\n\n  &.is-size-60 {\n    font-size: 60px;\n  }\n}\n\n.sg-icon-airplane {\n  &::before {\n    content: $icon-airplane;\n  }\n}\n\n.sg-icon-airplane-fill {\n  &::before {\n    content: $icon-airplane-fill;\n  }\n}\n\n.sg-icon-align-center {\n  &::before {\n    content: $icon-align-center;\n  }\n}\n\n.sg-icon-align-left {\n  &::before {\n    content: $icon-align-left;\n  }\n}\n\n.sg-icon-align-right {\n  &::before {\n    content: $icon-align-right;\n  }\n}\n\n.sg-icon-analytics {\n  &::before {\n    content: $icon-analytics;\n  }\n}\n\n.sg-icon-automation {\n  &::before {\n    content: $icon-automation;\n  }\n}\n\n.sg-icon-builder {\n  &::before {\n    content: $icon-builder;\n  }\n}\n\n.sg-icon-button {\n  &::before {\n    content: $icon-button;\n  }\n}\n\n.sg-icon-calendar {\n  &::before {\n    content: $icon-calendar;\n  }\n}\n\n.sg-icon-caret {\n  &::before {\n    content: $icon-caret;\n  }\n}\n\n.sg-icon-check {\n  &::before {\n    content: $icon-check;\n  }\n}\n\n.sg-icon-check-circle {\n  &::before {\n    content: $icon-check-circle;\n  }\n}\n\n// TODO: remove once we are sure this class isn't being used by engineering teams\n.sg-icon-check-circle-fill {\n  &::before {\n    content: $icon-status-positive;\n  }\n}\n\n.sg-icon-check-thin {\n  &::before {\n    content: $icon-check-thin;\n  }\n}\n\n.sg-icon-clean-ui {\n  &::before {\n    content: $icon-clean-ui;\n  }\n}\n\n.sg-icon-click {\n  &::before {\n    content: $icon-click;\n  }\n}\n\n.sg-icon-clock {\n  &::before {\n    content: $icon-clock;\n  }\n}\n\n.sg-icon-code {\n  &::before {\n    content: $icon-code;\n  }\n}\n\n.sg-icon-columns {\n  &::before {\n    content: $icon-columns;\n  }\n}\n\n.sg-icon-contacts {\n  &::before {\n    content: $icon-contacts;\n  }\n}\n\n.sg-icon-contacts-alt {\n  &::before {\n    content: $icon-contacts-alt;\n  }\n}\n\n.sg-icon-copy {\n  &::before {\n    content: $icon-copy;\n  }\n}\n\n.sg-icon-create {\n  &::before {\n    content: $icon-create;\n  }\n}\n\n.sg-icon-csv {\n  &::before {\n    content: $icon-csv;\n  }\n}\n\n.sg-icon-desktop-view {\n  &::before {\n    content: $icon-desktop-view;\n  }\n}\n\n.sg-icon-divider {\n  &::before {\n    content: $icon-divider;\n  }\n}\n\n.sg-icon-drag {\n  &::before {\n    content: $icon-drag;\n  }\n}\n\n.sg-icon-editor-code {\n  &::before {\n    content: $icon-editor-code;\n  }\n}\n\n.sg-icon-editor-design {\n  &::before {\n    content: $icon-editor-design;\n  }\n}\n\n.sg-icon-editor-old {\n  &::before {\n    content: $icon-editor-old;\n  }\n}\n\n.sg-icon-ellipsis {\n  &::before {\n    content: $icon-ellipsis;\n  }\n}\n\n.sg-icon-export {\n  &::before {\n    content: $icon-export;\n  }\n}\n\n.sg-icon-gear {\n  &::before {\n    content: $icon-gear;\n  }\n}\n\n.sg-icon-help {\n  &::before {\n    content: $icon-help;\n  }\n}\n\n.sg-icon-image {\n  &::before {\n    content: $icon-image;\n  }\n}\n\n.sg-icon-images {\n  &::before {\n    content: $icon-images;\n  }\n}\n\n.sg-icon-image-text {\n  &::before {\n    content: $icon-image-text;\n  }\n}\n\n.sg-icon-info-circle {\n  &::before {\n    content: $icon-info-circle;\n  }\n}\n\n.sg-icon-key {\n  &::before {\n    content: $icon-key;\n  }\n}\n\n.sg-icon-list {\n  &::before {\n    content: $icon-list;\n  }\n}\n\n.sg-icon-locked {\n  &::before {\n    content: $icon-locked;\n  }\n}\n\n.sg-icon-mail {\n  &::before {\n    content: $icon-mail;\n  }\n}\n\n.sg-icon-mail-search {\n  &::before {\n    content: $icon-mail-search;\n  }\n}\n\n.sg-icon-mobile-view {\n  &::before {\n    content: $icon-mobile-view;\n  }\n}\n\n.sg-icon-pencil {\n  &::before {\n    content: $icon-pencil;\n  }\n}\n\n.sg-icon-people {\n  &::before {\n    content: $icon-people;\n  }\n}\n\n.sg-icon-pie-chart {\n  &::before {\n    content: $icon-pie-chart;\n  }\n}\n\n.sg-icon-plus {\n  &::before {\n    content: $icon-plus;\n  }\n}\n\n.sg-icon-reload {\n  &::before {\n    content: $icon-reload;\n  }\n}\n\n.sg-icon-save-draft {\n  &::before {\n    content: $icon-save-draft;\n  }\n}\n\n.sg-icon-search {\n  &::before {\n    content: $icon-search;\n  }\n}\n\n.sg-icon-segment {\n  &::before {\n    content: $icon-segment;\n  }\n}\n\n.sg-icon-social {\n  &::before {\n    content: $icon-social;\n  }\n}\n\n.sg-icon-sort-asc {\n  &::before {\n    content: $icon-sort-asc;\n  }\n}\n\n.sg-icon-sort-desc {\n  &::before {\n    content: $icon-sort-desc;\n  }\n}\n\n.sg-icon-spacer {\n  &::before {\n    content: $icon-spacer;\n  }\n}\n\n.sg-icon-status-caution {\n  &::before {\n    content: $icon-status-caution;\n  }\n}\n\n.sg-icon-status-negative {\n  &::before {\n    content: $icon-status-negative;\n  }\n}\n\n.sg-icon-status-positive {\n  &::before {\n    content: $icon-status-positive;\n  }\n}\n\n.sg-icon-teammate {\n  &::before {\n    content: $icon-teammate;\n  }\n}\n\n.sg-icon-test-data {\n  &::before {\n    content: $icon-test-data;\n  }\n}\n\n.sg-icon-text {\n  &::before {\n    content: $icon-text;\n  }\n}\n\n.sg-icon-text-only {\n  &::before {\n    content: $icon-text-only;\n  }\n}\n\n.sg-icon-trash {\n  &::before {\n    content: $icon-trash;\n  }\n}\n\n.sg-icon-unlocked {\n  &::before {\n    content: $icon-unlocked;\n  }\n}\n\n.sg-icon-unsubscribe {\n  &::before {\n    content: $icon-unsubscribe;\n  }\n}\n\n.sg-icon-user-security {\n  &::before {\n    content: $icon-user-security;\n  }\n}\n\n.sg-icon-view {\n  &::before {\n    content: $icon-view;\n  }\n}\n\n.sg-icon-warning {\n  &::before {\n    content: $icon-warning;\n  }\n}\n\n.sg-icon-warning-triangle {\n  &::before {\n    content: $icon-warning-triangle;\n  }\n}\n\n.sg-icon-x {\n  &::before {\n    content: $icon-x;\n  }\n}\n\n.sg-icon-x-legacy {\n  &::before {\n    content: $icon-x-legacy;\n  }\n}\n"
  },
  {
    "path": "src/scss/global/_utilities.scss",
    "content": "// sass-lint:disable no-color-keywords, no-important\n// linting disabled due to custom color names matching predefined colors\n\n.hidden {\n  display: none !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n// color map for generating color and bg-color classes\n$colors: (\n  sg-blue:            $sg-blue,\n  sg-blue-80:         $sg-blue-80,\n  sg-blue-60:         $sg-blue-60,\n  sg-blue-40:         $sg-blue-40,\n  sg-blue-20:         $sg-blue-20,\n  sg-blue-10:         $sg-blue-10,\n  sg-blue-05:         $sg-blue-05,\n  sg-blue-02:         $sg-blue-02,\n  slate:              $slate,\n  slate-80:           $slate-80,\n  slate-60:           $slate-60,\n  slate-40:           $slate-40,\n  slate-20:           $slate-20,\n  slate-10:           $slate-10,\n  slate-05:           $slate-05,\n  slate-02:           $slate-02,\n  ron-burgundy:       $ron-burgundy,\n  burnt-orange:       $burnt-orange,\n  carrot:             $carrot,\n  mango:              $mango,\n  mantis:             $mantis,\n  spruce:             $spruce,\n  grass-stain:        $grass-stain,\n  lime:               $lime,\n  cobalt:             $cobalt,\n  bluebird:           $bluebird,\n  seafoam:            $seafoam,\n  caribbean:          $caribbean,\n  crown:              $crown,\n  screample:          $screample,\n  sangria:            $sangria,\n  lavender:         $lavender,\n  wild-strawberry:    $wild-strawberry,\n  steel:              $steel,\n  logo-accent-light:  $logo-accent-light,\n  logo-accent-medium: $logo-accent-medium,\n  logo-accent-dark:   $logo-accent-dark,\n  white:            #fff\n);\n\n// Color\n@each $name, $value in $colors {\n  .color-#{$name} {\n    color: $value;\n  }\n}\n\n@each $name, $value in $colors {\n  .bg-color-#{$name} {\n    background-color: $value;\n  }\n}\n\n// alignment\n.ta-center {\n  text-align: center;\n}\n\n.ta-left {\n  text-align: left;\n}\n\n.ta-right {\n  text-align: right;\n}\n\n.center {\n  margin: 0 auto;\n}\n\n// display\n.d-block {\n  display: block;\n}\n\n.d-inline {\n  display: inline;\n}\n\n.d-inline-block {\n  display: inline-block;\n}\n\n.hide {\n  display: none;\n}\n\n// misc\n.show-for-sr {\n  border: 0;\n  clip: rect(1px, 1px, 1px, 1px);\n  clip-path: inset(50%);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute !important;\n  width: 1px;\n  word-wrap: normal !important;\n}\n\n// margins\n.m-top-1 {\n  margin-top: $scaleup-1;\n}\n\n.m-top-2 {\n  margin-top: $scaleup-2;\n}\n\n.m-top-3 {\n  margin-top: $scaleup-3;\n}\n\n.m-top-4 {\n  margin-top: $scaleup-4;\n}\n\n.m-top-5 {\n  margin-top: $scaleup-5;\n}\n\n.m-top-6 {\n  margin-top: $scaleup-6;\n}\n\n.m-top-7 {\n  margin-top: $scaleup-7;\n}\n\n.m-top-8 {\n  margin-top: $scaleup-8;\n}\n\n.m-top-9 {\n  margin-top: $scaleup-9;\n}\n\n.m-top-10 {\n  margin-top: $scaleup-10;\n}\n\n.m-top-down-1 {\n  margin-top: $scaledown-1;\n}\n\n.m-top-down-2 {\n  margin-top: $scaledown-2;\n}\n\n// Sized Margins - Bottom\n.m-bottom-1 {\n  margin-bottom: $scaleup-1;\n}\n\n.m-bottom-2 {\n  margin-bottom: $scaleup-2;\n}\n\n.m-bottom-3 {\n  margin-bottom: $scaleup-3;\n}\n\n.m-bottom-4 {\n  margin-bottom: $scaleup-4;\n}\n\n.m-bottom-5 {\n  margin-bottom: $scaleup-5;\n}\n\n.m-bottom-6 {\n  margin-bottom: $scaleup-6;\n}\n\n.m-bottom-7 {\n  margin-bottom: $scaleup-7;\n}\n\n.m-bottom-8 {\n  margin-bottom: $scaleup-8;\n}\n\n.m-bottom-9 {\n  margin-bottom: $scaleup-9;\n}\n\n.m-bottom-10 {\n  margin-bottom: $scaleup-10;\n}\n\n.m-bottom-down-1 {\n  margin-bottom: $scaledown-1;\n}\n\n.m-bottom-down-2 {\n  margin-bottom: $scaledown-2;\n}\n\n// padding\n.p-top-1 {\n  padding-top: $scaleup-1;\n}\n\n.p-top-2 {\n  padding-top: $scaleup-2;\n}\n\n.p-top-3 {\n  padding-top: $scaleup-3;\n}\n\n.p-top-4 {\n  padding-top: $scaleup-4;\n}\n\n.p-top-5 {\n  padding-top: $scaleup-5;\n}\n\n.p-top-6 {\n  padding-top: $scaleup-6;\n}\n\n.p-top-7 {\n  padding-top: $scaleup-7;\n}\n\n.p-top-8 {\n  padding-top: $scaleup-8;\n}\n\n.p-top-9 {\n  padding-top: $scaleup-9;\n}\n\n.p-top-10 {\n  padding-top: $scaleup-10;\n}\n\n.p-top-down-1 {\n  padding-top: $scaledown-1;\n}\n\n.p-top-down-2 {\n  padding-top: $scaledown-2;\n}\n\n// Sized Margins - Bottom\n.p-bottom-1 {\n  padding-bottom: $scaleup-1;\n}\n\n.p-bottom-2 {\n  padding-bottom: $scaleup-2;\n}\n\n.p-bottom-3 {\n  padding-bottom: $scaleup-3;\n}\n\n.p-bottom-4 {\n  padding-bottom: $scaleup-4;\n}\n\n.p-bottom-5 {\n  padding-bottom: $scaleup-5;\n}\n\n.p-bottom-6 {\n  padding-bottom: $scaleup-6;\n}\n\n.p-bottom-7 {\n  padding-bottom: $scaleup-7;\n}\n\n.p-bottom-8 {\n  padding-bottom: $scaleup-8;\n}\n\n.p-bottom-9 {\n  padding-bottom: $scaleup-9;\n}\n\n.p-bottom-10 {\n  padding-bottom: $scaleup-10;\n}\n"
  },
  {
    "path": "src/scss/global/_variables.scss",
    "content": "// sendgrid style-guide variables\n\n$font-path: '../fonts' !default;\n$border-radius: 2px;\n\n// breakpoints\n$width-small-mobile: 320px;\n$width-nav-small: 350px;\n$width-nav-medium: 493px;\n$width-small: 610px;\n$width-medium: 990px;\n$width-large: 1200px;\n\n// The width we break to the mobile menu\n$width-mobile: 840px;\n\n// modular scale base\n// modularscale.com/?12,20&px&1.5\n$scale-base: 12px;\n\n// modular scale up\n$scale-base-up-01: 13px;\n$scale-base-up-02: 15px;\n$scale-base-up-03: 18px;\n$scale-base-up-04: 20px;\n$scale-base-up-05: 27px;\n$scale-base-up-06: 30px;\n$scale-base-up-07: 40px;\n$scale-base-up-08: 45px;\n$scale-base-up-09: 60px;\n$scale-base-up-10: 90px;\n\n// modular scale down\n$scale-base-down-01: 9px;\n$scale-base-down-02: 6px;\n$scale-base-down-03: 3px;\n\n$scaleup-11: 9.492rem; //152px\n$scaleup-10: 7.594rem; //121px\n$scaleup-9: 6.328rem; //101px\n$scaleup-8: 5.063rem; //81px\n$scaleup-7: 4.219rem; //68px\n$scaleup-6: 3.375rem; //54px\n$scaleup-5: 2.813rem; //45px\n$scaleup-4: 2.25rem; //36px\n$scaleup-3: 1.875rem; //30px\n$scaleup-2: 1.5rem; //24px\n$scaleup-1: 1.25rem; //20px\n$scale-0: 1rem; //16px\n$scaledown-1: 0.833rem; //13px\n$scaledown-2: 0.667rem; //11px\n$scaledown-3: 0.556rem; //9px\n$scaledown-4: 0.444rem; //7px\n$scaledown-5: 0.37rem; //6px\n$scaledown-6: 0.296rem; //5px\n$scaledown-7: 0.197rem; //3px\n\n// colors - primary\n$sg-blue: #1a82e2;\n$slate: #294661;\n\n// colors - primary shades\n$sg-blue-80: #489be8;\n$sg-blue-60: #76b4ee;\n$sg-blue-40: #a3cdf3;\n$sg-blue-20: #d1e6f9;\n$sg-blue-10: #e8f2fc;\n$sg-blue-05: #f3f9fd;\n$sg-blue-02: #fbfdff;\n\n$slate-80: #546b81;\n$slate-60: #7f90a0;\n$slate-40: #a9b5c0;\n$slate-20: #d4dadf;\n$slate-10: #e9ecef;\n$slate-05: #f4f6f7;\n$slate-02: #fbfbfc;\n\n// colors - logo accents\n$logo-accent-light: #99e1f4;\n$logo-accent-medium: #00b3e3;\n$logo-accent-dark: #009dd9;\n\n// colors - charting\n$ron-burgundy: #b71c1c;\n$burnt-orange: #ff5722;\n$carrot: #f90;\n$mango: #fdd835;\n$mantis: #18c96e;\n$spruce: #4cb04f;\n$grass-stain: #8ac24a;\n$kiwi: #62ffae;\n$lime: #cbdb39;\n$cobalt: #303f9f;\n$bluebird: #2196f3;\n$seafoam: #00bcd4;\n$caribbean: #00e5ff;\n$crown: #7b1fa2;\n$screample: #7c4dff;\n$sangria: #880e4f;\n$lavender: #dea7e8;\n$wild-strawberry: #ff4081;\n$steel: #9e9e9e;\n$white: #fff;\n$black: #000;\n$twilio-red: #F22F46;\n\n// design system colors\n$primary: #3368fa;\n$primary-hover: #1f4ed2;\n$secondary: #546b91;\n$secondary-hover: #f5f8ff;\n$dark-blue: #00163c;\n$blue: #002ca6;\n$mid-blue: #445f8c;\n$light-blue: #f5f8ff;\n$shadow: #c8d7ee;\n\n// colors - highlight\n$color-highlighter: rgba($mango, 0.6);\n\n// alerts\n$alert-success: #f1f7e9;\n$alert-success-text: #2e6b30;\n$alert-warning: #fefae6;\n$alert-warning-text: #8c6c15;\n$alert-danger: #f4dddd;\n$alert-danger-text: #b71c1c;\n$alert-verification: $mantis;\n$alert-trial: $slate;\n\n// gradients\n$gradient-hero: linear-gradient(165deg, rgba(209,230,249,1) 0%, rgba(243,249,253,1) 75%, rgba(255,255,255,1) 100%);\n$gradient-home-featured: linear-gradient(315deg, $seafoam, #6afcb1 );\n$gradient-callout: linear-gradient(300deg, rgba(36,132,223,1) 0%, rgba(92,176,255,1) 75%);\n$gradient-dev-glossary: linear-gradient(to bottom right, $kiwi, $mantis);\n$gradient-dev-callout: linear-gradient(to bottom, darken($slate, 10%), $slate);\n\n// buttons\n$btn-primary-bg: $sg-blue-80;\n$btn-primary-bg-hover: $sg-blue;\n$btn-primary-border: $sg-blue;\n$btn-primary-color: $white;\n$btn-primary-badge-bg: $white;\n$btn-primary-badge-color: $sg-blue;\n\n$btn-secondary-bg: $white;\n$btn-secondary-bg-hover: $sg-blue-10;\n$btn-secondary-border: $sg-blue-80;\n$btn-secondary-color: $sg-blue;\n$btn-secondary-badge-bg: $sg-blue;\n$btn-secondary-badge-color: $white;\n\n$btn-danger-bg: rgba($ron-burgundy, 0.8);\n$btn-danger-bg-hover: $ron-burgundy;\n$btn-danger-border: $ron-burgundy;\n$btn-danger-color: $white;\n$btn-danger-badge-bg: $white;\n$btn-danger-badge-color: $ron-burgundy;\n\n$btn-dark-bg: transparent;\n$btn-dark-bg-hover: rgba($white, 0.1);\n$btn-dark-border: rgba($white, 0.6);\n$btn-dark-color: $white;\n$btn-dark-badge-bg: $white;\n$btn-dark-badge-color: $slate;\n\n$btn-disabled-bg: $steel;\n$btn-disabled-border: $steel;\n$btn-disabled-color: $white;\n$btn-disabled-secondary-bg: $white;\n$btn-disabled-secondary-border: $steel;\n$btn-disabled-secondary-color: $steel;\n\n$btn-gear-color: $slate-60;\n$btn-gear-primary-color: $white;\n\n$btn-group-bg: $white;\n$btn-group-bg-hover: rgba($sg-blue, 0.1);\n$btn-group-bg-active: $sg-blue-80;\n$btn-group-border: rgba($sg-blue, 0.8);\n$btn-group-border-active: $sg-blue;\n$btn-group-color: $sg-blue;\n$btn-group-color-active: $white;\n\n$btn-selectable-border: $slate-20;\n$btn-selectable-border-hover: $sg-blue-40;\n$btn-selectable-border-active: $sg-blue;\n$btn-selectable-color: $slate-80;\n\n// center modals\n$center-modal-bg: $white;\n$center-modal-width: 600px;\n$center-modal-position: -($center-modal-width / 2);\n\n// dropzones\n$dropzone-bg: $slate-02;\n$dropzone-border: $slate-20;\n$dropzone-bg-active: $slate-05;\n$dropzone-border-active: $slate-60;\n$dropzone-hovered-bg: #e7f9f0;\n$dropzone-hovered-border: $mantis;\n\n// filters\n$segment-term-max-width: 1279px;\n\n// icons\n$icon-airplane: '\\e90b';\n$icon-airplane-fill: '\\e912';\n$icon-align-center: '\\e927';\n$icon-align-left: '\\e928';\n$icon-align-right: '\\e929';\n$icon-analytics: '\\e915';\n$icon-automation: '\\e939';\n$icon-builder: '\\e914';\n$icon-button: '\\e920';\n$icon-calendar: '\\e917';\n$icon-caret: '\\e900';\n$icon-check: '\\e905';\n$icon-check-circle: '\\e907';\n$icon-check-thin: '\\e938';\n$icon-clean-ui: '\\e916';\n$icon-click: '\\e93b';\n$icon-clock: '\\e90d';\n$icon-code: '\\e919';\n$icon-columns: '\\e923';\n$icon-contacts: '\\e913';\n$icon-contacts-alt: '\\e92c';\n$icon-copy: '\\e902';\n$icon-create: '\\e901';\n$icon-csv: '\\e92a';\n$icon-desktop-view: '\\e627';\n$icon-divider: '\\e91a';\n$icon-drag: '\\e91b';\n$icon-editor-code: '\\e934';\n$icon-editor-design: '\\e935';\n$icon-editor-old: '\\e933';\n$icon-ellipsis: '\\e90e';\n$icon-export: '\\e931';\n$icon-gear: '\\e608';\n$icon-help: '\\e932';\n$icon-image: '\\e91e';\n$icon-images: '\\e924';\n$icon-image-text: '\\e922';\n$icon-info-circle: '\\e903';\n$icon-key: '\\e918';\n$icon-list: '\\e92b';\n$icon-locked: '\\e91d';\n$icon-mail: '\\e61d';\n$icon-mail-search: '\\e92d';\n$icon-mobile-view: '\\e61c';\n$icon-pencil: '\\e624';\n$icon-people: '\\e601';\n$icon-pie-chart: '\\e606';\n$icon-plus: '\\e617';\n$icon-reload: '\\e926';\n$icon-save-draft: '\\e911';\n$icon-search: '\\e906';\n$icon-segment: '\\e609';\n$icon-social: '\\e925';\n$icon-sort-asc: '\\e910';\n$icon-sort-desc: '\\e90f';\n$icon-spacer: '\\e91f';\n$icon-status-caution: '\\e92f';\n$icon-status-negative: '\\e930';\n$icon-status-positive: '\\e92e';\n$icon-teammate: '\\e90c';\n$icon-test-data: '\\e937';\n$icon-text: '\\e921';\n$icon-text-only: '\\e603';\n$icon-trash: '\\e62b';\n$icon-unlocked: '\\e91c';\n$icon-unsubscribe: '\\e936';\n$icon-user-security: '\\e90a';\n$icon-view: '\\e600';\n$icon-warning: '\\e909';\n$icon-warning-triangle: '\\e904';\n$icon-x: '\\e908';\n$icon-x-legacy: '\\e62e';\n\n// loaders\n$loader-dark-light: rgba($white, 0.35);\n$loader-dark-medium: rgba($white, 0.75);\n$loader-dark-medium-solid: rgba($white, 0.9);\n$loader-dark-solid: $white;\n\n// modals\n$modal-bg: rgba($black, 0.5);\n$modal-width: 525px;\n$modal-height: 665px;\n$modal-footer-height: 71px;\n$modal-body-height: $modal-height - $modal-footer-height;\n$modal-z-index: 20000;\n$side-modal-shadow: -2px 0 6px rgba($slate, 0.1);\n\n// selects\n$select-disabled-color: rgba($steel, 0.4);\n$select2-disabled-border: rgba($steel, 0.4);\n$select2-disabled-placeholder: rgba($steel, 0.4);\n$select2-disabled-arrow: rgba($steel, 0.4);\n\n// switches\n$switch-background-z-index: 10;\n$switch-selector-z-index: 11;\n$switch-option-z-index: 12;\n\n// statistics tables\n$stats-delivered: $grass-stain;\n$stats-opens: $cobalt;\n$stats-unique-opens: $bluebird;\n$stats-clicks: $crown;\n$stats-unique-clicks: $screample;\n$stats-unsubscribes: $sangria;\n$stats-spam-reports: $ron-burgundy;\n\n// tables\n$compare-border-color: $slate-10;\n\n// text inputs\n$text-input-disabled-border: rgba($steel, 0.4);\n$text-input-disabled-color: rgba($steel, 0.4);\n$text-input-search-title-bg: rgba($sg-blue, 0.1);\n$text-area-disabled-border: rgba($steel, 0.4);\n$text-area-disabled-color: rgba($steel, 0.4);\n\n// tooltips\n$tooltip-bg: $slate;\n$tooltip-font-size: 12px;\n$tooltip-line-height: 18px;\n$tooltip-arrow-height: 6px;\n\n// z-index\n$dropdown-menu-z-index: 1000;\n$spotlight-circle-z-index: 10000;\n$spotlight-tooltip-z-index: 10010;\n\n$info-popup-z-index: 19000;\n"
  },
  {
    "path": "src/scss/style-guide.scss",
    "content": "// import global styles\n@import 'global/variables';\n@import 'global/mixins';\n@import 'global/reset';\n@import 'global/main';\n@import 'global/typography';\n@import 'global/grid';\n@import 'global/utilities';\n\n// import components\n@import 'components/alerts';\n@import 'components/badges';\n@import 'components/buttons';\n@import 'components/breadcrumbs';\n@import 'components/cards';\n@import 'components/tables';\n@import 'components/tabs';\n@import 'components/textareas';\n@import 'components/text-inputs';\n@import 'components/tooltips';\n@import 'components/algolia';\n"
  },
  {
    "path": "src/templates/category.jsx",
    "content": "import React from 'react';\nimport { graphql } from 'gatsby';\nimport _ from 'lodash';\nimport Group from '../components/Group';\nimport CATEGORIES from '../constants/categories';\nimport SEO from '../components/SEO';\nimport GROUPS from '../constants/groups';\nimport Layout from '../components/layout';\nimport './category.scss';\n\nclass CategoryTemplate extends React.Component {\n  static sortGroups(groupEdges) {\n    const groupsEdgesWithOrder = groupEdges.map((edge) => {\n      const order = GROUPS[edge.fieldValue] ? GROUPS[edge.fieldValue].order : null;\n      return { ...edge, order };\n    });\n\n    const groupEdgesSorted = _.sortBy(groupsEdgesWithOrder, ['order', 'name']);\n    return groupEdgesSorted;\n  }\n\n  renderGroups() {\n    const { data } = this.props;\n    const sortedGroups = CategoryTemplate.sortGroups(data.docs.group);\n\n    return sortedGroups.map((group) => {\n      const title = GROUPS[group.fieldValue] ? GROUPS[group.fieldValue].name : group.fieldValue;\n      return (\n        <div key={group.fieldValue} className=\"category-container col-md-6\">\n          <h2>{title}</h2>\n          <Group edges={group.edges} />\n        </div>\n      );\n    });\n  }\n\n  render() {\n    const { pathContext, location } = this.props;\n    const { category } = pathContext;\n    // If we don't have a \"pretty category\", make one out of the category context.\n    const title = CATEGORIES[category] ? CATEGORIES[category] : category.replace(/-/g, ' ');\n\n    return (\n      <Layout location={location} subNav={true}>\n        <div className=\"category-container container\">\n          <SEO postNode={this.props} postType=\"category\" />\n          <h1 className=\"page-title\">{title}</h1>\n          <div className=\"row\">\n            {this.renderGroups()}\n          </div>\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport default CategoryTemplate;\n\n/* eslint no-undef: \"off\" */\nexport const pageQuery = graphql`\n  query CategoryPage($category: String, $docType: String) {\n    docs: allMarkdownRemark(\n      limit: 1000\n      sort: { fields: [frontmatter___title], order: ASC }\n      filter: {\n        fields: {\n          docType: {eq: $docType}\n          category: {eq: $category}\n        }\n      }\n    ) {\n    group(field: fields___group){\n        totalCount\n        fieldValue\n        edges {\n          node {\n            frontmatter {\n              navigation {\n                show\n              }\n              order\n            }\n            fields {\n              docType\n              slug\n              permalink\n              category\n              title\n            }\n          }\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "src/templates/category.scss",
    "content": "@import '../scss/global/variables';\n@import '../scss/global/mixins';\n\n.group-links a {\n  display: block;\n  margin-top: $scaledown-3;\n  margin-bottom: $scaledown-3;\n  line-height: 27px;\n}\n\n.category-container {\n  margin-top: $scaleup-3;\n  margin-bottom: $scaleup-3;\n  padding-right: $scaleup-1;\n\n  .page-title {\n    text-transform: capitalize;\n  }\n}\n"
  },
  {
    "path": "src/templates/doc.jsx",
    "content": "import React from 'react';\nimport { graphql } from 'gatsby';\nimport RehypeReact from 'rehype-react';\nimport _ from 'lodash';\nimport config from '../../data/SiteConfig';\nimport SEO from '../components/SEO';\nimport AsideMenu from '../components/AsideMenu';\nimport CalloutLink from '../componentsMarkdown/CalloutLink';\nimport Callout from '../componentsMarkdown/Callout';\nimport Rating from '../components/Rating';\nimport Gist from '../componentsMarkdown/Gist';\nimport CodeGroup from '../componentsMarkdown/CodeGroup';\nimport withSubNav from '../components/NavSub';\nimport Layout from '../components/layout';\nimport './syntax-highlighting.scss';\nimport './doc.scss';\n\nconst renderAst = new RehypeReact({\n  createElement: React.createElement,\n  components: {\n    gist: Gist,\n    'call-out-link': CalloutLink,\n    'call-out': Callout,\n    'code-group': CodeGroup,\n  },\n}).Compiler;\n\nclass DocTemplate extends React.Component {\n  getLinks() {\n    const { data } = this.props;\n    const headers = data.doc.htmlAst.children.filter(el => el.type === 'element' && _.includes(['h2', 'h3'], el.tagName));\n    return headers.map((header) => {\n      const link = {};\n      link.tagName = header.tagName;\n      link.textNode = header.children[1] ? header.children[1].value : '';\n      link.id = header.properties.id;\n      return link;\n    });\n  }\n\n  getRepoLink() {\n    const { data } = this.props;\n    const {\n      permalink,\n    } = data.doc.fields;\n\n    const absPath = data.doc.fileAbsolutePath;\n    const filename = absPath.substring(absPath.lastIndexOf('/') + 1);\n    const fileSlug = filename.replace('.md', '');\n    const path = permalink.replace(`${fileSlug}/`, '');\n    const gitHubURL = config.gitHubMarkdownPath + path + filename;\n\n    return gitHubURL;\n  }\n\n  render() {\n    const { data, location } = this.props;\n    const postNode = data.doc;\n    const asideLinks = this.getLinks();\n\n    return (\n      <Layout location={location} subNav={true}>\n        <div className=\"container-lg doc-wrap\">\n          <SEO postNode={postNode} postType=\"doc\" />\n          {postNode.fields.docType !== 'glossary' && asideLinks.length\n            ? (<AsideMenu asideLinks={this.getLinks()} />)\n            : null\n          }\n          <div className=\"doc-main\">\n            <h1 dangerouslySetInnerHTML={{ __html: postNode.fields.title }} />\n            {renderAst(postNode.htmlAst)}\n            <Rating />\n            <div className=\"edit-this-page m-top-4 ta-center\">\n              <strong>See a mistake?</strong>\n              {' '}\n              <a href={this.getRepoLink()}>Edit this page</a>\n            </div>\n          </div>\n        </div>\n      </Layout>\n    );\n  }\n}\n\nexport default DocTemplate;\n\n/* eslint no-undef: \"off\" */\nexport const pageQuery = graphql`\n  query BlogPostByID($id: String!) {\n    doc: markdownRemark(id: { eq: $id } ) {\n      htmlAst\n      html\n      fileAbsolutePath\n      frontmatter {\n        seo {\n          title\n          description\n          keywords\n        }\n      }\n      fields {\n        slug\n        title\n        category\n        docType\n        permalink\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "src/templates/doc.scss",
    "content": "@import '../scss/global/variables';\n@import '../scss/global/mixins';\n\n$aside-width: 300px;\n\n.doc-wrap {\n  display: flex;\n\n  @media (max-width: $width-medium) {\n    flex-direction: column;\n  }\n}\n\n/* Push headings below paragraphs in the\nstacking order to prevent covering links */\n.release-note {\n  h2 {\n    display: block;\n    position: relative;\n    z-index: 1;\n  }\n  h3 {\n    display: block;\n    position: relative;\n    z-index: 0;\n  }\n}\n\n/* Pull elements above headings in the\nstacking order to prevent covering links */\n.release-notes-key, .release-note p {\n  position: relative;\n  z-index: 2;\n}\n\n.sg-remarked-linked-header {\n  display: block;\n\n  & > a.anchor {\n    margin-left: -25px;\n  }\n}\n\n\n/* Pad linked headers so they are not hidden behind the fixed top navbar\nNavbar height is:\n  256px at $width-small-mobile (its tallest)\n  138px at $width-medium (its shortest) */\n.doc-main > div > .sg-remarked-linked-header::before,\n.release-note h2::before,\n.release-note h3::before {\n  display: block;\n  height: 262px;\n  margin-top: -262px;\n  content: '';\n  visibility: hidden;\n\n  @media (min-width: $width-nav-small) {\n    height: 243px;\n    margin-top: -243px;\n  }\n  @media (min-width: $width-nav-medium) {\n    height: 223px;\n    margin-top: -223px;\n  }\n  @media (min-width: $width-small) {\n    height: 145px;\n    margin-top: -145px;\n  }\n}\n\n\n.doc-main {\n  flex: 1;\n  padding: 0 $scaleup-8 $scaleup-6;\n\n  @media (min-width: 991px) {\n      overflow: hidden;\n  }\n\n  @media (max-width: $width-medium) {\n    padding: 0 0 $scaleup-6;\n  }\n\n\n  ol, ul {\n    margin: $scaleup-1 0 $scaleup-1 $scaleup-1;\n\n    li {\n      list-style: decimal;\n      font-size: $scale-0;\n      line-height: 27px;\n    }\n  }\n\n  ul {\n    li {\n      list-style: disc;\n    }\n  }\n\n  li > ul {\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n}\n\n.doc-main ul {\n  list-style-type: disc;\n  margin-bottom: $scaleup-3;\n}\n\n.doc-main ol {\n  list-style-type: decimal;\n  margin-bottom: $scaleup-3;\n}\n\n.aside-nav {\n  padding-top: $scaledown-2;\n  padding-bottom: $scaledown-2;\n  position: sticky;\n  align-self: flex-start;\n  flex: 0 0 300px;\n  top: 192px;\n\n  @media (max-width: $width-medium) {\n    position: relative;\n    top: 0;\n  }\n}\n\n.aside-nav a {\n  display: block;\n  margin-bottom: $scale-0;\n  padding-left: 0;\n  padding-top: 2px;\n  line-height: $scaleup-1;\n  font-size: 14px;\n\n  @include colfax(600);\n}\n\n.aside-nav .h3 {\n  margin-left: $scaleup-2;\n  font-size: 13px;\n  color: $slate-80;\n\n  @include colfax(400);\n\n  &.active {\n    @include colfax(600);\n  }\n}\n\n.aside-nav__title {\n  color: $slate-40;\n  margin-bottom: $scale-0;\n  text-transform: uppercase;\n  font-size: 13px;\n\n  @include colfax(600);\n}\n\naside a.active {\n  border-left: 3px solid $sg-blue;\n  padding-left: 5px;\n  color: $slate-80;\n  @include colfax(600);\n}\n\n// custom Markdown components\n.callout {\n  padding: $scaleup-3 $scaleup-4;\n  margin: $scaleup-4 0;\n  position: relative;\n\n  &::before {\n    display: block;\n    text-transform: uppercase;\n    @include colfax(600);\n    font-size: $scaledown-1;\n    letter-spacing: 0.7px;\n  }\n}\n\n.callout p {\n  margin: $scaledown-3 0;\n}\n\n.callout p:last-child {\n  margin-bottom: 0;\n}\n\n.callout--beta {\n  background: rgba(124, 77, 255, 0.05);\n  border-left: 2px solid $screample;\n\n  &::before {\n    content: 'Beta';\n    color: $screample;\n  }\n}\n\n.callout--info {\n  background: $sg-blue-05;\n  border-left: 2px solid $sg-blue;\n\n  &::before {\n    content: 'Tip';\n    color: $sg-blue;\n  }\n}\n\n.callout--warning {\n  background: rgba(183, 28, 28, 0.05);\n  border-left: 2px solid $alert-danger-text;\n\n  &::before {\n    content: 'Alert';\n    color: $alert-danger-text;\n  }\n}\n\n.tabbed-code {\n  margin-bottom: $scaleup-6;\n\n  ul {\n    margin-left: 0;\n    list-style: none;\n\n    li {\n      font-size: 13px;\n    }\n  }\n}\n\n.tabbed-code__block {\n  display: none;\n}\n\n.tabbed-code__block.show {\n  display: block;\n}\n\n.tabbed-code .tab {\n  flex: 1;\n}\n\n.gatsby-resp-iframe-wrapper,\n.table-wrap {\n  margin: $scaleup-2 0;\n}\n\n.anchor {\n  svg {\n    margin-right: $scaledown-3;\n    path {\n      fill: $slate-20;\n    }\n  }\n\n  &:hover {\n    svg {\n      path {\n        fill: $sg-blue;\n      }\n    }\n  }\n}\n\n.gatsby-highlight {\n  margin: $scaleup-2 0;\n}\n\n.edit-this-page {\n  font-size: $scaledown-1;\n}\n\n.callout-link {\n  @include dropdown-shadow();\n\n  display: grid;\n  grid-template-columns: auto auto;\n  margin: $scaleup-4 0;\n\n  .sg-remarked-linked-header {\n    margin-left: 0;\n\n    > a {\n      display: none;\n    }\n  }\n}\n\n.callout-link {\n  display: flex;\n}\n\n.callout-link__copy {\n  padding: $scaleup-3 $scale-0 $scaleup-3 $scaleup-4;\n  flex-grow: 1;\n\n  > a {\n    text-transform: uppercase;\n  }\n\n  @media (max-width: 475px) {\n    p {\n      display: none;\n    }\n  }\n}\n\n.callout-link__img {\n  background-position: center center;\n  background-size: cover;\n  margin-left: $scaleup-1;\n  flex: 0 0 175px;\n}\n"
  },
  {
    "path": "src/templates/syntax-highlighting.scss",
    "content": "@import '../scss/global/variables';\n\n$code_purple: #7c4dff;\n$code_blue: #1a82e2;\n$code_green: #18c96e;\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n    font-family: Menlo, Consolas, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace;\n    font-size: 14px;\n    line-height: 1.75;\n    direction: ltr;\n    text-align: left;\n    white-space: pre;\n    word-spacing: normal;\n    word-break: normal;\n    -moz-tab-size: 4;\n    -o-tab-size: 4;\n    tab-size: 4;\n    -webkit-hyphens: none;\n    -moz-hyphens: none;\n    -ms-hyphens: none;\n    hyphens: none;\n    background: $slate-05;\n    color: $slate-80;\n}\n\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n    text-shadow: none;\n    background: $slate-20;\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n    text-shadow: none;\n    background: $slate-20;\n}\n\npre[class*=\"language-\"] {\n    padding: 1em;\n    margin: 0.5em 0;\n    overflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"] {\n    padding: 0.1em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n    color: $slate-80;\n}\n\n.token.comment {\n    color: $code_purple;\n}\n\n.token.punctuation {\n    color: $slate-80;\n}\n\n.token.namespace {\n    opacity: 0.7;\n}\n\n.token.operator,\n.token.boolean,\n.token.number {\n    color: $code_purple;\n}\n\n.token.property {\n    color: $code_blue;\n}\n\n.token.selector {\n    color: $code_purple;\n}\n\n.token.attr-name {\n    color: $code_purple;\n}\n\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n    color: $code_green;\n}\n\n.token.attr-value,\n.token.keyword,\n.token.control,\n.token.directive,\n.token.unit {\n    color: $code_green;\n}\n\n.token.statement,\n.token.regex,\n.token.atrule {\n    color: $code_purple;\n}\n\n.token.placeholder,\n.token.variable {\n    color: $code_blue;\n}\n\n.token.deleted {\n    text-decoration: line-through;\n}\n\n.token.inserted {\n    border-bottom: 1px dotted #fff;\n    text-decoration: none;\n}\n\n.token.italic {\n    font-style: italic;\n}\n\n.token.important,\n.token.bold {\n    font-weight: bold;\n}\n\n.token.important {\n    color: $code_blue;\n}\n\n.token.entity {\n    cursor: help;\n}\n\npre > code.highlight {\n    outline: 0.4em solid $code_blue;\n    outline-offset: 0.4em;\n}"
  },
  {
    "path": "static/assets/TwilioSendGrid_Sample_Dashboard_NoSubusers.json",
    "content": "{\n  \"name\": \"TwilioSendGrid_Sample_Dashboard\",\n  \"description\": null,\n  \"permissions\": \"PRIVATE\",\n  \"pages\": [\n    {\n      \"name\": \"TwilioSendGrid_Sample_Dashboard\",\n      \"description\": null,\n      \"widgets\": [\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 1,\n            \"row\": 4,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Deliveries\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Deliveries/{Stat}' \\n  TIMESERIES FACET Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.bar\"\n          },\n          \"layout\": {\n            \"column\": 6,\n            \"row\": 4,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Percentage\",\n          \"rawConfiguration\": {\n            \"dataFormatters\": [],\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND StatPercent LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/{Categories}/{StatPercent}'\\n   FACET Categories, StatPercent\"\n              }\n            ]\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 1,\n            \"row\": 8,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Engagement\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Engagement/{Stat}'\\n  TIMESERIES FACET Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 6,\n            \"row\": 8,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Compliance\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/TwilioSendGrid/Compliance/{Stat}'\\n  TIMESERIES FACET Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "static/assets/TwilioSendGrid_Sample_Dashboard_WithSubusers.json",
    "content": "{\n  \"name\": \"TwilioSendGrid_Sample_Dashboard_WithSubusers\",\n  \"description\": null,\n  \"permissions\": \"PRIVATE\",\n  \"pages\": [\n    {\n      \"name\": \"TwilioSendGrid_Sample_Dashboard_WithSubusers\",\n      \"description\": null,\n      \"widgets\": [\n        {\n          \"visualization\": {\n            \"id\": \"viz.table\"\n          },\n          \"layout\": {\n            \"column\": 1,\n            \"row\": 1,\n            \"height\": 3,\n            \"width\": 6\n          },\n          \"title\": \"All Users\",\n          \"rawConfiguration\": {\n            \"dataFormatters\": [],\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT MIN(newrelic.timeslice.value) as MIN\\n  WHERE appName = 'Twilio SendGrid' \\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/{Categories}' \\n  FACET AllUsers \"\n              }\n            ]\n          },\n          \"linkedEntityGuids\": [\n            \"MjgzMzAyN3xWSVp8REFTSEJPQVJEfDIwNzgzMjY\"\n          ]\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 1,\n            \"row\": 4,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Deliveries\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Deliveries/{Stat}' \\n  TIMESERIES FACET AllUsers, Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.bar\"\n          },\n          \"layout\": {\n            \"column\": 6,\n            \"row\": 4,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Percentage\",\n          \"rawConfiguration\": {\n            \"dataFormatters\": [],\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND StatPercent LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/{Categories}/{StatPercent}'\\n   FACET AllUsers, StatPercent\"\n              }\n            ]\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 1,\n            \"row\": 8,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Engagement\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Engagement/{Stat}'\\n  TIMESERIES FACET AllUsers, Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        },\n        {\n          \"visualization\": {\n            \"id\": \"viz.line\"\n          },\n          \"layout\": {\n            \"column\": 6,\n            \"row\": 8,\n            \"height\": 4,\n            \"width\": 5\n          },\n          \"title\": \"Compliance\",\n          \"rawConfiguration\": {\n            \"facet\": {\n              \"showOtherSeries\": false\n            },\n            \"legend\": {\n              \"enabled\": true\n            },\n            \"nrqlQueries\": [\n              {\n                \"accountId\": <AccountID>,\n                \"query\": \"FROM Metric SELECT average(newrelic.timeslice.value)\\n  WHERE appName = 'Twilio SendGrid' AND metricTimesliceName NOT LIKE '%Percent'\\n  WITH METRIC_FORMAT 'Custom/{AllUsers}/Compliance/{Stat}'\\n  TIMESERIES FACET AllUsers, Stat \"\n              }\n            ],\n            \"yAxisLeft\": {\n              \"zero\": true\n            }\n          },\n          \"linkedEntityGuids\": null\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "static/assets/example.csv",
    "content": "email,age,country,favorite_color,registration_date\nuser1@example.com,10,USA,red,01/01/2014\nexampexample@example.comom,20,USA,green,01/01/2014\nuser3@example.com,30,USA,blue,01/01/2014\nexample@example.com,40,USA,orange,01/01/2014\nuser5@example.com,50,USA,purple,01/01/2014\nuser6@example.com,10,Canada,yellow,01/01/2014\nuser7@example.com,20,Canada,cerulean,01/01/2014\nuser8@example.com,30,Canada,puce,01/01/2014\nuser9@example.com,40,Canada,olive,01/01/2014\nuser10@example.com,50,Canada,white,01/01/2014"
  },
  {
    "path": "static/assets/global-ca466351408fcb1dae4bdec742db56d2.js",
    "content": "/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */\n;!function(b,a){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=b.document?a(b,!0):function(c){if(!c.document){throw new Error(\"jQuery requires a window with a document\")}return a(c)}:a(b)}(\"undefined\"!=typeof window?window:this,function(bO,bv){var bC=[],bx=bO.document,bJ=Object.getPrototypeOf,bB=bC.slice,bS=bC.concat,bw=bC.push,bs=bC.indexOf,bF={},bQ=bF.toString,bM=bF.hasOwnProperty,bA=bM.toString,bP=bA.call(Object),bK={},bL=function bO(a){return\"function\"==typeof a&&\"number\"!=typeof a.nodeType},bn=function bO(a){return null!=a&&a===a.window},br={type:!0,src:!0,noModule:!0};function bE(c,b,f){var a,d=(b=b||bx).createElement(\"script\");if(d.text=c,f){for(a in br){f[a]&&(d[a]=f[a])}}b.head.appendChild(d).parentNode.removeChild(d)}function bp(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?bF[bQ.call(a)]||\"object\":typeof a}var bR=\"3.3.1\",bq=function(b,a){return new bq.fn.init(b,a)},b4=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;bq.fn=bq.prototype={jquery:\"3.3.1\",constructor:bq,length:0,toArray:function(){return bB.call(this)},get:function(a){return null==a?bB.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(b){var a=bq.merge(this.constructor(),b);return a.prevObject=this,a},each:function(a){return bq.each(this,a)},map:function(a){return this.pushStack(bq.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(bB.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b){var a=this.length,c=+b+(b<0?a:0);return this.pushStack(c>=0&&c<a?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:bw,sort:bC.sort,splice:bC.splice},bq.extend=bq.fn.extend=function(){var h,m,d,b,g,c,j=arguments[0]||{},p=1,k=arguments.length,f=!1;for(\"boolean\"==typeof j&&(f=j,j=arguments[p]||{},p++),\"object\"==typeof j||bL(j)||(j={}),p===k&&(j=this,p--);p<k;p++){if(null!=(h=arguments[p])){for(m in h){d=j[m],j!==(b=h[m])&&(f&&b&&(bq.isPlainObject(b)||(g=Array.isArray(b)))?(g?(g=!1,c=d&&Array.isArray(d)?d:[]):c=d&&bq.isPlainObject(d)?d:{},j[m]=bq.extend(f,c,b)):void 0!==b&&(j[m]=b))}}}return j},bq.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isPlainObject:function(b){var a,c;return !(!b||\"[object Object]\"!==bQ.call(b))&&(!(a=bJ(b))||\"function\"==typeof(c=bM.call(a,\"constructor\")&&a.constructor)&&bA.call(c)===bP)},isEmptyObject:function(b){var a;for(a in b){return !1}return !0},globalEval:function(a){bE(a)},each:function(c,a){var d,b=0;if(cu(c)){for(d=c.length;b<d;b++){if(!1===a.call(c[b],b,c[b])){break}}}else{for(b in c){if(!1===a.call(c[b],b,c[b])){break}}}return c},trim:function(a){return null==a?\"\":(a+\"\").replace(b4,\"\")},makeArray:function(b,a){var c=a||[];return null!=b&&(cu(Object(b))?bq.merge(c,\"string\"==typeof b?[b]:b):bw.call(c,b)),c},inArray:function(b,a,c){return null==a?-1:bs.call(a,b,c)},merge:function(d,b){for(var f=+b.length,c=0,a=d.length;c<f;c++){d[a++]=b[c]}return d.length=a,d},grep:function(h,d,k){for(var g,c=[],j=0,b=h.length,f=!k;j<b;j++){(g=!d(h[j],j))!==f&&c.push(h[j])}return c},map:function(f,b,h){var d,a,g=0,c=[];if(cu(f)){for(d=f.length;g<d;g++){null!=(a=b(f[g],g,h))&&c.push(a)}}else{for(g in f){null!=(a=b(f[g],g,h))&&c.push(a)}}return bS.apply([],c)},guid:1,support:bK}),\"function\"==typeof Symbol&&(bq.fn[Symbol.iterator]=bC[Symbol.iterator]),bq.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(b,a){bF[\"[object \"+a+\"]\"]=a.toLowerCase()});function cu(b){var a=!!b&&\"length\" in b&&b.length,c=bp(b);return !bL(b)&&!bn(b)&&(\"array\"===c||0===a||\"number\"==typeof a&&a>0&&a-1 in b)}var cp=function(dk){var c1,c8,c3,df,c7,dq,c2,c0,db,dm,dj,c6,dl,dg,di,cW,cZ,c9,cX,dp=\"sizzle\"+1*new Date,cY=dk.document,dy=0,dU=0,dR=dX(),dc=dX(),dA=dX(),dS=function(b,a){return b===a&&(dj=!0),0},dG={}.hasOwnProperty,dW=[],dd=dW.pop,c5=dW.push,dJ=dW.push,dO=dW.slice,dE=function(c,a){for(var d=0,b=c.length;d<b;d++){if(c[d]===a){return d}}return -1},dD=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",dI=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",dB=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",dM=\"\\\\[\"+dI+\"*(\"+dB+\")(?:\"+dI+\"*([*^$|!~]?=)\"+dI+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+dB+\"))|)\"+dI+\"*\\\\]\",dv=\":(\"+dB+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+dM+\")*)|.*)\\\\)|)\",d1=new RegExp(dI+\"+\",\"g\"),dV=new RegExp(\"^\"+dI+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+dI+\"+$\",\"g\"),dQ=new RegExp(\"^\"+dI+\"*,\"+dI+\"*\"),dr=new RegExp(\"^\"+dI+\"*([>+~]|\"+dI+\")\"+dI+\"*\"),cV=new RegExp(\"=\"+dI+\"*([^\\\\]'\\\"]*?)\"+dI+\"*\\\\]\",\"g\"),du=new RegExp(dv),dx=new RegExp(\"^\"+dB+\"$\"),dw={ID:new RegExp(\"^#(\"+dB+\")\"),CLASS:new RegExp(\"^\\\\.(\"+dB+\")\"),TAG:new RegExp(\"^(\"+dB+\"|[*])\"),ATTR:new RegExp(\"^\"+dM),PSEUDO:new RegExp(\"^\"+dv),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+dI+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+dI+\"*(?:([+-]|)\"+dI+\"*(\\\\d+)|))\"+dI+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+dD+\")$\",\"i\"),needsContext:new RegExp(\"^\"+dI+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+dI+\"*((?:-\\\\d)?\\\\d*)\"+dI+\"*\\\\)|)(?=[^-]|$)\",\"i\")},dP=/^(?:input|select|textarea|button)$/i,dt=/^h\\d$/i,dC=/^[^{]+\\{\\s*\\[native \\w/,dL=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,dK=/[+~]/,ds=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+dI+\"?|(\"+dI+\")|.)\",\"ig\"),at=function(c,a,d){var b=\"0x\"+a-65536;return b!==b||d?a:b<0?String.fromCharCode(b+65536):String.fromCharCode(b>>10|55296,1023&b|56320)},dT=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,dN=function(b,a){return a?\"\\0\"===b?\"\\ufffd\":b.slice(0,-1)+\"\\\\\"+b.charCodeAt(b.length-1).toString(16)+\" \":\"\\\\\"+b},d6=function(){c6()},da=dZ(function(a){return !0===a.disabled&&(\"form\" in a||\"label\" in a)},{dir:\"parentNode\",next:\"legend\"});try{dJ.apply(dW=dO.call(cY.childNodes),cY.childNodes),dW[cY.childNodes.length].nodeType}catch(dk){dJ={apply:dW.length?function(b,a){c5.apply(b,dO.call(a))}:function(c,a){var d=c.length,b=0;while(c[d++]=a[b++]){}c.length=d-1}}}function dh(u,y,a,k){var b,z,g,w,p,n,x,d=y&&y.ownerDocument,j=y?y.nodeType:9;if(a=a||[],\"string\"!=typeof u||!u||1!==j&&9!==j&&11!==j){return a}if(!k&&((y?y.ownerDocument||y:cY)!==dl&&c6(y),y=y||dl,di)){if(11!==j&&(p=dL.exec(u))){if(b=p[1]){if(9===j){if(!(g=y.getElementById(b))){return a}if(g.id===b){return a.push(g),a}}else{if(d&&(g=d.getElementById(b))&&cX(y,g)&&g.id===b){return a.push(g),a}}}else{if(p[2]){return dJ.apply(a,y.getElementsByTagName(u)),a}if((b=p[3])&&c8.getElementsByClassName&&y.getElementsByClassName){return dJ.apply(a,y.getElementsByClassName(b)),a}}}if(c8.qsa&&!dA[u+\" \"]&&(!cW||!cW.test(u))){if(1!==j){d=y,x=u}else{if(\"object\"!==y.nodeName.toLowerCase()){(w=y.getAttribute(\"id\"))?w=w.replace(dT,dN):y.setAttribute(\"id\",w=dp),z=(n=dq(u)).length;while(z--){n[z]=\"#\"+w+\" \"+cU(n[z])}x=n.join(\",\"),d=dK.test(u)&&dY(y.parentNode)||y}}if(x){try{return dJ.apply(a,d.querySelectorAll(x)),a}catch(u){}finally{w===dp&&y.removeAttribute(\"id\")}}}}return c0(u.replace(dV,\"$1\"),y,a,k)}function dX(){var b=[];function a(d,c){return b.push(d+\" \")>c3.cacheLength&&delete a[b.shift()],a[d+\" \"]=c}return a}function d0(a){return a[dp]=!0,a}function dn(b){var a=dl.createElement(\"fieldset\");try{return !!b(a)}catch(b){return !1}finally{a.parentNode&&a.parentNode.removeChild(a),a=null}}function d5(c,b){var d=c.split(\"|\"),a=d.length;while(a--){c3.attrHandle[d[a]]=b}}function c4(c,a){var d=a&&c,b=d&&1===c.nodeType&&1===a.nodeType&&c.sourceIndex-a.sourceIndex;if(b){return b}if(d){while(d=d.nextSibling){if(d===a){return -1}}}return c?1:-1}function d4(a){return function(b){return\"input\"===b.nodeName.toLowerCase()&&b.type===a}}function cT(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function ct(a){return function(b){return\"form\" in b?b.parentNode&&!1===b.disabled?\"label\" in b?\"label\" in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&da(b)===a:b.disabled===a:\"label\" in b&&b.disabled===a}}function dF(a){return d0(function(b){return b=+b,d0(function(g,e){var d,f=a([],g.length,b),c=f.length;while(c--){g[d=f[c]]&&(g[d]=!(e[d]=g[d]))}})})}function dY(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c8=dh.support={},c7=dh.isXML=function(b){var a=b&&(b.ownerDocument||b).documentElement;return !!a&&\"HTML\"!==a.nodeName},c6=dh.setDocument=function(f){var d,c,b=f?f.ownerDocument||f:cY;return b!==dl&&9===b.nodeType&&b.documentElement?(dl=b,dg=dl.documentElement,di=!c7(dl),cY!==dl&&(c=dl.defaultView)&&c.top!==c&&(c.addEventListener?c.addEventListener(\"unload\",d6,!1):c.attachEvent&&c.attachEvent(\"onunload\",d6)),c8.attributes=dn(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c8.getElementsByTagName=dn(function(a){return a.appendChild(dl.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c8.getElementsByClassName=dC.test(dl.getElementsByClassName),c8.getById=dn(function(a){return dg.appendChild(a).id=dp,!dl.getElementsByName||!dl.getElementsByName(dp).length}),c8.getById?(c3.filter.ID=function(g){var a=g.replace(ds,at);return function(h){return h.getAttribute(\"id\")===a}},c3.find.ID=function(g,a){if(\"undefined\"!=typeof a.getElementById&&di){var h=a.getElementById(g);return h?[h]:[]}}):(c3.filter.ID=function(g){var a=g.replace(ds,at);return function(h){var i=\"undefined\"!=typeof h.getAttributeNode&&h.getAttributeNode(\"id\");return i&&i.value===a}},c3.find.ID=function(j,g){if(\"undefined\"!=typeof g.getElementById&&di){var l,h,a,k=g.getElementById(j);if(k){if((l=k.getAttributeNode(\"id\"))&&l.value===j){return[k]}a=g.getElementsByName(j),h=0;while(k=a[h++]){if((l=k.getAttributeNode(\"id\"))&&l.value===j){return[k]}}}return[]}}),c3.find.TAG=c8.getElementsByTagName?function(g,a){return\"undefined\"!=typeof a.getElementsByTagName?a.getElementsByTagName(g):c8.qsa?a.querySelectorAll(g):void 0}:function(j,g){var l,h=[],a=0,k=g.getElementsByTagName(j);if(\"*\"===j){while(l=k[a++]){1===l.nodeType&&h.push(l)}return h}return k},c3.find.CLASS=c8.getElementsByClassName&&function(g,a){if(\"undefined\"!=typeof a.getElementsByClassName&&di){return a.getElementsByClassName(g)}},cZ=[],cW=[],(c8.qsa=dC.test(dl.querySelectorAll))&&(dn(function(a){dg.appendChild(a).innerHTML=\"<a id='\"+dp+\"'></a><select id='\"+dp+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&cW.push(\"[*^$]=\"+dI+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||cW.push(\"\\\\[\"+dI+\"*(?:value|\"+dD+\")\"),a.querySelectorAll(\"[id~=\"+dp+\"-]\").length||cW.push(\"~=\"),a.querySelectorAll(\":checked\").length||cW.push(\":checked\"),a.querySelectorAll(\"a#\"+dp+\"+*\").length||cW.push(\".#.+[+~]\")}),dn(function(g){g.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var a=dl.createElement(\"input\");a.setAttribute(\"type\",\"hidden\"),g.appendChild(a).setAttribute(\"name\",\"D\"),g.querySelectorAll(\"[name=d]\").length&&cW.push(\"name\"+dI+\"*[*^$|!~]?=\"),2!==g.querySelectorAll(\":enabled\").length&&cW.push(\":enabled\",\":disabled\"),dg.appendChild(g).disabled=!0,2!==g.querySelectorAll(\":disabled\").length&&cW.push(\":enabled\",\":disabled\"),g.querySelectorAll(\"*,:x\"),cW.push(\",.*:\")})),(c8.matchesSelector=dC.test(c9=dg.matches||dg.webkitMatchesSelector||dg.mozMatchesSelector||dg.oMatchesSelector||dg.msMatchesSelector))&&dn(function(a){c8.disconnectedMatch=c9.call(a,\"*\"),c9.call(a,\"[s!='']:x\"),cZ.push(\"!=\",dv)}),cW=cW.length&&new RegExp(cW.join(\"|\")),cZ=cZ.length&&new RegExp(cZ.join(\"|\")),d=dC.test(dg.compareDocumentPosition),cX=d||dC.test(dg.contains)?function(h,a){var i=9===h.nodeType?h.documentElement:h,g=a&&a.parentNode;return h===g||!(!g||1!==g.nodeType||!(i.contains?i.contains(g):h.compareDocumentPosition&&16&h.compareDocumentPosition(g)))}:function(g,a){if(a){while(a=a.parentNode){if(a===g){return !0}}}return !1},dS=d?function(h,a){if(h===a){return dj=!0,0}var g=!h.compareDocumentPosition-!a.compareDocumentPosition;return g||(1&(g=(h.ownerDocument||h)===(a.ownerDocument||a)?h.compareDocumentPosition(a):1)||!c8.sortDetached&&a.compareDocumentPosition(h)===g?h===dl||h.ownerDocument===cY&&cX(cY,h)?-1:a===dl||a.ownerDocument===cY&&cX(cY,a)?1:dm?dE(dm,h)-dE(dm,a):0:4&g?-1:1)}:function(m,j){if(m===j){return dj=!0,0}var u,l=0,h=m.parentNode,p=j.parentNode,g=[m],k=[j];if(!h||!p){return m===dl?-1:j===dl?1:h?-1:p?1:dm?dE(dm,m)-dE(dm,j):0}if(h===p){return c4(m,j)}u=m;while(u=u.parentNode){g.unshift(u)}u=j;while(u=u.parentNode){k.unshift(u)}while(g[l]===k[l]){l++}return l?c4(g[l],k[l]):g[l]===cY?-1:k[l]===cY?1:0},dl):dl},dh.matches=function(b,a){return dh(b,null,null,a)},dh.matchesSelector=function(c,a){if((c.ownerDocument||c)!==dl&&c6(c),a=a.replace(cV,\"='$1']\"),c8.matchesSelector&&di&&!dA[a+\" \"]&&(!cZ||!cZ.test(a))&&(!cW||!cW.test(a))){try{var b=c9.call(c,a);if(b||c8.disconnectedMatch||c.document&&11!==c.document.nodeType){return b}}catch(c){}}return dh(a,dl,null,[c]).length>0},dh.contains=function(b,a){return(b.ownerDocument||b)!==dl&&c6(b),cX(b,a)},dh.attr=function(c,b){(c.ownerDocument||c)!==dl&&c6(c);var a=c3.attrHandle[b.toLowerCase()],d=a&&dG.call(c3.attrHandle,b.toLowerCase())?a(c,b,!di):void 0;return void 0!==d?d:c8.attributes||!di?c.getAttribute(b):(d=c.getAttributeNode(b))&&d.specified?d.value:null},dh.escape=function(a){return(a+\"\").replace(dT,dN)},dh.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},dh.uniqueSort=function(d){var b,c=[],a=0,f=0;if(dj=!c8.detectDuplicates,dm=!c8.sortStable&&d.slice(0),d.sort(dS),dj){while(b=d[f++]){b===d[f]&&(a=c.push(f))}while(a--){d.splice(c[a],1)}}return dm=null,d},df=dh.getText=function(c){var a,f=\"\",b=0,d=c.nodeType;if(d){if(1===d||9===d||11===d){if(\"string\"==typeof c.textContent){return c.textContent}for(c=c.firstChild;c;c=c.nextSibling){f+=df(c)}}else{if(3===d||4===d){return c.nodeValue}}}else{while(a=c[b++]){f+=df(a)}}return f},(c3=dh.selectors={cacheLength:50,createPseudo:d0,match:dw,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ds,at),a[3]=(a[3]||a[4]||a[5]||\"\").replace(ds,at),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||dh.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&dh.error(a[0]),a},PSEUDO:function(b){var a,c=!b[6]&&b[2];return dw.CHILD.test(b[0])?null:(b[3]?b[2]=b[4]||b[5]||\"\":c&&du.test(c)&&(a=dq(c,!0))&&(a=c.indexOf(\")\",c.length-a)-c.length)&&(b[0]=b[0].slice(0,a),b[2]=c.slice(0,a)),b.slice(0,3))}},filter:{TAG:function(b){var a=b.replace(ds,at).toLowerCase();return\"*\"===b?function(){return !0}:function(c){return c.nodeName&&c.nodeName.toLowerCase()===a}},CLASS:function(b){var a=dR[b+\" \"];return a||(a=new RegExp(\"(^|\"+dI+\")\"+b+\"(\"+dI+\"|$)\"))&&dR(b,function(c){return a.test(\"string\"==typeof c.className&&c.className||\"undefined\"!=typeof c.getAttribute&&c.getAttribute(\"class\")||\"\")})},ATTR:function(b,a,c){return function(e){var d=dh.attr(e,b);return null==d?\"!=\"===a:!a||(d+=\"\",\"=\"===a?d===c:\"!=\"===a?d!==c:\"^=\"===a?c&&0===d.indexOf(c):\"*=\"===a?c&&d.indexOf(c)>-1:\"$=\"===a?c&&d.slice(-c.length)===c:\"~=\"===a?(\" \"+d.replace(d1,\" \")+\" \").indexOf(c)>-1:\"|=\"===a&&(d===c||d.slice(0,c.length+1)===c+\"-\"))}},CHILD:function(h,d,k,g,c){var j=\"nth\"!==h.slice(0,3),b=\"last\"!==h.slice(-4),f=\"of-type\"===d;return 1===g&&0===c?function(a){return !!a.parentNode}:function(F,e,E){var o,A,w,a,z,r,s=j!==b?\"nextSibling\":\"previousSibling\",B=F.parentNode,D=f&&F.nodeName.toLowerCase(),i=!E&&!f,C=!1;if(B){if(j){while(s){a=F;while(a=a[s]){if(f?a.nodeName.toLowerCase()===D:1===a.nodeType){return !1}}r=s=\"only\"===h&&!r&&\"nextSibling\"}return !0}if(r=[b?B.firstChild:B.lastChild],b&&i){C=(z=(o=(A=(w=(a=B)[dp]||(a[dp]={}))[a.uniqueID]||(w[a.uniqueID]={}))[h]||[])[0]===dy&&o[1])&&o[2],a=z&&B.childNodes[z];while(a=++z&&a&&a[s]||(C=z=0)||r.pop()){if(1===a.nodeType&&++C&&a===F){A[h]=[dy,z,C];break}}}else{if(i&&(C=z=(o=(A=(w=(a=F)[dp]||(a[dp]={}))[a.uniqueID]||(w[a.uniqueID]={}))[h]||[])[0]===dy&&o[1]),!1===C){while(a=++z&&a&&a[s]||(C=z=0)||r.pop()){if((f?a.nodeName.toLowerCase()===D:1===a.nodeType)&&++C&&(i&&((A=(w=a[dp]||(a[dp]={}))[a.uniqueID]||(w[a.uniqueID]={}))[h]=[dy,C]),a===F)){break}}}}return(C-=c)===g||C%g==0&&C/g>=0}}},PSEUDO:function(c,b){var d,a=c3.pseudos[c]||c3.setFilters[c.toLowerCase()]||dh.error(\"unsupported pseudo: \"+c);return a[dp]?a(b):a.length>1?(d=[c,c,\"\",b],c3.setFilters.hasOwnProperty(c.toLowerCase())?d0(function(h,j){var g,i=a(h,b),f=i.length;while(f--){h[g=dE(h,i[f])]=!(j[g]=i[f])}}):function(f){return a(f,0,d)}):a}},pseudos:{not:d0(function(c){var a=[],d=[],b=c2(c.replace(dV,\"$1\"));return b[dp]?d0(function(k,h,m,g){var l,f=b(k,null,g,[]),j=k.length;while(j--){(l=f[j])&&(k[j]=!(h[j]=l))}}):function(g,f,h){return a[0]=g,b(a,null,h,d),a[0]=null,!d.pop()}}),has:d0(function(a){return function(b){return dh(a,b).length>0}}),contains:d0(function(a){return a=a.replace(ds,at),function(b){return(b.textContent||b.innerText||df(b)).indexOf(a)>-1}}),lang:d0(function(a){return dx.test(a||\"\")||dh.error(\"unsupported lang: \"+a),a=a.replace(ds,at).toLowerCase(),function(b){var c;do{if(c=di?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\")){return(c=c.toLowerCase())===a||0===c.indexOf(a+\"-\")}}while((b=b.parentNode)&&1===b.nodeType);return !1}}),target:function(a){var b=dk.location&&dk.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===dg},focus:function(a){return a===dl.activeElement&&(!dl.hasFocus||dl.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:ct(!1),disabled:ct(!0),checked:function(b){var a=b.nodeName.toLowerCase();return\"input\"===a&&!!b.checked||\"option\"===a&&!!b.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling){if(a.nodeType<6){return !1}}return !0},parent:function(a){return !c3.pseudos.empty(a)},header:function(a){return dt.test(a.nodeName)},input:function(a){return dP.test(a.nodeName)},button:function(b){var a=b.nodeName.toLowerCase();return\"input\"===a&&\"button\"===b.type||\"button\"===a},text:function(b){var a;return\"input\"===b.nodeName.toLowerCase()&&\"text\"===b.type&&(null==(a=b.getAttribute(\"type\"))||\"text\"===a.toLowerCase())},first:dF(function(){return[0]}),last:dF(function(b,a){return[a-1]}),eq:dF(function(b,a,c){return[c<0?c+a:c]}),even:dF(function(b,a){for(var c=0;c<a;c+=2){b.push(c)}return b}),odd:dF(function(b,a){for(var c=1;c<a;c+=2){b.push(c)}return b}),lt:dF(function(c,a,d){for(var b=d<0?d+a:d;--b>=0;){c.push(b)}return c}),gt:dF(function(c,a,d){for(var b=d<0?d+a:d;++b<a;){c.push(b)}return c})}}).pseudos.nth=c3.pseudos.eq;for(c1 in {radio:!0,checkbox:!0,file:!0,password:!0,image:!0}){c3.pseudos[c1]=d4(c1)}for(c1 in {submit:!0,reset:!0}){c3.pseudos[c1]=cT(c1)}function d2(){}d2.prototype=c3.filters=c3.pseudos,c3.setFilters=new d2,dq=dh.tokenize=function(h,p){var d,g,b,k,r,m,f,j=dc[h+\" \"];if(j){return p?0:j.slice(0)}r=h,m=[],f=c3.preFilter;while(r){d&&!(g=dQ.exec(r))||(g&&(r=r.slice(g[0].length)||r),m.push(b=[])),d=!1,(g=dr.exec(r))&&(d=g.shift(),b.push({value:d,type:g[0].replace(dV,\" \")}),r=r.slice(d.length));for(k in c3.filter){!(g=dw[k].exec(r))||f[k]&&!(g=f[k](g))||(d=g.shift(),b.push({value:d,type:k,matches:g}),r=r.slice(d.length))}if(!d){break}}return p?r.length:r?dh.error(h):dc(h,m).slice(0)};function cU(c){for(var a=0,d=c.length,b=\"\";a<d;a++){b+=c[a].value}return b}function dZ(h,d,k){var g=d.dir,c=d.next,j=c||g,b=k&&\"parentNode\"===j,f=dU++;return d.first?function(e,l,a){while(e=e[g]){if(1===e.nodeType||b){return h(e,l,a)}}return !1}:function(i,s,e){var a,r,m,o=[dy,f];if(e){while(i=i[g]){if((1===i.nodeType||b)&&h(i,s,e)){return !0}}}else{while(i=i[g]){if(1===i.nodeType||b){if(m=i[dp]||(i[dp]={}),r=m[i.uniqueID]||(m[i.uniqueID]={}),c&&c===i.nodeName.toLowerCase()){i=i[g]||i}else{if((a=r[j])&&a[0]===dy&&a[1]===f){return o[2]=a[2]}if(r[j]=o,o[2]=h(i,s,e)){return !0}}}}}return !1}}function d7(a){return a.length>1?function(c,e,d){var b=a.length;while(b--){if(!a[b](c,e,d)){return !1}}return !0}:a[0]}function dz(d,b,f){for(var c=0,a=b.length;c<a;c++){dh(d,b[c],f)}return f}function bt(h,m,d,b,g){for(var c,j=[],p=0,k=h.length,f=null!=m;p<k;p++){(c=h[p])&&(d&&!d(c,b,g)||(j.push(c),f&&m.push(p)))}return j}function d3(d,b,g,c,a,f){return c&&!c[dp]&&(c=d3(c)),a&&!a[dp]&&(a=d3(a,f)),d0(function(i,x,B,A){var j,t,n,e=[],r=[],k=x.length,m=i||dz(b||\"*\",B.nodeType?[B]:B,[]),w=!d||!i&&b?m:bt(m,e,d,B,A),z=g?a||(i?d:k||c)?[]:x:w;if(g&&g(w,z,B,A),c){j=bt(z,r),c(j,[],B,A),t=j.length;while(t--){(n=j[t])&&(z[r[t]]=!(w[r[t]]=n))}}if(i){if(a||d){if(a){j=[],t=z.length;while(t--){(n=z[t])&&j.push(w[t]=n)}a(null,z=[],j,A)}t=z.length;while(t--){(n=z[t])&&(j=a?dE(i,n):e[t])>-1&&(i[j]=!(x[j]=n))}}}else{z=bt(z===x?z.splice(k,z.length):z),a?a(null,x,z,A):dJ.apply(x,z)}})}function dH(k){for(var v,g,h,d=k.length,m=c3.relative[k[0].type],w=m||c3.relative[\" \"],r=m?1:0,l=dZ(function(a){return a===v},w,!0),j=dZ(function(a){return dE(v,a)>-1},w,!0),b=[function(f,o,c){var a=!m&&(c||o!==db)||((v=o).nodeType?l(f,o,c):j(f,o,c));return v=null,a}];r<d;r++){if(g=c3.relative[k[r].type]){b=[dZ(d7(b),g)]}else{if((g=c3.filter[k[r].type].apply(null,k[r].matches))[dp]){for(h=++r;h<d;h++){if(c3.relative[k[h].type]){break}}return d3(r>1&&d7(b),r>1&&cU(k.slice(0,r-1).concat({value:\" \"===k[r-2].type?\"*\":\"\"})).replace(dV,\"$1\"),g,r<h&&dH(k.slice(r,h)),h<d&&dH(k=k.slice(h)),h<d&&cU(k))}b.push(g)}}return d7(b)}function cS(c,b){var f=b.length>0,a=c.length>0,d=function(g,A,H,F,p){var n,l,t,D=0,i=\"0\",z=g&&[],r=[],B=db,e=g||a&&c3.find.TAG(\"*\",p),G=dy+=null==B?1:Math.random()||0.1,j=e.length;for(p&&(db=A===dl||A||p);i!==j&&null!=(n=e[i]);i++){if(a&&n){l=0,A||n.ownerDocument===dl||(c6(n),H=!di);while(t=c[l++]){if(t(n,A||dl,H)){F.push(n);break}}p&&(dy=G)}f&&((n=!t&&n)&&D--,g&&z.push(n))}if(D+=i,f&&i!==D){l=0;while(t=b[l++]){t(z,r,A,H)}if(g){if(D>0){while(i--){z[i]||r[i]||(r[i]=dd.call(F))}}r=bt(r)}dJ.apply(F,r),p&&!g&&r.length>0&&D+b.length>1&&dh.uniqueSort(F)}return p&&(dy=G,db=B),z};return f?d0(d):d}return c2=dh.compile=function(d,b){var g,c=[],a=[],f=dA[d+\" \"];if(!f){b||(b=dq(d)),g=b.length;while(g--){(f=dH(b[g]))[dp]?c.push(f):a.push(f)}(f=dA(d,cS(a,c))).selector=d}return f},c0=dh.select=function(m,w,g,j){var b,v,h,s,k,a=\"function\"==typeof m&&m,r=!j&&dq(m=a.selector||m);if(g=g||[],1===r.length){if((v=r[0]=r[0].slice(0)).length>2&&\"ID\"===(h=v[0]).type&&9===w.nodeType&&di&&c3.relative[v[1].type]){if(!(w=(c3.find.ID(h.matches[0].replace(ds,at),w)||[])[0])){return g}a&&(w=w.parentNode),m=m.slice(v.shift().value.length)}b=dw.needsContext.test(m)?0:v.length;while(b--){if(h=v[b],c3.relative[s=h.type]){break}if((k=c3.find[s])&&(j=k(h.matches[0].replace(ds,at),dK.test(v[0].type)&&dY(w.parentNode)||w))){if(v.splice(b,1),!(m=j.length&&cU(v))){return dJ.apply(g,j),g}break}}}return(a||c2(m,r))(j,w,!di,g,!w||dK.test(m)&&dY(w.parentNode)||w),g},c8.sortStable=dp.split(\"\").sort(dS).join(\"\")===dp,c8.detectDuplicates=!!dj,c6(),c8.sortDetached=dn(function(a){return 1&a.compareDocumentPosition(dl.createElement(\"fieldset\"))}),dn(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||d5(\"type|href|height|width\",function(b,a,c){if(!c){return b.getAttribute(a,\"type\"===a.toLowerCase()?1:2)}}),c8.attributes&&dn(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||d5(\"value\",function(b,a,c){if(!c&&\"input\"===b.nodeName.toLowerCase()){return b.defaultValue}}),dn(function(a){return null==a.getAttribute(\"disabled\")})||d5(dD,function(c,a,d){var b;if(!d){return !0===c[a]?a.toLowerCase():(b=c.getAttributeNode(a))&&b.specified?b.value:null}}),dh}(bO);bq.find=cp,bq.expr=cp.selectors,bq.expr[\":\"]=bq.expr.pseudos,bq.uniqueSort=bq.unique=cp.uniqueSort,bq.text=cp.getText,bq.isXMLDoc=cp.isXML,bq.contains=cp.contains,bq.escapeSelector=cp.escape;var bG=function(d,b,f){var c=[],a=void 0!==f;while((d=d[b])&&9!==d.nodeType){if(1===d.nodeType){if(a&&bq(d).is(f)){break}c.push(d)}}return c},b6=function(b,a){for(var c=[];b;b=b.nextSibling){1===b.nodeType&&b!==a&&c.push(b)}return c},cr=bq.expr.match.needsContext;function cd(b,a){return b.nodeName&&b.nodeName.toLowerCase()===a.toLowerCase()}var cx=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function bH(b,a,c){return bL(a)?bq.grep(b,function(f,d){return !!a.call(f,d,f)!==c}):a.nodeType?bq.grep(b,function(d){return d===a!==c}):\"string\"!=typeof a?bq.grep(b,function(d){return bs.call(a,d)>-1!==c}):bq.filter(a,b,c)}bq.filter=function(c,a,d){var b=a[0];return d&&(c=\":not(\"+c+\")\"),1===a.length&&1===b.nodeType?bq.find.matchesSelector(b,c)?[b]:[]:bq.find.matches(c,bq.grep(a,function(f){return 1===f.nodeType}))},bq.fn.extend({find:function(d){var b,f,c=this.length,a=this;if(\"string\"!=typeof d){return this.pushStack(bq(d).filter(function(){for(b=0;b<c;b++){if(bq.contains(a[b],this)){return !0}}}))}for(f=this.pushStack([]),b=0;b<c;b++){bq.find(d,a[b],f)}return c>1?bq.uniqueSort(f):f},filter:function(a){return this.pushStack(bH(this,a||[],!1))},not:function(a){return this.pushStack(bH(this,a||[],!0))},is:function(a){return !!bH(this,\"string\"==typeof a&&cr.test(a)?bq(a):a||[],!1).length}});var by,cg=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(bq.fn.init=function(c,b,f){var a,d;if(!c){return this}if(f=f||by,\"string\"==typeof c){if(!(a=\"<\"===c[0]&&\">\"===c[c.length-1]&&c.length>=3?[null,c,null]:cg.exec(c))||!a[1]&&b){return !b||b.jquery?(b||f).find(c):this.constructor(b).find(c)}if(a[1]){if(b=b instanceof bq?b[0]:b,bq.merge(this,bq.parseHTML(a[1],b&&b.nodeType?b.ownerDocument||b:bx,!0)),cx.test(a[1])&&bq.isPlainObject(b)){for(a in b){bL(this[a])?this[a](b[a]):this.attr(a,b[a])}}return this}return(d=bx.getElementById(a[2]))&&(this[0]=d,this.length=1),this}return c.nodeType?(this[0]=c,this.length=1,this):bL(c)?void 0!==f.ready?f.ready(c):c(bq):bq.makeArray(c,this)}).prototype=bq.fn,by=bq(bx);var cl=/^(?:parents|prev(?:Until|All))/,cb={children:!0,contents:!0,next:!0,prev:!0};bq.fn.extend({has:function(b){var a=bq(b,this),c=a.length;return this.filter(function(){for(var d=0;d<c;d++){if(bq.contains(this,a[d])){return !0}}})},closest:function(g,d){var j,f=0,c=this.length,h=[],b=\"string\"!=typeof g&&bq(g);if(!cr.test(g)){for(;f<c;f++){for(j=this[f];j&&j!==d;j=j.parentNode){if(j.nodeType<11&&(b?b.index(j)>-1:1===j.nodeType&&bq.find.matchesSelector(j,g))){h.push(j);break}}}}return this.pushStack(h.length>1?bq.uniqueSort(h):h)},index:function(a){return a?\"string\"==typeof a?bs.call(bq(a),this[0]):bs.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(b,a){return this.pushStack(bq.uniqueSort(bq.merge(this.get(),bq(b,a))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function ca(b,a){while((b=b[a])&&1!==b.nodeType){}return b}bq.each({parent:function(b){var a=b.parentNode;return a&&11!==a.nodeType?a:null},parents:function(a){return bG(a,\"parentNode\")},parentsUntil:function(b,a,c){return bG(b,\"parentNode\",c)},next:function(a){return ca(a,\"nextSibling\")},prev:function(a){return ca(a,\"previousSibling\")},nextAll:function(a){return bG(a,\"nextSibling\")},prevAll:function(a){return bG(a,\"previousSibling\")},nextUntil:function(b,a,c){return bG(b,\"nextSibling\",c)},prevUntil:function(b,a,c){return bG(b,\"previousSibling\",c)},siblings:function(a){return b6((a.parentNode||{}).firstChild,a)},children:function(a){return b6(a.firstChild)},contents:function(a){return cd(a,\"iframe\")?a.contentDocument:(cd(a,\"template\")&&(a=a.content||a),bq.merge([],a.childNodes))}},function(b,a){bq.fn[b]=function(e,d){var c=bq.map(this,a,e);return\"Until\"!==b.slice(-5)&&(d=e),d&&\"string\"==typeof d&&(c=bq.filter(d,c)),this.length>1&&(cb[b]||bq.uniqueSort(c),cl.test(b)&&c.reverse()),this.pushStack(c)}});var cf=/[^\\x20\\t\\r\\n\\f]+/g;function b7(b){var a={};return bq.each(b.match(cf)||[],function(c,d){a[d]=!0}),a}bq.Callbacks=function(h){h=\"string\"==typeof h?b7(h):bq.extend({},h);var m,d,b,g,c=[],j=[],p=-1,k=function(){for(g=g||h.once,b=m=!0;j.length;p=-1){d=j.shift();while(++p<c.length){!1===c[p].apply(d[0],d[1])&&h.stopOnFalse&&(p=c.length,d=!1)}}h.memory||(d=!1),m=!1,g&&(c=d?[]:\"\")},f={add:function(){return c&&(d&&!a&&(p=c.length-1,j.push(d)),function a(e){bq.each(e,function(l,i){bL(i)?h.unique&&f.has(i)||c.push(i):i&&i.length&&\"string\"!==bp(i)&&a(i)})}(arguments),d&&!a&&k()),this},remove:function(){return bq.each(arguments,function(i,a){var l;while((l=bq.inArray(a,c,l))>-1){c.splice(l,1),l<=p&&p--}}),this},has:function(a){return a?bq.inArray(a,c)>-1:c.length>0},empty:function(){return c&&(c=[]),this},disable:function(){return g=j=[],c=d=\"\",this},disabled:function(){return !c},lock:function(){return g=j=[],d||m||(c=d=\"\"),this},locked:function(){return !!g},fireWith:function(a,i){return g||(i=[a,(i=i||[]).slice?i.slice():i],j.push(i),m||k()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return !!b}};return f};function ck(a){return a}function b0(a){throw a}function cH(d,b,f,c){var a;try{d&&bL(a=d.promise)?a.call(d).done(b).fail(f):d&&bL(a=d.then)?a.call(d,b,f):b.apply(void 0,[d].slice(c))}catch(d){f.apply(void 0,[d])}}bq.extend({Deferred:function(b){var e=[[\"notify\",\"progress\",bq.Callbacks(\"memory\"),bq.Callbacks(\"memory\"),2],[\"resolve\",\"done\",bq.Callbacks(\"once memory\"),bq.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",bq.Callbacks(\"once memory\"),bq.Callbacks(\"once memory\"),1,\"rejected\"]],c=\"pending\",a={state:function(){return c},always:function(){return d.done(arguments).fail(arguments),this},\"catch\":function(f){return a.then(null,f)},pipe:function(){var f=arguments;return bq.Deferred(function(g){bq.each(e,function(k,j){var h=bL(f[j[4]])&&f[j[4]];d[j[1]](function(){var i=h&&h.apply(this,arguments);i&&bL(i.promise)?i.promise().progress(g.notify).done(g.resolve).fail(g.reject):g[j[0]+\"With\"](this,h?[i]:arguments)})}),f=null}).promise()},then:function(h,j,g){var k=0;function f(m,p,o,l){return function(){var r=this,n=arguments,i=function(){var u,s;if(!(m<k)){if((u=o.apply(r,n))===p.promise()){throw new TypeError(\"Thenable self-resolution\")}s=u&&(\"object\"==typeof u||\"function\"==typeof u)&&u.then,bL(s)?l?s.call(u,f(k,p,ck,l),f(k,p,b0,l)):(k++,s.call(u,f(k,p,ck,l),f(k,p,b0,l),f(k,p,ck,p.notifyWith))):(o!==ck&&(r=void 0,n=[u]),(l||p.resolveWith)(r,n))}},t=l?i:function(){try{i()}catch(s){bq.Deferred.exceptionHook&&bq.Deferred.exceptionHook(s,t.stackTrace),m+1>=k&&(o!==b0&&(r=void 0,n=[s]),p.rejectWith(r,n))}};m?t():(bq.Deferred.getStackHook&&(t.stackTrace=bq.Deferred.getStackHook()),bO.setTimeout(t))}}return bq.Deferred(function(i){e[0][3].add(f(0,i,bL(g)?g:ck,i.notifyWith)),e[1][3].add(f(0,i,bL(h)?h:ck)),e[2][3].add(f(0,i,bL(j)?j:b0))}).promise()},promise:function(f){return null!=f?bq.extend(f,a):a}},d={};return bq.each(e,function(i,g){var f=g[2],h=g[5];a[g[1]]=f.add,h&&f.add(function(){c=h},e[3-i][2].disable,e[3-i][3].disable,e[0][2].lock,e[0][3].lock),f.add(g[3].fire),d[g[0]]=function(){return d[g[0]+\"With\"](this===d?void 0:this,arguments),this},d[g[0]+\"With\"]=f.fireWith}),a.promise(d),b&&b.call(d,d),d},when:function(h){var d=arguments.length,j=d,g=Array(j),c=bB.call(arguments),b=bq.Deferred(),f=function(a){return function(e){g[a]=this,c[a]=arguments.length>1?bB.call(arguments):e,--d||b.resolveWith(g,c)}};if(d<=1&&(cH(h,b.done(f(j)).resolve,b.reject,!d),\"pending\"===b.state()||bL(c[j]&&c[j].then))){return b.then()}while(j--){cH(c[j],f(j),b.reject)}return b.promise()}});var cv=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;bq.Deferred.exceptionHook=function(a,b){bO.console&&bO.console.warn&&a&&cv.test(a.name)&&bO.console.warn(\"jQuery.Deferred exception: \"+a.message,a.stack,b)},bq.readyException=function(a){bO.setTimeout(function(){throw a})};var co=bq.Deferred();bq.fn.ready=function(a){return co.then(a)[\"catch\"](function(b){bq.readyException(b)}),this},bq.extend({isReady:!1,readyWait:1,ready:function(a){(!0===a?--bq.readyWait:bq.isReady)||(bq.isReady=!0,!0!==a&&--bq.readyWait>0||co.resolveWith(bx,[bq]))}}),bq.ready.then=co.then;function bU(){bx.removeEventListener(\"DOMContentLoaded\",bU),bO.removeEventListener(\"load\",bU),bq.ready()}\"complete\"===bx.readyState||\"loading\"!==bx.readyState&&!bx.documentElement.doScroll?bO.setTimeout(bq.ready):(bx.addEventListener(\"DOMContentLoaded\",bU),bO.addEventListener(\"load\",bU));var bm=function(h,m,d,b,g,c,j){var p=0,k=h.length,f=null==d;if(\"object\"===bp(d)){g=!0;for(p in d){bm(h,m,p,d[p],!0,c,j)}}else{if(void 0!==b&&(g=!0,bL(b)||(j=!0),f&&(j?(m.call(h,b),m=null):(f=m,m=function(i,a,l){return f.call(bq(i),l)})),m)){for(;p<k;p++){m(h[p],d,j?b:b.call(h[p],p,m(h[p],d)))}}}return g?h:f?m.call(h):k?m(h[0],d):c},bZ=/^-ms-/,b3=/-([a-z])/g;function b1(b,a){return a.toUpperCase()}function cm(a){return a.replace(bZ,\"ms-\").replace(b3,b1)}var bY=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function b9(){this.expando=bq.expando+b9.uid++}b9.uid=1,b9.prototype={cache:function(b){var a=b[this.expando];return a||(a={},bY(b)&&(b.nodeType?b[this.expando]=a:Object.defineProperty(b,this.expando,{value:a,configurable:!0}))),a},set:function(d,b,f){var c,a=this.cache(d);if(\"string\"==typeof b){a[cm(b)]=f}else{for(c in b){a[cm(c)]=b[c]}}return a},get:function(b,a){return void 0===a?this.cache(b):b[this.expando]&&b[this.expando][cm(a)]},access:function(b,a,c){return void 0===a||a&&\"string\"==typeof a&&void 0===c?this.get(b,a):(this.set(b,a,c),void 0!==c?c:a)},remove:function(c,a){var d,b=c[this.expando];if(void 0!==b){if(void 0!==a){d=(a=Array.isArray(a)?a.map(cm):(a=cm(a)) in b?[a]:a.match(cf)||[]).length;while(d--){delete b[a[d]]}}(void 0===a||bq.isEmptyObject(b))&&(c.nodeType?c[this.expando]=void 0:delete c[this.expando])}},hasData:function(b){var a=b[this.expando];return void 0!==a&&!bq.isEmptyObject(a)}};var cj=new b9,ch=new b9,bW=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,a9=/[A-Z]/g;function aM(a){return\"true\"===a||\"false\"!==a&&(\"null\"===a?null:a===+a+\"\"?+a:bW.test(a)?JSON.parse(a):a)}function cy(c,a,d){var b;if(void 0===d&&1===c.nodeType){if(b=\"data-\"+a.replace(a9,\"-$&\").toLowerCase(),\"string\"==typeof(d=c.getAttribute(b))){try{d=aM(d)}catch(c){}ch.set(c,a,d)}else{d=void 0}}return d}bq.extend({hasData:function(a){return ch.hasData(a)||cj.hasData(a)},data:function(b,a,c){return ch.access(b,a,c)},removeData:function(b,a){ch.remove(b,a)},_data:function(b,a,c){return cj.access(b,a,c)},_removeData:function(b,a){cj.remove(b,a)}}),bq.fn.extend({data:function(g,d){var j,f,c,h=this[0],b=h&&h.attributes;if(void 0===g){if(this.length&&(c=ch.get(h),1===h.nodeType&&!cj.get(h,\"hasDataAttrs\"))){j=b.length;while(j--){b[j]&&0===(f=b[j].name).indexOf(\"data-\")&&(f=cm(f.slice(5)),cy(h,f,c[f]))}cj.set(h,\"hasDataAttrs\",!0)}return c}return\"object\"==typeof g?this.each(function(){ch.set(this,g)}):bm(this,function(a){var e;if(h&&void 0===a){if(void 0!==(e=ch.get(h,g))){return e}if(void 0!==(e=cy(h,g))){return e}}else{this.each(function(){ch.set(this,g,a)})}},null,d,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){ch.remove(this,a)})}}),bq.extend({queue:function(c,a,d){var b;if(c){return a=(a||\"fx\")+\"queue\",b=cj.get(c,a),d&&(!b||Array.isArray(d)?b=cj.access(c,a,bq.makeArray(d)):b.push(d)),b||[]}},dequeue:function(g,d){d=d||\"fx\";var j=bq.queue(g,d),f=j.length,c=j.shift(),h=bq._queueHooks(g,d),b=function(){bq.dequeue(g,d)};\"inprogress\"===c&&(c=j.shift(),f--),c&&(\"fx\"===d&&j.unshift(\"inprogress\"),delete h.stop,c.call(g,b,h)),!f&&h&&h.empty.fire()},_queueHooks:function(b,a){var c=a+\"queueHooks\";return cj.get(b,c)||cj.access(b,c,{empty:bq.Callbacks(\"once memory\").add(function(){cj.remove(b,[a+\"queue\",c])})})}}),bq.fn.extend({queue:function(b,a){var c=2;return\"string\"!=typeof b&&(a=b,b=\"fx\",c--),arguments.length<c?bq.queue(this[0],b):void 0===a?this:this.each(function(){var d=bq.queue(this,b,a);bq._queueHooks(this,b),\"fx\"===b&&\"inprogress\"!==d[0]&&bq.dequeue(this,b)})},dequeue:function(a){return this.each(function(){bq.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(h,d){var k,g=1,c=bq.Deferred(),j=this,b=this.length,f=function(){--g||c.resolveWith(j,[j])};\"string\"!=typeof h&&(d=h,h=void 0),h=h||\"fx\";while(b--){(k=cj.get(j[b],h+\"queueHooks\"))&&k.empty&&(g++,k.empty.add(f))}return f(),c.promise(d)}});var a4=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,aC=new RegExp(\"^(?:([+-])=|)(\"+a4+\")([a-z%]*)$\",\"i\"),bV=[\"Top\",\"Right\",\"Bottom\",\"Left\"],cE=function(b,a){return\"none\"===(b=a||b).style.display||\"\"===b.style.display&&bq.contains(b.ownerDocument,b)&&\"none\"===bq.css(b,\"display\")},aU=function(g,d,j,f){var c,h,b={};for(h in d){b[h]=g.style[h],g.style[h]=d[h]}c=j.apply(g,f||[]);for(h in d){g.style[h]=b[h]}return c};function aE(j,v,f,b){var h,d,m=20,w=b?function(){return b.cur()}:function(){return bq.css(j,v,\"\")},p=w(),g=f&&f[3]||(bq.cssNumber[v]?\"\":\"px\"),k=(bq.cssNumber[v]||\"px\"!==g&&+p)&&aC.exec(bq.css(j,v));if(k&&k[3]!==g){p/=2,g=g||k[3],k=+p||1;while(m--){bq.style(j,v,k+g),(1-d)*(1-(d=w()/p||0.5))<=0&&(m=0),k/=d}k*=2,bq.style(j,v,k+g),f=f||[]}return f&&(k=+k||+p||0,h=f[1]?k+(f[1]+1)*f[2]:+f[2],b&&(b.unit=g,b.start=k,b.end=h)),h}var cR={};function bI(d){var b,f=d.ownerDocument,c=d.nodeName,a=cR[c];return a||(b=f.body.appendChild(f.createElement(c)),a=bq.css(b,\"display\"),b.parentNode.removeChild(b),\"none\"===a&&(a=\"block\"),cR[c]=a,a)}function a1(g,d){for(var j,f,c=[],h=0,b=g.length;h<b;h++){(f=g[h]).style&&(j=f.style.display,d?(\"none\"===j&&(c[h]=cj.get(f,\"display\")||null,c[h]||(f.style.display=\"\")),\"\"===f.style.display&&cE(f)&&(c[h]=bI(f))):\"none\"!==j&&(c[h]=\"none\",cj.set(f,\"display\",j)))}for(h=0;h<b;h++){null!=c[h]&&(g[h].style.display=c[h])}return g}bq.fn.extend({show:function(){return a1(this,!0)},hide:function(){return a1(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){cE(this)?bq(this).show():bq(this).hide()})}});var bl=/^(?:checkbox|radio)$/i,bi=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,aK=/^$|^module$|\\/(?:java|ecma)script/i,aS={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};aS.optgroup=aS.option,aS.tbody=aS.tfoot=aS.colgroup=aS.caption=aS.thead,aS.th=aS.td;function cL(b,a){var c;return c=\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a||\"*\"):\"undefined\"!=typeof b.querySelectorAll?b.querySelectorAll(a||\"*\"):[],void 0===a||a&&cd(b,a)?bq.merge([b],c):c}function aw(c,a){for(var d=0,b=c.length;d<b;d++){cj.set(c[d],\"globalEval\",!a||cj.get(a[d],\"globalEval\"))}}var cJ=/<|&#?\\w+;/;function ac(y,D,k,b,v){for(var j,B,E,C,m,A,x=D.createDocumentFragment(),g=[],z=0,w=y.length;z<w;z++){if((j=y[z])||0===j){if(\"object\"===bp(j)){bq.merge(g,j.nodeType?[j]:j)}else{if(cJ.test(j)){B=B||x.appendChild(D.createElement(\"div\")),E=(bi.exec(j)||[\"\",\"\"])[1].toLowerCase(),C=aS[E]||aS._default,B.innerHTML=C[1]+bq.htmlPrefilter(j)+C[2],A=C[0];while(A--){B=B.lastChild}bq.merge(g,B.childNodes),(B=x.firstChild).textContent=\"\"}else{g.push(D.createTextNode(j))}}}}x.textContent=\"\",z=0;while(j=g[z++]){if(b&&bq.inArray(j,b)>-1){v&&v.push(j)}else{if(m=bq.contains(j.ownerDocument,j),B=cL(x.appendChild(j),\"script\"),m&&aw(B),k){A=0;while(j=B[A++]){aK.test(j.type||\"\")&&k.push(j)}}}}return x}!function(){var b=bx.createDocumentFragment().appendChild(bx.createElement(\"div\")),a=bx.createElement(\"input\");a.setAttribute(\"type\",\"radio\"),a.setAttribute(\"checked\",\"checked\"),a.setAttribute(\"name\",\"t\"),b.appendChild(a),bK.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML=\"<textarea>x</textarea>\",bK.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ci=bx.documentElement,am=/^key/,cK=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,aJ=/^([^.]*)(?:\\.(.+)|)/;function ar(){return !0}function ak(){return !1}function ab(){try{return bx.activeElement}catch(a){}}function aB(h,d,k,g,c,j){var b,f;if(\"object\"==typeof d){\"string\"!=typeof k&&(g=g||k,k=void 0);for(f in d){aB(h,f,k,g,d[f],j)}return h}if(null==g&&null==c?(c=k,g=k=void 0):null==c&&(\"string\"==typeof k?(c=g,g=void 0):(c=g,g=k,k=void 0)),!1===c){c=ak}else{if(!c){return h}}return 1===j&&(b=c,(c=function(a){return bq().off(a),b.apply(this,arguments)}).guid=b.guid||(b.guid=bq.guid++)),h.each(function(){bq.event.add(this,d,c,g,k)})}bq.event={global:{},add:function(B,H,m,b,w){var k,F,I,G,v,D,A,j,C,x,z,E=cj.get(B);if(E){m.handler&&(m=(k=m).handler,w=k.selector),w&&bq.find.matchesSelector(ci,w),m.guid||(m.guid=bq.guid++),(G=E.events)||(G=E.events={}),(F=E.handle)||(F=E.handle=function(a){return\"undefined\"!=typeof bq&&bq.event.triggered!==a.type?bq.event.dispatch.apply(B,arguments):void 0}),v=(H=(H||\"\").match(cf)||[\"\"]).length;while(v--){C=z=(I=aJ.exec(H[v])||[])[1],x=(I[2]||\"\").split(\".\").sort(),C&&(A=bq.event.special[C]||{},C=(w?A.delegateType:A.bindType)||C,A=bq.event.special[C]||{},D=bq.extend({type:C,origType:z,data:b,handler:m,guid:m.guid,selector:w,needsContext:w&&bq.expr.match.needsContext.test(w),namespace:x.join(\".\")},k),(j=G[C])||((j=G[C]=[]).delegateCount=0,A.setup&&!1!==A.setup.call(B,b,x,F)||B.addEventListener&&B.addEventListener(C,F)),A.add&&(A.add.call(B,D),D.handler.guid||(D.handler.guid=m.guid)),w?j.splice(j.delegateCount++,0,D):j.push(D),bq.event.global[C]=!0)}}},remove:function(B,H,m,b,w){var k,F,I,G,v,D,A,j,C,x,z,E=cj.hasData(B)&&cj.get(B);if(E&&(G=E.events)){v=(H=(H||\"\").match(cf)||[\"\"]).length;while(v--){if(I=aJ.exec(H[v])||[],C=z=I[1],x=(I[2]||\"\").split(\".\").sort(),C){A=bq.event.special[C]||{},j=G[C=(b?A.delegateType:A.bindType)||C]||[],I=I[2]&&new RegExp(\"(^|\\\\.)\"+x.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),F=k=j.length;while(k--){D=j[k],!w&&z!==D.origType||m&&m.guid!==D.guid||I&&!I.test(D.namespace)||b&&b!==D.selector&&(\"**\"!==b||!D.selector)||(j.splice(k,1),D.selector&&j.delegateCount--,A.remove&&A.remove.call(B,D))}F&&!j.length&&(A.teardown&&!1!==A.teardown.call(B,x,E.handle)||bq.removeEvent(B,C,E.handle),delete G[C])}else{for(C in G){bq.event.remove(B,C+H[v],m,b,!0)}}}bq.isEmptyObject(G)&&cj.remove(B,\"handle events\")}},dispatch:function(j){var v=bq.event.fix(j),f,b,h,d,m,w,p=new Array(arguments.length),g=(cj.get(this,\"events\")||{})[v.type]||[],k=bq.event.special[v.type]||{};for(p[0]=v,f=1;f<arguments.length;f++){p[f]=arguments[f]}if(v.delegateTarget=this,!k.preDispatch||!1!==k.preDispatch.call(this,v)){w=bq.event.handlers.call(this,v,g),f=0;while((d=w[f++])&&!v.isPropagationStopped()){v.currentTarget=d.elem,b=0;while((m=d.handlers[b++])&&!v.isImmediatePropagationStopped()){v.rnamespace&&!v.rnamespace.test(m.namespace)||(v.handleObj=m,v.data=m.data,void 0!==(h=((bq.event.special[m.origType]||{}).handle||m.handler).apply(d.elem,p))&&!1===(v.result=h)&&(v.preventDefault(),v.stopPropagation()))}}return k.postDispatch&&k.postDispatch.call(this,v),v.result}},handlers:function(h,m){var d,b,g,c,j,p=[],k=m.delegateCount,f=h.target;if(k&&f.nodeType&&!(\"click\"===h.type&&h.button>=1)){for(;f!==this;f=f.parentNode||this){if(1===f.nodeType&&(\"click\"!==h.type||!0!==f.disabled)){for(c=[],j={},d=0;d<k;d++){void 0===j[g=(b=m[d]).selector+\" \"]&&(j[g]=b.needsContext?bq(g,this).index(f)>-1:bq.find(g,this,null,[f]).length),j[g]&&c.push(b)}c.length&&p.push({elem:f,handlers:c})}}}return f=this,k<m.length&&p.push({elem:f,handlers:m.slice(k)}),p},addProp:function(b,a){Object.defineProperty(bq.Event.prototype,b,{enumerable:!0,configurable:!0,get:bL(a)?function(){if(this.originalEvent){return a(this.originalEvent)}}:function(){if(this.originalEvent){return this.originalEvent[b]}},set:function(c){Object.defineProperty(this,b,{enumerable:!0,configurable:!0,writable:!0,value:c})}})},fix:function(a){return a[bq.expando]?a:new bq.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ab()&&this.focus){return this.focus(),!1}},delegateType:\"focusin\"},blur:{trigger:function(){if(this===ab()&&this.blur){return this.blur(),!1}},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&cd(this,\"input\")){return this.click(),!1}},_default:function(a){return cd(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},bq.removeEvent=function(b,a,c){b.removeEventListener&&b.removeEventListener(a,c)},bq.Event=function(b,a){if(!(this instanceof bq.Event)){return new bq.Event(b,a)}b&&b.type?(this.originalEvent=b,this.type=b.type,this.isDefaultPrevented=b.defaultPrevented||void 0===b.defaultPrevented&&!1===b.returnValue?ar:ak,this.target=b.target&&3===b.target.nodeType?b.target.parentNode:b.target,this.currentTarget=b.currentTarget,this.relatedTarget=b.relatedTarget):this.type=b,a&&bq.extend(this,a),this.timeStamp=b&&b.timeStamp||Date.now(),this[bq.expando]=!0},bq.Event.prototype={constructor:bq.Event,isDefaultPrevented:ak,isPropagationStopped:ak,isImmediatePropagationStopped:ak,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ar,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ar,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ar,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},bq.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(b){var a=b.button;return null==b.which&&am.test(b.type)?null!=b.charCode?b.charCode:b.keyCode:!b.which&&void 0!==a&&cK.test(b.type)?1&a?1:2&a?3:4&a?2:0:b.which}},bq.event.addProp),bq.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(b,a){bq.event.special[b]={delegateType:a,bindType:a,handle:function(f){var h,d=this,c=f.relatedTarget,g=f.handleObj;return c&&(c===d||bq.contains(d,c))||(f.type=g.origType,h=g.handler.apply(this,arguments),f.type=a),h}}}),bq.fn.extend({on:function(c,a,d,b){return aB(this,c,a,d,b)},one:function(c,a,d,b){return aB(this,c,a,d,b,1)},off:function(d,b,f){var c,a;if(d&&d.preventDefault&&d.handleObj){return c=d.handleObj,bq(d.delegateTarget).off(c.namespace?c.origType+\".\"+c.namespace:c.origType,c.selector,c.handler),this}if(\"object\"==typeof d){for(a in d){this.off(a,b,d[a])}return this}return !1!==b&&\"function\"!=typeof b||(f=b,b=void 0),!1===f&&(f=ak),this.each(function(){bq.event.remove(this,d,f,b)})}});var aT=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,a0=/<script|<style|<link/i,au=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bc=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function bb(b,a){return cd(b,\"table\")&&cd(11!==a.nodeType?a:a.firstChild,\"tr\")?bq(b).children(\"tbody\")[0]||b:b}function cI(a){return a.type=(null!==a.getAttribute(\"type\"))+\"/\"+a.type,a}function aL(a){return\"true/\"===(a.type||\"\").slice(0,5)?a.type=a.type.slice(5):a.removeAttribute(\"type\"),a}function aD(h,m){var d,b,g,c,j,p,k,f;if(1===m.nodeType){if(cj.hasData(h)&&(c=cj.access(h),j=cj.set(m,c),f=c.events)){delete j.handle,j.events={};for(g in f){for(d=0,b=f[g].length;d<b;d++){bq.event.add(m,g,f[g][d])}}}ch.hasData(h)&&(p=ch.access(h),k=bq.extend({},p),ch.set(m,k))}}function a3(b,a){var c=a.nodeName.toLowerCase();\"input\"===c&&bl.test(b.type)?a.checked=b.checked:\"input\"!==c&&\"textarea\"!==c||(a.defaultValue=b.defaultValue)}function al(w,D,h,a){D=bS.apply([],D);var k,g,E,C,j,z,m=0,b=w.length,x=b-1,A=D[0],B=bL(A);if(B||b>1&&\"string\"==typeof A&&!bK.checkClone&&au.test(A)){return w.each(function(c){var d=w.eq(c);B&&(D[0]=A.call(this,c,d.html())),al(d,D,h,a)})}if(b&&(k=ac(D,w[0].ownerDocument,!1,w,a),g=k.firstChild,1===k.childNodes.length&&(k=g),g||a)){for(C=(E=bq.map(cL(k,\"script\"),cI)).length;m<b;m++){j=k,m!==x&&(j=bq.clone(j,!0,!0),C&&bq.merge(E,cL(j,\"script\"))),h.call(w[m],j,m)}if(C){for(z=E[E.length-1].ownerDocument,bq.map(E,aL),m=0;m<C;m++){j=E[m],aK.test(j.type||\"\")&&!cj.access(j,\"globalEval\")&&bq.contains(z,j)&&(j.src&&\"module\"!==(j.type||\"\").toLowerCase()?bq._evalUrl&&bq._evalUrl(j.src):bE(j.textContent.replace(bc,\"\"),z,j))}}}return w}function cw(d,b,g){for(var c,a=b?bq.filter(b,d):d,f=0;null!=(c=a[f]);f++){g||1!==c.nodeType||bq.cleanData(cL(c)),c.parentNode&&(g&&bq.contains(c.ownerDocument,c)&&aw(cL(c,\"script\")),c.parentNode.removeChild(c))}return d}bq.extend({htmlPrefilter:function(a){return a.replace(aT,\"<$1></$2>\")},clone:function(g,k,d){var b,f,c,h,l=g.cloneNode(!0),j=bq.contains(g.ownerDocument,g);if(!(bK.noCloneChecked||1!==g.nodeType&&11!==g.nodeType||bq.isXMLDoc(g))){for(h=cL(l),b=0,f=(c=cL(g)).length;b<f;b++){a3(c[b],h[b])}}if(k){if(d){for(c=c||cL(g),h=h||cL(l),b=0,f=c.length;b<f;b++){aD(c[b],h[b])}}else{aD(g,l)}}return(h=cL(l,\"script\")).length>0&&aw(h,!j&&cL(g,\"script\")),l},cleanData:function(d){for(var b,g,c,a=bq.event.special,f=0;void 0!==(g=d[f]);f++){if(bY(g)){if(b=g[cj.expando]){if(b.events){for(c in b.events){a[c]?bq.event.remove(g,c):bq.removeEvent(g,c,b.handle)}}g[cj.expando]=void 0}g[ch.expando]&&(g[ch.expando]=void 0)}}}}),bq.fn.extend({detach:function(a){return cw(this,a,!0)},remove:function(a){return cw(this,a)},text:function(a){return bm(this,function(b){return void 0===b?bq.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=b)})},null,a,arguments.length)},append:function(){return al(this,arguments,function(a){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||bb(this,a).appendChild(a)})},prepend:function(){return al(this,arguments,function(b){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var a=bb(this,b);a.insertBefore(b,a.firstChild)}})},before:function(){return al(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return al(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var b,a=0;null!=(b=this[a]);a++){1===b.nodeType&&(bq.cleanData(cL(b,!1)),b.textContent=\"\")}return this},clone:function(b,a){return b=null!=b&&b,a=null==a?b:a,this.map(function(){return bq.clone(this,b,a)})},html:function(a){return bm(this,function(d){var b=this[0]||{},f=0,c=this.length;if(void 0===d&&1===b.nodeType){return b.innerHTML}if(\"string\"==typeof d&&!a0.test(d)&&!aS[(bi.exec(d)||[\"\",\"\"])[1].toLowerCase()]){d=bq.htmlPrefilter(d);try{for(;f<c;f++){1===(b=this[f]||{}).nodeType&&(bq.cleanData(cL(b,!1)),b.innerHTML=d)}b=0}catch(d){}}b&&this.empty().append(d)},null,a,arguments.length)},replaceWith:function(){var a=[];return al(this,arguments,function(b){var c=this.parentNode;bq.inArray(this,a)<0&&(bq.cleanData(cL(this)),c&&c.replaceChild(b,this))},a)}}),bq.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(b,a){bq.fn[b]=function(g){for(var j,f=[],d=bq(g),h=d.length-1,c=0;c<=h;c++){j=c===h?this:this.clone(!0),bq(d[c])[a](j),bw.apply(f,j.get())}return this.pushStack(f)}});var bu=new RegExp(\"^(\"+a4+\")(?!px)[a-z%]+$\",\"i\"),cs=function(a){var b=a.ownerDocument.defaultView;return b&&b.opener||(b=bO),b.getComputedStyle(a)},aR=new RegExp(bV.join(\"|\"),\"i\");!function(){function k(){if(g){e.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",g.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",ci.appendChild(e).appendChild(g);var a=bO.getComputedStyle(g);f=\"1%\"!==a.top,j=12===d(a.marginLeft),g.style.right=\"60%\",m=36===d(a.right),b=36===d(a.width),g.style.position=\"absolute\",h=36===g.offsetWidth||\"absolute\",ci.removeChild(e),g=null}}function d(a){return Math.round(parseFloat(a))}var f,b,h,m,j,e=bx.createElement(\"div\"),g=bx.createElement(\"div\");g.style&&(g.style.backgroundClip=\"content-box\",g.cloneNode(!0).style.backgroundClip=\"\",bK.clearCloneStyle=\"content-box\"===g.style.backgroundClip,bq.extend(bK,{boxSizingReliable:function(){return k(),b},pixelBoxStyles:function(){return k(),m},pixelPosition:function(){return k(),f},reliableMarginLeft:function(){return k(),j},scrollboxSize:function(){return k(),h}}))}();function aj(h,d,k){var g,c,j,b,f=h.style;return(k=k||cs(h))&&(\"\"!==(b=k.getPropertyValue(d)||k[d])||bq.contains(h.ownerDocument,h)||(b=bq.style(h,d)),!bK.pixelBoxStyles()&&bu.test(b)&&aR.test(d)&&(g=f.width,c=f.minWidth,j=f.maxWidth,f.minWidth=f.maxWidth=f.width=b,b=k.width,f.width=g,f.minWidth=c,f.maxWidth=j)),void 0!==b?b+\"\":b}function ag(b,a){return{get:function(){if(!b()){return(this.get=a).apply(this,arguments)}delete this.get}}}var cB=/^(none|table(?!-c[ea]).+)/,bf=/^--/,cA={position:\"absolute\",visibility:\"hidden\",display:\"block\"},b2={letterSpacing:\"0\",fontWeight:\"400\"},cQ=[\"Webkit\",\"Moz\",\"ms\"],a6=bx.createElement(\"div\").style;function av(b){if(b in a6){return b}var a=b[0].toUpperCase()+b.slice(1),c=cQ.length;while(c--){if((b=cQ[c]+a) in a6){return b}}}function bT(b){var a=bq.cssProps[b];return a||(a=bq.cssProps[b]=av(b)||b),a}function bk(c,a,d){var b=aC.exec(a);return b?Math.max(0,b[2]-(d||0))+(b[3]||\"px\"):a}function aX(g,k,d,b,f,c){var h=\"width\"===k?1:0,l=0,j=0;if(d===(b?\"border\":\"content\")){return 0}for(;h<4;h+=2){\"margin\"===d&&(j+=bq.css(g,d+bV[h],!0,f)),b?(\"content\"===d&&(j-=bq.css(g,\"padding\"+bV[h],!0,f)),\"margin\"!==d&&(j-=bq.css(g,\"border\"+bV[h]+\"Width\",!0,f))):(j+=bq.css(g,\"padding\"+bV[h],!0,f),\"padding\"!==d?j+=bq.css(g,\"border\"+bV[h]+\"Width\",!0,f):l+=bq.css(g,\"border\"+bV[h]+\"Width\",!0,f))}return !b&&c>=0&&(j+=Math.max(0,Math.ceil(g[\"offset\"+k[0].toUpperCase()+k.slice(1)]-c-j-l-0.5))),j}function a5(g,d,j){var f=cs(g),c=aj(g,d,f),h=\"border-box\"===bq.css(g,\"boxSizing\",!1,f),b=h;if(bu.test(c)){if(!j){return c}c=\"auto\"}return b=b&&(bK.boxSizingReliable()||c===g.style[d]),(\"auto\"===c||!parseFloat(c)&&\"inline\"===bq.css(g,\"display\",!1,f))&&(c=g[\"offset\"+d[0].toUpperCase()+d.slice(1)],b=!0),(c=parseFloat(c)||0)+aX(g,d,j||(h?\"border\":\"content\"),b,f,c)+\"px\"}bq.extend({cssHooks:{opacity:{get:function(b,a){if(a){var c=aj(b,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(h,m,d,b){if(h&&3!==h.nodeType&&8!==h.nodeType&&h.style){var g,c,j,p=cm(m),k=bf.test(m),f=h.style;if(k||(m=bT(p)),j=bq.cssHooks[m]||bq.cssHooks[p],void 0===d){return j&&\"get\" in j&&void 0!==(g=j.get(h,!1,b))?g:f[m]}\"string\"==(c=typeof d)&&(g=aC.exec(d))&&g[1]&&(d=aE(h,m,g),c=\"number\"),null!=d&&d===d&&(\"number\"===c&&(d+=g&&g[3]||(bq.cssNumber[p]?\"\":\"px\")),bK.clearCloneStyle||\"\"!==d||0!==m.indexOf(\"background\")||(f[m]=\"inherit\"),j&&\"set\" in j&&void 0===(d=j.set(h,d,b))||(k?f.setProperty(m,d):f[m]=d))}},css:function(h,d,k,g){var c,j,b,f=cm(d);return bf.test(d)||(d=bT(f)),(b=bq.cssHooks[d]||bq.cssHooks[f])&&\"get\" in b&&(c=b.get(h,!0,k)),void 0===c&&(c=aj(h,d,g)),\"normal\"===c&&d in b2&&(c=b2[d]),\"\"===k||k?(j=parseFloat(c),!0===k||isFinite(j)?j||0:c):c}}),bq.each([\"height\",\"width\"],function(b,a){bq.cssHooks[a]={get:function(d,f,c){if(f){return !cB.test(bq.css(d,\"display\"))||d.getClientRects().length&&d.getBoundingClientRect().width?a5(d,a,c):aU(d,cA,function(){return a5(d,a,c)})}},set:function(h,k,g){var d,j=cs(h),c=\"border-box\"===bq.css(h,\"boxSizing\",!1,j),f=g&&aX(h,a,g,c,j);return c&&bK.scrollboxSize()===j.position&&(f-=Math.ceil(h[\"offset\"+a[0].toUpperCase()+a.slice(1)]-parseFloat(j[a])-aX(h,a,\"border\",!1,j)-0.5)),f&&(d=aC.exec(k))&&\"px\"!==(d[3]||\"px\")&&(h.style[a]=k,k=bq.css(h,a)),bk(h,k,f)}}}),bq.cssHooks.marginLeft=ag(bK.reliableMarginLeft,function(b,a){if(a){return(parseFloat(aj(b,\"marginLeft\"))||b.getBoundingClientRect().left-aU(b,{marginLeft:0},function(){return b.getBoundingClientRect().left}))+\"px\"}}),bq.each({margin:\"\",padding:\"\",border:\"Width\"},function(b,a){bq.cssHooks[b+a]={expand:function(f){for(var d=0,c={},e=\"string\"==typeof f?f.split(\" \"):[f];d<4;d++){c[b+bV[d]+a]=e[d]||e[d-2]||e[0]}return c}},\"margin\"!==b&&(bq.cssHooks[b+a].set=bk)}),bq.fn.extend({css:function(b,a){return bm(this,function(h,f,k){var g,d,j={},c=0;if(Array.isArray(f)){for(g=cs(h),d=f.length;c<d;c++){j[f[c]]=bq.css(h,f[c],!1,g)}return j}return void 0!==k?bq.style(h,f,k):bq.css(h,f)},b,a,arguments.length>1)}});function aI(d,b,f,c,a){return new aI.prototype.init(d,b,f,c,a)}bq.Tween=aI,aI.prototype={constructor:aI,init:function(d,b,g,c,a,f){this.elem=d,this.prop=g,this.easing=a||bq.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=c,this.unit=f||(bq.cssNumber[g]?\"\":\"px\")},cur:function(){var a=aI.propHooks[this.prop];return a&&a.get?a.get(this):aI.propHooks._default.get(this)},run:function(b){var a,c=aI.propHooks[this.prop];return this.options.duration?this.pos=a=bq.easing[this.easing](b,this.options.duration*b,0,1,this.options.duration):this.pos=a=b,this.now=(this.end-this.start)*a+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):aI.propHooks._default.set(this),this}},aI.prototype.init.prototype=aI.prototype,aI.propHooks={_default:{get:function(b){var a;return 1!==b.elem.nodeType||null!=b.elem[b.prop]&&null==b.elem.style[b.prop]?b.elem[b.prop]:(a=bq.css(b.elem,b.prop,\"\"))&&\"auto\"!==a?a:0},set:function(a){bq.fx.step[a.prop]?bq.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[bq.cssProps[a.prop]]&&!bq.cssHooks[a.prop]?a.elem[a.prop]=a.now:bq.style(a.elem,a.prop,a.now+a.unit)}}},aI.propHooks.scrollTop=aI.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},bq.easing={linear:function(a){return a},swing:function(a){return 0.5-Math.cos(a*Math.PI)/2},_default:\"swing\"},bq.fx=aI.prototype.init,bq.fx.step={};var cc,aZ,ay=/^(?:toggle|show|hide)$/,bD=/queueHooks$/;function cz(){aZ&&(!1===bx.hidden&&bO.requestAnimationFrame?bO.requestAnimationFrame(cz):bO.setTimeout(cz,bq.fx.interval),bq.fx.tick())}function aQ(){return bO.setTimeout(function(){cc=void 0}),cc=Date.now()}function aA(d,b){var f,c=0,a={height:d};for(b=b?1:0;c<4;c+=2-b){a[\"margin\"+(f=bV[c])]=a[\"padding\"+f]=d}return b&&(a.opacity=a.width=d),a}function cN(g,d,j){for(var f,c=(bh.tweeners[d]||[]).concat(bh.tweeners[\"*\"]),h=0,b=c.length;h<b;h++){if(f=c[h].call(j,d,g)){return f}}}function bo(B,H,m){var b,w,k,F,I,G,v,D,A=\"width\" in H||\"height\" in H,j=this,C={},x=B.style,z=B.nodeType&&cE(B),E=cj.get(B,\"fxshow\");m.queue||(null==(F=bq._queueHooks(B,\"fx\")).unqueued&&(F.unqueued=0,I=F.empty.fire,F.empty.fire=function(){F.unqueued||I()}),F.unqueued++,j.always(function(){j.always(function(){F.unqueued--,bq.queue(B,\"fx\").length||F.empty.fire()})}));for(b in H){if(w=H[b],ay.test(w)){if(delete H[b],k=k||\"toggle\"===w,w===(z?\"hide\":\"show\")){if(\"show\"!==w||!E||void 0===E[b]){continue}z=!0}C[b]=E&&E[b]||bq.style(B,b)}}if((G=!bq.isEmptyObject(H))||!bq.isEmptyObject(C)){A&&1===B.nodeType&&(m.overflow=[x.overflow,x.overflowX,x.overflowY],null==(v=E&&E.display)&&(v=cj.get(B,\"display\")),\"none\"===(D=bq.css(B,\"display\"))&&(v?D=v:(a1([B],!0),v=B.style.display||v,D=bq.css(B,\"display\"),a1([B]))),(\"inline\"===D||\"inline-block\"===D&&null!=v)&&\"none\"===bq.css(B,\"float\")&&(G||(j.done(function(){x.display=v}),null==v&&(D=x.display,v=\"none\"===D?\"\":D)),x.display=\"inline-block\")),m.overflow&&(x.overflow=\"hidden\",j.always(function(){x.overflow=m.overflow[0],x.overflowX=m.overflow[1],x.overflowY=m.overflow[2]})),G=!1;for(b in C){G||(E?\"hidden\" in E&&(z=E.hidden):E=cj.access(B,\"fxshow\",{display:v}),k&&(E.hidden=!z),z&&a1([B],!0),j.done(function(){z||a1([B]),cj.remove(B,\"fxshow\");for(b in C){bq.style(B,b,C[b])}})),G=cN(z?E[b]:0,b,j),b in E||(E[b]=G.start,z&&(G.end=G.start,G.start=0))}}}function aW(g,d){var j,f,c,h,b;for(j in g){if(f=cm(j),c=d[f],h=g[j],Array.isArray(h)&&(c=h[1],h=g[j]=h[0]),j!==f&&(g[f]=h,delete g[j]),(b=bq.cssHooks[f])&&\"expand\" in b){h=b.expand(h),delete g[f];for(j in h){j in g||(g[j]=h[j],d[j]=c)}}else{d[f]=c}}}function bh(j,v,f){var b,h,d=0,m=bh.prefilters.length,w=bq.Deferred().always(function(){delete p.elem}),p=function(){if(h){return !1}for(var e=cc||aQ(),s=Math.max(0,g.startTime+g.duration-e),i=1-(s/g.duration||0),l=0,c=g.tweens.length;l<c;l++){g.tweens[l].run(i)}return w.notifyWith(j,[g,i,s]),i<1&&c?s:(c||w.notifyWith(j,[g,1,0]),w.resolveWith(j,[g]),!1)},g=w.promise({elem:j,props:bq.extend({},v),opts:bq.extend(!0,{specialEasing:{},easing:bq.easing._default},f),originalProperties:v,originalOptions:f,startTime:cc||aQ(),duration:f.duration,tweens:[],createTween:function(a,e){var c=bq.Tween(j,g.opts,a,e,g.opts.specialEasing[a]||g.opts.easing);return g.tweens.push(c),c},stop:function(a){var e=0,c=a?g.tweens.length:0;if(h){return this}for(h=!0;e<c;e++){g.tweens[e].run(1)}return a?(w.notifyWith(j,[g,1,0]),w.resolveWith(j,[g,a])):w.rejectWith(j,[g,a]),this}}),k=g.props;for(aW(k,g.opts.specialEasing);d<m;d++){if(b=bh.prefilters[d].call(g,j,k,g.opts)){return bL(b.stop)&&(bq._queueHooks(g.elem,g.opts.queue).stop=b.stop.bind(b)),b}}return bq.map(k,cN,g),bL(g.opts.start)&&g.opts.start.call(j,g),g.progress(g.opts.progress).done(g.opts.done,g.opts.complete).fail(g.opts.fail).always(g.opts.always),bq.fx.timer(bq.extend(p,{elem:j,anim:g,queue:g.opts.queue})),g}bq.Animation=bq.extend(bh,{tweeners:{\"*\":[function(b,a){var c=this.createTween(b,a);return aE(c.elem,b,aC.exec(a),c),c}]},tweener:function(d,b){bL(d)?(b=d,d=[\"*\"]):d=d.match(cf);for(var f,c=0,a=d.length;c<a;c++){f=d[c],bh.tweeners[f]=bh.tweeners[f]||[],bh.tweeners[f].unshift(b)}},prefilters:[bo],prefilter:function(b,a){a?bh.prefilters.unshift(b):bh.prefilters.push(b)}}),bq.speed=function(c,a,d){var b=c&&\"object\"==typeof c?bq.extend({},c):{complete:d||!d&&a||bL(c)&&c,duration:c,easing:d&&a||a&&!bL(a)&&a};return bq.fx.off?b.duration=0:\"number\"!=typeof b.duration&&(b.duration in bq.fx.speeds?b.duration=bq.fx.speeds[b.duration]:b.duration=bq.fx.speeds._default),null!=b.queue&&!0!==b.queue||(b.queue=\"fx\"),b.old=b.complete,b.complete=function(){bL(b.old)&&b.old.call(this),b.queue&&bq.dequeue(this,b.queue)},b},bq.fn.extend({fadeTo:function(c,a,d,b){return this.filter(cE).css(\"opacity\",0).show().end().animate({opacity:a},c,d,b)},animate:function(g,d,j,f){var c=bq.isEmptyObject(g),h=bq.speed(d,j,f),b=function(){var a=bh(this,bq.extend({},g),h);(c||cj.get(this,\"finish\"))&&a.stop(!0)};return b.finish=b,c||!1===h.queue?this.each(b):this.queue(h.queue,b)},stop:function(c,a,d){var b=function(g){var f=g.stop;delete g.stop,f(d)};return\"string\"!=typeof c&&(d=a,a=c,c=void 0),a&&!1!==c&&this.queue(c||\"fx\",[]),this.each(function(){var g=!0,f=null!=c&&c+\"queueHooks\",h=bq.timers,e=cj.get(this);if(f){e[f]&&e[f].stop&&b(e[f])}else{for(f in e){e[f]&&e[f].stop&&bD.test(f)&&b(e[f])}}for(f=h.length;f--;){h[f].elem!==this||null!=c&&h[f].queue!==c||(h[f].anim.stop(d),g=!1,h.splice(f,1))}!g&&d||bq.dequeue(this,c)})},finish:function(a){return !1!==a&&(a=a||\"fx\"),this.each(function(){var d,g=cj.get(this),e=g[a+\"queue\"],c=g[a+\"queueHooks\"],f=bq.timers,b=e?e.length:0;for(g.finish=!0,bq.queue(this,a,[]),c&&c.stop&&c.stop.call(this,!0),d=f.length;d--;){f[d].elem===this&&f[d].queue===a&&(f[d].anim.stop(!0),f.splice(d,1))}for(d=0;d<b;d++){e[d]&&e[d].finish&&e[d].finish.call(this)}delete g.finish})}}),bq.each([\"toggle\",\"show\",\"hide\"],function(b,a){var c=bq.fn[a];bq.fn[a]=function(g,f,d){return null==g||\"boolean\"==typeof g?c.apply(this,arguments):this.animate(aA(a,!0),g,f,d)}}),bq.each({slideDown:aA(\"show\"),slideUp:aA(\"hide\"),slideToggle:aA(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(b,a){bq.fn[b]=function(d,f,c){return this.animate(a,d,f,c)}}),bq.timers=[],bq.fx.tick=function(){var b,a=0,c=bq.timers;for(cc=Date.now();a<c.length;a++){(b=c[a])()||c[a]!==b||c.splice(a--,1)}c.length||bq.fx.stop(),cc=void 0},bq.fx.timer=function(a){bq.timers.push(a),bq.fx.start()},bq.fx.interval=13,bq.fx.start=function(){aZ||(aZ=!0,cz())},bq.fx.stop=function(){aZ=null},bq.fx.speeds={slow:600,fast:200,_default:400},bq.fn.delay=function(a,b){return a=bq.fx?bq.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(e,d){var c=bO.setTimeout(e,a);d.stop=function(){bO.clearTimeout(c)}})},function(){var b=bx.createElement(\"input\"),a=bx.createElement(\"select\").appendChild(bx.createElement(\"option\"));b.type=\"checkbox\",bK.checkOn=\"\"!==b.value,bK.optSelected=a.selected,(b=bx.createElement(\"input\")).value=\"t\",b.type=\"radio\",bK.radioValue=\"t\"===b.value}();var bd,aG=bq.expr.attrHandle;bq.fn.extend({attr:function(b,a){return bm(this,bq.attr,b,a,arguments.length>1)},removeAttr:function(a){return this.each(function(){bq.removeAttr(this,a)})}}),bq.extend({attr:function(d,b,g){var c,a,f=d.nodeType;if(3!==f&&8!==f&&2!==f){return\"undefined\"==typeof d.getAttribute?bq.prop(d,b,g):(1===f&&bq.isXMLDoc(d)||(a=bq.attrHooks[b.toLowerCase()]||(bq.expr.match.bool.test(b)?bd:void 0)),void 0!==g?null===g?void bq.removeAttr(d,b):a&&\"set\" in a&&void 0!==(c=a.set(d,g,b))?c:(d.setAttribute(b,g+\"\"),g):a&&\"get\" in a&&null!==(c=a.get(d,b))?c:null==(c=bq.find.attr(d,b))?void 0:c)}},attrHooks:{type:{set:function(b,a){if(!bK.radioValue&&\"radio\"===a&&cd(b,\"input\")){var c=b.value;return b.setAttribute(\"type\",a),c&&(b.value=c),a}}}},removeAttr:function(d,b){var f,c=0,a=b&&b.match(cf);if(a&&1===d.nodeType){while(f=a[c++]){d.removeAttribute(f)}}}}),bd={set:function(b,a,c){return !1===a?bq.removeAttr(b,c):b.setAttribute(c,c),c}},bq.each(bq.expr.match.bool.source.match(/\\w+/g),function(b,a){var c=aG[a]||bq.find.attr;aG[a]=function(j,g,h){var f,k,d=g.toLowerCase();return h||(k=aG[d],aG[d]=f,f=null!=c(j,g,h)?d:null,aG[d]=k),f}});var aO=/^(?:input|select|textarea|button)$/i,cG=/^(?:a|area)$/i;bq.fn.extend({prop:function(b,a){return bm(this,bq.prop,b,a,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[bq.propFix[a]||a]})}}),bq.extend({prop:function(d,b,g){var c,a,f=d.nodeType;if(3!==f&&8!==f&&2!==f){return 1===f&&bq.isXMLDoc(d)||(b=bq.propFix[b]||b,a=bq.propHooks[b]),void 0!==g?a&&\"set\" in a&&void 0!==(c=a.set(d,g,b))?c:d[b]=g:a&&\"get\" in a&&null!==(c=a.get(d,b))?c:d[b]}},propHooks:{tabIndex:{get:function(b){var a=bq.find.attr(b,\"tabindex\");return a?parseInt(a,10):aO.test(b.nodeName)||cG.test(b.nodeName)&&b.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),bK.optSelected||(bq.propHooks.selected={get:function(b){var a=b.parentNode;return a&&a.parentNode&&a.parentNode.selectedIndex,null},set:function(b){var a=b.parentNode;a&&(a.selectedIndex,a.parentNode&&a.parentNode.selectedIndex)}}),bq.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){bq.propFix[this.toLowerCase()]=this});function aq(a){return(a.match(cf)||[]).join(\" \")}function cD(a){return a.getAttribute&&a.getAttribute(\"class\")||\"\"}function cP(a){return Array.isArray(a)?a:\"string\"==typeof a?a.match(cf)||[]:[]}bq.fn.extend({addClass:function(g){var k,d,b,f,c,h,l,j=0;if(bL(g)){return this.each(function(a){bq(this).addClass(g.call(this,a,cD(this)))})}if((k=cP(g)).length){while(d=this[j++]){if(f=cD(d),b=1===d.nodeType&&\" \"+aq(f)+\" \"){h=0;while(c=k[h++]){b.indexOf(\" \"+c+\" \")<0&&(b+=c+\" \")}f!==(l=aq(b))&&d.setAttribute(\"class\",l)}}}return this},removeClass:function(g){var k,d,b,f,c,h,l,j=0;if(bL(g)){return this.each(function(a){bq(this).removeClass(g.call(this,a,cD(this)))})}if(!arguments.length){return this.attr(\"class\",\"\")}if((k=cP(g)).length){while(d=this[j++]){if(f=cD(d),b=1===d.nodeType&&\" \"+aq(f)+\" \"){h=0;while(c=k[h++]){while(b.indexOf(\" \"+c+\" \")>-1){b=b.replace(\" \"+c+\" \",\" \")}}f!==(l=aq(b))&&d.setAttribute(\"class\",l)}}}return this},toggleClass:function(c,a){var d=typeof c,b=\"string\"===d||Array.isArray(c);return\"boolean\"==typeof a&&b?a?this.addClass(c):this.removeClass(c):bL(c)?this.each(function(e){bq(this).toggleClass(c.call(this,e,cD(this),a),a)}):this.each(function(){var g,f,h,e;if(b){f=0,h=bq(this),e=cP(c);while(g=e[f++]){h.hasClass(g)?h.removeClass(g):h.addClass(g)}}else{void 0!==c&&\"boolean\"!==d||((g=cD(this))&&cj.set(this,\"__className__\",g),this.setAttribute&&this.setAttribute(\"class\",g||!1===c?\"\":cj.get(this,\"__className__\")||\"\"))}})},hasClass:function(c){var a,d,b=0;a=\" \"+c+\" \";while(d=this[b++]){if(1===d.nodeType&&(\" \"+aq(cD(d))+\" \").indexOf(a)>-1){return !0}}return !1}});var bX=/\\r/g;bq.fn.extend({val:function(d){var b,f,c,a=this[0];if(arguments.length){return c=bL(d),this.each(function(g){var e;1===this.nodeType&&(null==(e=c?d.call(this,g,bq(this).val()):d)?e=\"\":\"number\"==typeof e?e+=\"\":Array.isArray(e)&&(e=bq.map(e,function(h){return null==h?\"\":h+\"\"})),(b=bq.valHooks[this.type]||bq.valHooks[this.nodeName.toLowerCase()])&&\"set\" in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))})}if(a){return(b=bq.valHooks[a.type]||bq.valHooks[a.nodeName.toLowerCase()])&&\"get\" in b&&void 0!==(f=b.get(a,\"value\"))?f:\"string\"==typeof(f=a.value)?f.replace(bX,\"\"):null==f?\"\":f}}}),bq.extend({valHooks:{option:{get:function(b){var a=bq.find.attr(b,\"value\");return null!=a?a:aq(bq.text(b))}},select:{get:function(g){var k,d,b,f=g.options,c=g.selectedIndex,h=\"select-one\"===g.type,l=h?null:[],j=h?c+1:f.length;for(b=c<0?j:h?c:0;b<j;b++){if(((d=f[b]).selected||b===c)&&!d.disabled&&(!d.parentNode.disabled||!cd(d.parentNode,\"optgroup\"))){if(k=bq(d).val(),h){return k}l.push(k)}}return l},set:function(g,d){var j,f,c=g.options,h=bq.makeArray(d),b=c.length;while(b--){((f=c[b]).selected=bq.inArray(bq.valHooks.option.get(f),h)>-1)&&(j=!0)}return j||(g.selectedIndex=-1),h}}}}),bq.each([\"radio\",\"checkbox\"],function(){bq.valHooks[this]={set:function(b,a){if(Array.isArray(a)){return b.checked=bq.inArray(bq(b).val(),a)>-1}}},bK.checkOn||(bq.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})}),bK.focusin=\"onfocusin\" in bO;var ai=/^(?:focusinfocus|focusoutblur)$/,cF=function(a){a.stopPropagation()};bq.extend(bq.event,{trigger:function(D,f,k,e){var A,E,C,j,y,b,w,r,B=[k||bx],g=bM.call(D,\"type\")?D.type:D,z=bM.call(D,\"namespace\")?D.namespace.split(\".\"):[];if(E=r=C=k=k||bx,3!==k.nodeType&&8!==k.nodeType&&!ai.test(g+bq.event.triggered)&&(g.indexOf(\".\")>-1&&(g=(z=g.split(\".\")).shift(),z.sort()),y=g.indexOf(\":\")<0&&\"on\"+g,D=D[bq.expando]?D:new bq.Event(g,\"object\"==typeof D&&D),D.isTrigger=e?2:3,D.namespace=z.join(\".\"),D.rnamespace=D.namespace?new RegExp(\"(^|\\\\.)\"+z.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,D.result=void 0,D.target||(D.target=k),f=null==f?[D]:bq.makeArray(f,[D]),w=bq.event.special[g]||{},e||!w.trigger||!1!==w.trigger.apply(k,f))){if(!e&&!w.noBubble&&!bn(k)){for(j=w.delegateType||g,ai.test(j+g)||(E=E.parentNode);E;E=E.parentNode){B.push(E),C=E}C===(k.ownerDocument||bx)&&B.push(C.defaultView||C.parentWindow||bO)}A=0;while((E=B[A++])&&!D.isPropagationStopped()){r=E,D.type=A>1?j:w.bindType||g,(b=(cj.get(E,\"events\")||{})[D.type]&&cj.get(E,\"handle\"))&&b.apply(E,f),(b=y&&E[y])&&b.apply&&bY(E)&&(D.result=b.apply(E,f),!1===D.result&&D.preventDefault())}return D.type=g,e||D.isDefaultPrevented()||w._default&&!1!==w._default.apply(B.pop(),f)||!bY(k)||y&&bL(k[g])&&!bn(k)&&((C=k[y])&&(k[y]=null),bq.event.triggered=g,D.isPropagationStopped()&&r.addEventListener(g,cF),k[g](),D.isPropagationStopped()&&r.removeEventListener(g,cF),bq.event.triggered=void 0,C&&(k[y]=C)),D.result}},simulate:function(c,a,d){var b=bq.extend(new bq.Event,d,{type:c,isSimulated:!0});bq.event.trigger(b,null,a)}}),bq.fn.extend({trigger:function(b,a){return this.each(function(){bq.event.trigger(b,a,this)})},triggerHandler:function(b,a){var c=this[0];if(c){return bq.event.trigger(b,a,c,!0)}}}),bK.focusin||bq.each({focus:\"focusin\",blur:\"focusout\"},function(b,a){var c=function(d){bq.event.simulate(a,d.target,bq.event.fix(d))};bq.event.special[a]={setup:function(){var e=this.ownerDocument||this,d=cj.access(e,a);d||e.addEventListener(b,c,!0),cj.access(e,a,(d||0)+1)},teardown:function(){var e=this.ownerDocument||this,d=cj.access(e,a)-1;d?cj.access(e,a,d):(e.removeEventListener(b,c,!0),cj.remove(e,a))}}});var aF=bO.location,an=Date.now(),af=/\\?/;bq.parseXML=function(a){var c;if(!a||\"string\"!=typeof a){return null}try{c=(new b.DOMParser).parseFromString(a,\"text/xml\")}catch(b){c=void 0}return c&&!c.getElementsByTagName(\"parsererror\").length||bq.error(\"Invalid XML: \"+a),c};var cO=/\\[\\]$/,ax=/\\r?\\n/g,aP=/^(?:submit|button|image|reset|file)$/i,aV=/^(?:input|select|textarea|keygen)/i;function ao(d,b,f,c){var a;if(Array.isArray(b)){bq.each(b,function(g,e){f||cO.test(d)?c(d,e):ao(d+\"[\"+(\"object\"==typeof e&&null!=e?g:\"\")+\"]\",e,f,c)})}else{if(f||\"object\"!==bp(b)){c(d,b)}else{for(a in b){ao(d+\"[\"+a+\"]\",b[a],f,c)}}}}bq.param=function(d,b){var f,c=[],a=function(h,g){var i=bL(g)?g():g;c[c.length]=encodeURIComponent(h)+\"=\"+encodeURIComponent(null==i?\"\":i)};if(Array.isArray(d)||d.jquery&&!bq.isPlainObject(d)){bq.each(d,function(){a(this.name,this.value)})}else{for(f in d){ao(f,d[f],b,a)}}return c.join(\"&\")},bq.fn.extend({serialize:function(){return bq.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=bq.prop(this,\"elements\");return a?bq.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!bq(this).is(\":disabled\")&&aV.test(this.nodeName)&&!aP.test(a)&&(this.checked||!bl.test(a))}).map(function(b,a){var c=bq(this).val();return null==c?null:Array.isArray(c)?bq.map(c,function(d){return{name:a.name,value:d.replace(ax,\"\\r\\n\")}}):{name:a.name,value:c.replace(ax,\"\\r\\n\")}}).get()}});var a8=/%20/g,a7=/#.*$/,cC=/([?&])_=[^&]*/,aH=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,az=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,aY=/^(?:GET|HEAD)$/,ah=/^\\/\\//,b8={},bj={},b5=\"*/\".concat(\"*\"),aN=bx.createElement(\"a\");aN.href=aF.href;function ad(a){return function(c,f){\"string\"!=typeof c&&(f=c,c=\"*\");var d,b=0,e=c.toLowerCase().match(cf)||[];if(bL(f)){while(d=e[b++]){\"+\"===d[0]?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(f)):(a[d]=a[d]||[]).push(f)}}}}function aa(g,d,j,f){var c={},h=g===bj;function b(e){var a;return c[e]=!0,bq.each(g[e]||[],function(m,k){var i=k(d,j,f);return\"string\"!=typeof i||h||c[i]?h?!(a=i):void 0:(d.dataTypes.unshift(i),b(i),!1)}),a}return b(d.dataTypes[0])||!c[\"*\"]&&b(\"*\")}function cq(d,b){var f,c,a=bq.ajaxSettings.flatOptions||{};for(f in b){void 0!==b[f]&&((a[f]?d:c||(c={}))[f]=b[f])}return c&&bq.extend(!0,d,c),d}function ba(g,k,d){var b,f,c,h,l=g.contents,j=g.dataTypes;while(\"*\"===j[0]){j.shift(),void 0===b&&(b=g.mimeType||k.getResponseHeader(\"Content-Type\"))}if(b){for(f in l){if(l[f]&&l[f].test(b)){j.unshift(f);break}}}if(j[0] in d){c=j[0]}else{for(f in d){if(!j[0]||g.converters[f+\" \"+j[0]]){c=f;break}h||(h=f)}c=c||h}if(c){return c!==j[0]&&j.unshift(c),d[c]}}function cn(j,v,f,b){var h,d,m,w,p,g={},k=j.dataTypes.slice();if(k[1]){for(m in j.converters){g[m.toLowerCase()]=j.converters[m]}}d=k.shift();while(d){if(j.responseFields[d]&&(f[j.responseFields[d]]=v),!p&&b&&j.dataFilter&&(v=j.dataFilter(v,j.dataType)),p=d,d=k.shift()){if(\"*\"===d){d=p}else{if(\"*\"!==p&&p!==d){if(!(m=g[p+\" \"+d]||g[\"* \"+d])){for(h in g){if((w=h.split(\" \"))[1]===d&&(m=g[p+\" \"+w[0]]||g[\"* \"+w[0]])){!0===m?m=g[h]:!0!==g[h]&&(d=w[0],k.unshift(w[1]));break}}}if(!0!==m){if(m&&j[\"throws\"]){v=m(v)}else{try{v=m(v)}catch(j){return{state:\"parsererror\",error:m?j:\"No conversion from \"+p+\" to \"+d}}}}}}}}return{state:\"success\",data:v}}bq.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aF.href,type:\"GET\",isLocal:az.test(aF.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":b5,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":bq.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(b,a){return a?cq(cq(b,bq.ajaxSettings),a):cq(bq.ajaxSettings,b)},ajaxPrefilter:ad(b8),ajaxTransport:ad(bj),ajax:function(D,J){\"object\"==typeof D&&(J=D,D=void 0),J=J||{};var N,I,W,F,A,L,U,Q,H,S,O=bq.ajaxSetup({},J),P=O.context||O,r=O.context&&(P.nodeType||P.jquery)?bq(P):bq.event,z=bq.Deferred(),K=bq.Callbacks(\"once memory\"),w=O.statusCode||{},V={},j={},G=\"canceled\",B={readyState:0,getResponseHeader:function(b){var a;if(U){if(!F){F={};while(a=aH.exec(W)){F[a[1].toLowerCase()]=a[2]}}a=F[b.toLowerCase()]}return null==a?null:a},getAllResponseHeaders:function(){return U?W:null},setRequestHeader:function(b,a){return null==U&&(b=j[b.toLowerCase()]=j[b.toLowerCase()]||b,V[b]=a),this},overrideMimeType:function(a){return null==U&&(O.mimeType=a),this},statusCode:function(b){var a;if(b){if(U){B.always(b[B.status])}else{for(a in b){w[a]=[w[a],b[a]]}}}return this},abort:function(b){var a=b||G;return N&&N.abort(a),M(0,a),this}};if(z.promise(B),O.url=((D||O.url||aF.href)+\"\").replace(ah,aF.protocol+\"//\"),O.type=J.method||J.type||O.method||O.type,O.dataTypes=(O.dataType||\"*\").toLowerCase().match(cf)||[\"\"],null==O.crossDomain){L=bx.createElement(\"a\");try{L.href=O.url,L.href=L.href,O.crossDomain=aN.protocol+\"//\"+aN.host!=L.protocol+\"//\"+L.host}catch(R){O.crossDomain=!0}}if(O.data&&O.processData&&\"string\"!=typeof O.data&&(O.data=bq.param(O.data,O.traditional)),aa(b8,O,J,B),U){return B}(Q=bq.event&&O.global)&&0==bq.active++&&bq.event.trigger(\"ajaxStart\"),O.type=O.type.toUpperCase(),O.hasContent=!aY.test(O.type),I=O.url.replace(a7,\"\"),O.hasContent?O.data&&O.processData&&0===(O.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(O.data=O.data.replace(a8,\"+\")):(S=O.url.slice(I.length),O.data&&(O.processData||\"string\"==typeof O.data)&&(I+=(af.test(I)?\"&\":\"?\")+O.data,delete O.data),!1===O.cache&&(I=I.replace(cC,\"$1\"),S=(af.test(I)?\"&\":\"?\")+\"_=\"+an+++S),O.url=I+S),O.ifModified&&(bq.lastModified[I]&&B.setRequestHeader(\"If-Modified-Since\",bq.lastModified[I]),bq.etag[I]&&B.setRequestHeader(\"If-None-Match\",bq.etag[I])),(O.data&&O.hasContent&&!1!==O.contentType||J.contentType)&&B.setRequestHeader(\"Content-Type\",O.contentType),B.setRequestHeader(\"Accept\",O.dataTypes[0]&&O.accepts[O.dataTypes[0]]?O.accepts[O.dataTypes[0]]+(\"*\"!==O.dataTypes[0]?\", \"+b5+\"; q=0.01\":\"\"):O.accepts[\"*\"]);for(H in O.headers){B.setRequestHeader(H,O.headers[H])}if(O.beforeSend&&(!1===O.beforeSend.call(P,B,O)||U)){return B.abort()}if(G=\"abort\",K.add(O.complete),B.done(O.success),B.fail(O.error),N=aa(bj,O,J,B)){if(B.readyState=1,Q&&r.trigger(\"ajaxSend\",[B,O]),U){return B}O.async&&O.timeout>0&&(A=R.setTimeout(function(){B.abort(\"timeout\")},O.timeout));try{U=!1,N.send(V,M)}catch(R){if(U){throw R}M(-1,R)}}else{M(-1,\"No Transport\")}function M(m,f,a,o){var g,e,i,k,h,c=f;U||(U=!0,A&&R.clearTimeout(A),N=void 0,W=o||\"\",B.readyState=m>0?4:0,g=m>=200&&m<300||304===m,a&&(k=ba(O,B,a)),k=cn(O,k,B,g),g?(O.ifModified&&((h=B.getResponseHeader(\"Last-Modified\"))&&(bq.lastModified[I]=h),(h=B.getResponseHeader(\"etag\"))&&(bq.etag[I]=h)),204===m||\"HEAD\"===O.type?c=\"nocontent\":304===m?c=\"notmodified\":(c=k.state,e=k.data,g=!(i=k.error))):(i=c,!m&&c||(c=\"error\",m<0&&(m=0))),B.status=m,B.statusText=(f||c)+\"\",g?z.resolveWith(P,[e,c,B]):z.rejectWith(P,[B,c,i]),B.statusCode(w),w=void 0,Q&&r.trigger(g?\"ajaxSuccess\":\"ajaxError\",[B,O,g?e:i]),K.fireWith(P,[B,c]),Q&&(r.trigger(\"ajaxComplete\",[B,O]),--bq.active||bq.event.trigger(\"ajaxStop\")))}return B},getJSON:function(b,a,c){return bq.get(b,a,c,\"json\")},getScript:function(b,a){return bq.get(b,void 0,a,\"script\")}}),bq.each([\"get\",\"post\"],function(b,a){bq[a]=function(f,g,d,c){return bL(g)&&(c=c||d,d=g,g=void 0),bq.ajax(bq.extend({url:f,type:a,dataType:c,data:g,success:d},bq.isPlainObject(f)&&f))}}),bq._evalUrl=function(a){return bq.ajax({url:a,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,\"throws\":!0})},bq.fn.extend({wrapAll:function(b){var a;return this[0]&&(bL(b)&&(b=b.call(this[0])),a=bq(b,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&a.insertBefore(this[0]),a.map(function(){var c=this;while(c.firstElementChild){c=c.firstElementChild}return c}).append(this)),this},wrapInner:function(a){return bL(a)?this.each(function(b){bq(this).wrapInner(a.call(this,b))}):this.each(function(){var b=bq(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(b){var a=bL(b);return this.each(function(c){bq(this).wrapAll(a?b.call(this,c):b)})},unwrap:function(a){return this.parent(a).not(\"body\").each(function(){bq(this).replaceWith(this.childNodes)}),this}}),bq.expr.pseudos.hidden=function(a){return !bq.expr.pseudos.visible(a)},bq.expr.pseudos.visible=function(a){return !!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},bq.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(a){}};var bN={0:200,1223:204},cM=bq.ajaxSettings.xhr();bK.cors=!!cM&&\"withCredentials\" in cM,bK.ajax=cM=!!cM,bq.ajaxTransport(function(a){var c,b;if(bK.cors||cM&&!a.crossDomain){return{send:function(f,j){var d,g=a.xhr();if(g.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields){for(d in a.xhrFields){g[d]=a.xhrFields[d]}}a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),a.crossDomain||f[\"X-Requested-With\"]||(f[\"X-Requested-With\"]=\"XMLHttpRequest\");for(d in f){g.setRequestHeader(d,f[d])}c=function(i){return function(){c&&(c=b=g.onload=g.onerror=g.onabort=g.ontimeout=g.onreadystatechange=null,\"abort\"===i?g.abort():\"error\"===i?\"number\"!=typeof g.status?j(0,\"error\"):j(g.status,g.statusText):j(bN[g.status]||g.status,g.statusText,\"text\"!==(g.responseType||\"text\")||\"string\"!=typeof g.responseText?{binary:g.response}:{text:g.responseText},g.getAllResponseHeaders()))}},g.onload=c(),b=g.onerror=g.ontimeout=c(\"error\"),void 0!==g.onabort?g.onabort=b:g.onreadystatechange=function(){4===g.readyState&&h.setTimeout(function(){c&&b()})},c=c(\"abort\");try{g.send(a.hasContent&&a.data||null)}catch(h){if(c){throw h}}},abort:function(){c&&c()}}}}),bq.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),bq.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(a){return bq.globalEval(a),a}}}),bq.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\")}),bq.ajaxTransport(\"script\",function(b){if(b.crossDomain){var a,c;return{send:function(d,e){a=bq(\"<script>\").prop({charset:b.scriptCharset,src:b.url}).on(\"load error\",c=function(f){a.remove(),c=null,f&&e(\"error\"===f.type?404:200,f.type)}),bx.head.appendChild(a[0])},abort:function(){c&&c()}}}});var a2=[],ap=/(=)\\?(?=&|$)|\\?\\?/;bq.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=a2.pop()||bq.expando+\"_\"+an++;return this[a]=!0,a}}),bq.ajaxPrefilter(\"json jsonp\",function(d,h,f){var c,g,b,e=!1!==d.jsonp&&(ap.test(d.url)?\"url\":\"string\"==typeof d.data&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&ap.test(d.data)&&\"data\");if(e||\"jsonp\"===d.dataTypes[0]){return c=d.jsonpCallback=bL(d.jsonpCallback)?d.jsonpCallback():d.jsonpCallback,e?d[e]=d[e].replace(ap,\"$1\"+c):!1!==d.jsonp&&(d.url+=(af.test(d.url)?\"&\":\"?\")+d.jsonp+\"=\"+c),d.converters[\"script json\"]=function(){return b||bq.error(c+\" was not called\"),b[0]},d.dataTypes[0]=\"json\",g=bO[c],bO[c]=function(){b=arguments},f.always(function(){void 0===g?bq(bO).removeProp(c):bO[c]=g,d[c]&&(d.jsonpCallback=h.jsonpCallback,a2.push(c)),b&&bL(g)&&g(b[0]),b=g=void 0}),\"script\"}}),bK.createHTMLDocument=function(){var a=bx.implementation.createHTMLDocument(\"\").body;return a.innerHTML=\"<form></form><form></form>\",2===a.childNodes.length}(),bq.parseHTML=function(f,d,h){if(\"string\"!=typeof f){return[]}\"boolean\"==typeof d&&(h=d,d=!1);var c,g,b;return d||(bK.createHTMLDocument?((c=(d=bx.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=bx.location.href,d.head.appendChild(c)):d=bx),g=cx.exec(f),b=!h&&[],g?[d.createElement(g[1])]:(g=ac([f],d,b),b&&b.length&&bq(b).remove(),bq.merge([],g.childNodes))},bq.fn.load=function(h,d,k){var g,c,j,b=this,f=h.indexOf(\" \");return f>-1&&(g=aq(h.slice(f)),h=h.slice(0,f)),bL(d)?(k=d,d=void 0):d&&\"object\"==typeof d&&(c=\"POST\"),b.length>0&&bq.ajax({url:h,type:c||\"GET\",dataType:\"html\",data:d}).done(function(a){j=arguments,b.html(g?bq(\"<div>\").append(bq.parseHTML(a)).find(g):a)}).always(k&&function(i,a){b.each(function(){k.apply(this,j||[i.responseText,a,i])})}),this},bq.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(b,a){bq.fn[a]=function(c){return this.on(a,c)}}),bq.expr.pseudos.animated=function(a){return bq.grep(bq.timers,function(b){return a===b.elem}).length},bq.offset={setOffset:function(v,z,h){var b,k,g,x,A,y,j,w=bq.css(v,\"position\"),m=bq(v),d={};\"static\"===w&&(v.style.position=\"relative\"),A=m.offset(),g=bq.css(v,\"top\"),y=bq.css(v,\"left\"),(j=(\"absolute\"===w||\"fixed\"===w)&&(g+y).indexOf(\"auto\")>-1)?(x=(b=m.position()).top,k=b.left):(x=parseFloat(g)||0,k=parseFloat(y)||0),bL(z)&&(z=z.call(v,h,bq.extend({},A))),null!=z.top&&(d.top=z.top-A.top+x),null!=z.left&&(d.left=z.left-A.left+k),\"using\" in z?z.using.call(v,d):m.css(d)}},bq.fn.extend({offset:function(c){if(arguments.length){return void 0===c?this:this.each(function(e){bq.offset.setOffset(this,c,e)})}var a,d,b=this[0];if(b){return b.getClientRects().length?(a=b.getBoundingClientRect(),d=b.ownerDocument.defaultView,{top:a.top+d.pageYOffset,left:a.left+d.pageXOffset}):{top:0,left:0}}},position:function(){if(this[0]){var d,b,f,c=this[0],a={top:0,left:0};if(\"fixed\"===bq.css(c,\"position\")){b=c.getBoundingClientRect()}else{b=this.offset(),f=c.ownerDocument,d=c.offsetParent||f.documentElement;while(d&&(d===f.body||d===f.documentElement)&&\"static\"===bq.css(d,\"position\")){d=d.parentNode}d&&d!==c&&1===d.nodeType&&((a=bq(d).offset()).top+=bq.css(d,\"borderTopWidth\",!0),a.left+=bq.css(d,\"borderLeftWidth\",!0))}return{top:b.top-a.top-bq.css(c,\"marginTop\",!0),left:b.left-a.left-bq.css(c,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&\"static\"===bq.css(a,\"position\")){a=a.offsetParent}return a||ci})}}),bq.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(b,a){var c=\"pageYOffset\"===a;bq.fn[b]=function(d){return bm(this,function(h,g,f){var j;if(bn(h)?j=h:9===h.nodeType&&(j=h.defaultView),void 0===f){return j?j[a]:h[g]}j?j.scrollTo(c?j.pageXOffset:f,c?f:j.pageYOffset):h[g]=f},b,d,arguments.length)}}),bq.each([\"top\",\"left\"],function(b,a){bq.cssHooks[a]=ag(bK.pixelPosition,function(c,d){if(d){return d=aj(c,a),bu.test(d)?bq(c).position()[a]+\"px\":d}})}),bq.each({Height:\"height\",Width:\"width\"},function(b,a){bq.each({padding:\"inner\"+b,content:a,\"\":\"outer\"+b},function(d,c){bq.fn[c]=function(f,h){var e=arguments.length&&(d||\"boolean\"!=typeof f),g=d||(!0===f||!0===h?\"margin\":\"border\");return bm(this,function(k,m,j){var l;return bn(k)?0===c.indexOf(\"outer\")?k[\"inner\"+b]:k.document.documentElement[\"client\"+b]:9===k.nodeType?(l=k.documentElement,Math.max(k.body[\"scroll\"+b],l[\"scroll\"+b],k.body[\"offset\"+b],l[\"offset\"+b],l[\"client\"+b])):void 0===j?bq.css(k,m,g):bq.style(k,m,j,g)},a,e?f:void 0,e)}})}),bq.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(b,a){bq.fn[a]=function(c,d){return arguments.length>0?this.on(a,null,c,d):this.trigger(a)}}),bq.fn.extend({hover:function(b,a){return this.mouseenter(b).mouseleave(a||b)}}),bq.fn.extend({bind:function(b,a,c){return this.on(b,null,a,c)},unbind:function(b,a){return this.off(b,null,a)},delegate:function(c,a,d,b){return this.on(a,c,d,b)},undelegate:function(b,a,c){return 1===arguments.length?this.off(b,\"**\"):this.off(a,b||\"**\",c)}}),bq.proxy=function(d,b){var f,c,a;if(\"string\"==typeof b&&(f=d[b],b=d,d=f),bL(d)){return c=bB.call(arguments,2),a=function(){return d.apply(b||this,c.concat(bB.call(arguments)))},a.guid=d.guid=d.guid||bq.guid++,a}},bq.holdReady=function(a){a?bq.readyWait++:bq.ready(!0)},bq.isArray=Array.isArray,bq.parseJSON=JSON.parse,bq.nodeName=cd,bq.isFunction=bL,bq.isWindow=bn,bq.camelCase=cm,bq.type=bp,bq.now=Date.now,bq.isNumeric=function(b){var a=bq.type(b);return(\"number\"===a||\"string\"===a)&&!isNaN(b-parseFloat(b))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return bq});var bz=bO.jQuery,bg=bO.$;return bq.noConflict=function(a){return bO.$===bq&&(bO.$=bg),a&&bO.jQuery===bq&&(bO.jQuery=bz),bq},bv||(bO.jQuery=bO.$=bq),bq});var MTIProjectId=\"0e71051d-80ba-489d-a6f6-b2adbda0057b\";(function(){var a=document.createElement(\"script\");a.type=\"text/javascript\";a.async=\"true\";a.src=(\"https:\"==document.location.protocol?\"https:\":\"http:\")+\"//fast.fonts.net/t/trackingCode.js\";(document.getElementsByTagName(\"head\")[0]||document.getElementsByTagName(\"body\")[0]).appendChild(a)})();var CollapsibleLists=new function(){this.apply=function(g){var f=document.getElementsByTagName(\"ul\");for(var e=0;e<f.length;e++){if(f[e].className.match(/(^| )collapsibleList( |$)/)){this.applyTo(f[e],true);if(!g){var d=f[e].getElementsByTagName(\"ul\");for(var c=0;c<d.length;c++){d[c].className+=\" collapsibleList\"}}}}};this.applyTo=function(f,e){var d=f.getElementsByTagName(\"li\");for(var c=0;c<d.length;c++){if(!e||f==d[c].parentNode){if(d[c].addEventListener){d[c].addEventListener(\"mousedown\",function(g){g.preventDefault()},false)}else{d[c].attachEvent(\"onselectstart\",function(){event.returnValue=false})}if(d[c].addEventListener){d[c].addEventListener(\"click\",b(d[c]),false)}else{d[c].attachEvent(\"onclick\",b(d[c]))}a(d[c])}}};function b(c){return function(f){if(!f){f=window.event}var d=(f.target?f.target:f.srcElement);while(d.nodeName!=\"LI\"){d=d.parentNode}if(d==c){a(c)}}}function a(d){var g=d.className.match(/(^| )collapsibleListClosed( |$)/);var e=d.getElementsByTagName(\"ul\");for(var f=0;f<e.length;f++){var c=e[f];while(c.nodeName!=\"LI\"){c=c.parentNode}if(c==d){e[f].style.display=(g?\"block\":\"none\")}}d.className=d.className.replace(/(^| )collapsibleList(Open|Closed)( |$)/,\"\");if(e.length>0){d.className+=\" collapsibleList\"+(g?\"Open\":\"Closed\")}}}();(function(){function K(){var g=\"{}\";if(\"userDataBehavior\"==S){R.load(\"jStorage\");try{g=R.getAttribute(\"jStorage\")}catch(f){}try{J=R.getAttribute(\"jStorage_update\")}catch(h){}Q.jStorage=g}I();d();o()}function l(){var c;clearTimeout(k);k=setTimeout(function(){if(\"localStorage\"==S||\"globalStorage\"==S){c=Q.jStorage_update}else{if(\"userDataBehavior\"==S){R.load(\"jStorage\");try{c=R.getAttribute(\"jStorage_update\")}catch(f){}}}if(c&&c!=J){J=c;var g=O.parse(O.stringify(T.__jstorage_meta.CRC32)),h;K();h=O.parse(O.stringify(T.__jstorage_meta.CRC32));var p,r=[],m=[];for(p in g){g.hasOwnProperty(p)&&(h[p]?g[p]!=h[p]&&\"2.\"==String(g[p]).substr(0,2)&&r.push(p):m.push(p))}for(p in h){h.hasOwnProperty(p)&&(g[p]||r.push(p))}H(r,\"updated\");H(m,\"deleted\")}},25)}function H(g,f){g=[].concat(g||[]);var r,h,m,p;if(\"flushed\"==f){g=[];for(r in P){P.hasOwnProperty(r)&&g.push(r)}f=\"deleted\"}r=0;for(m=g.length;r<m;r++){if(P[g[r]]){for(h=0,p=P[g[r]].length;h<p;h++){P[g[r]][h](g[r],f)}}if(P[\"*\"]){for(h=0,p=P[\"*\"].length;h<p;h++){P[\"*\"][h](g[r],f)}}}}function j(){var f=(+new Date).toString();if(\"localStorage\"==S||\"globalStorage\"==S){try{Q.jStorage_update=f}catch(c){S=!1}}else{\"userDataBehavior\"==S&&(R.setAttribute(\"jStorage_update\",f),R.save(\"jStorage\"))}l()}function I(){if(Q.jStorage){try{T=O.parse(String(Q.jStorage))}catch(c){Q.jStorage=\"{}\"}}else{Q.jStorage=\"{}\"}a=Q.jStorage?String(Q.jStorage).length:0;T.__jstorage_meta||(T.__jstorage_meta={});T.__jstorage_meta.CRC32||(T.__jstorage_meta.CRC32={})}function e(){if(T.__jstorage_meta.PubSub){for(var g=+new Date-2000,c=0,f=T.__jstorage_meta.PubSub.length;c<f;c++){if(T.__jstorage_meta.PubSub[c][0]<=g){T.__jstorage_meta.PubSub.splice(c,T.__jstorage_meta.PubSub.length-c);break}}T.__jstorage_meta.PubSub.length||delete T.__jstorage_meta.PubSub}try{Q.jStorage=O.stringify(T),R&&(R.setAttribute(\"jStorage\",Q.jStorage),R.save(\"jStorage\")),a=Q.jStorage?String(Q.jStorage).length:0}catch(h){}}function M(c){if(\"string\"!=typeof c&&\"number\"!=typeof c){throw new TypeError(\"Key name must be string or numeric\")}if(\"__jstorage_meta\"==c){throw new TypeError(\"Reserved key name\")}return !0}function d(){var g,c,f,h,p=Infinity,r=!1,m=[];clearTimeout(i);if(T.__jstorage_meta&&\"object\"==typeof T.__jstorage_meta.TTL){g=+new Date;f=T.__jstorage_meta.TTL;h=T.__jstorage_meta.CRC32;for(c in f){f.hasOwnProperty(c)&&(f[c]<=g?(delete f[c],delete h[c],delete T[c],r=!0,m.push(c)):f[c]<p&&(p=f[c]))}Infinity!=p&&(i=setTimeout(d,Math.min(p-g,2147483647)));r&&(e(),j(),H(m,\"deleted\"))}}function o(){var h;if(T.__jstorage_meta.PubSub){var c,f=N,m=[];for(h=T.__jstorage_meta.PubSub.length-1;0<=h;h--){c=T.__jstorage_meta.PubSub[h],c[0]>N&&(f=c[0],m.unshift(c))}for(h=m.length-1;0<=h;h--){c=m[h][1];var s=m[h][2];if(n[c]){for(var t=0,r=n[c].length;t<r;t++){try{n[c][t](c,O.parse(O.stringify(s)))}catch(p){}}}}N=f}}var b=window.jQuery||window.$||(window.$={}),O={parse:window.JSON&&(window.JSON.parse||window.JSON.decode)||String.prototype.evalJSON&&function(c){return String(c).evalJSON()}||b.parseJSON||b.evalJSON,stringify:Object.toJSON||window.JSON&&(window.JSON.stringify||window.JSON.encode)||b.toJSON};if(\"function\"!==typeof O.parse||\"function\"!==typeof O.stringify){throw Error(\"No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page\")}var T={__jstorage_meta:{CRC32:{}}},Q={jStorage:\"{}\"},R=null,a=0,S=!1,P={},k=!1,J=0,n={},N=+new Date,i,L={isXML:function(c){return(c=(c?c.ownerDocument||c:0).documentElement)?\"HTML\"!==c.nodeName:!1},encode:function(g){if(!this.isXML(g)){return !1}try{return(new XMLSerializer).serializeToString(g)}catch(f){try{return g.xml}catch(h){}}return !1},decode:function(f){var c=\"DOMParser\" in window&&(new DOMParser).parseFromString||window.ActiveXObject&&function(h){var g=new ActiveXObject(\"Microsoft.XMLDOM\");g.async=\"false\";g.loadXML(h);return g};if(!c){return !1}f=c.call(\"DOMParser\" in window&&new DOMParser||window,f,\"text/xml\");return this.isXML(f)?f:!1}};b.jStorage={version:\"0.4.12\",set:function(w,v,c){M(w);c=c||{};if(\"undefined\"==typeof v){return this.deleteKey(w),v}if(L.isXML(v)){v={_is_xml:!0,xml:L.encode(v)}}else{if(\"function\"==typeof v){return}v&&\"object\"==typeof v&&(v=O.parse(O.stringify(v)))}T[w]=v;for(var m=T.__jstorage_meta.CRC32,u=O.stringify(v),r=u.length,t=2538058380^r,p=0,s;4<=r;){s=u.charCodeAt(p)&255|(u.charCodeAt(++p)&255)<<8|(u.charCodeAt(++p)&255)<<16|(u.charCodeAt(++p)&255)<<24,s=1540483477*(s&65535)+((1540483477*(s>>>16)&65535)<<16),s^=s>>>24,s=1540483477*(s&65535)+((1540483477*(s>>>16)&65535)<<16),t=1540483477*(t&65535)+((1540483477*(t>>>16)&65535)<<16)^s,r-=4,++p}switch(r){case 3:t^=(u.charCodeAt(p+2)&255)<<16;case 2:t^=(u.charCodeAt(p+1)&255)<<8;case 1:t^=u.charCodeAt(p)&255,t=1540483477*(t&65535)+((1540483477*(t>>>16)&65535)<<16)}t^=t>>>13;t=1540483477*(t&65535)+((1540483477*(t>>>16)&65535)<<16);m[w]=\"2.\"+((t^t>>>15)>>>0);this.setTTL(w,c.TTL||0);H(w,\"updated\");return v},get:function(f,c){M(f);return f in T?T[f]&&\"object\"==typeof T[f]&&T[f]._is_xml?L.decode(T[f].xml):T[f]:\"undefined\"==typeof c?null:c},deleteKey:function(c){M(c);return c in T?(delete T[c],\"object\"==typeof T.__jstorage_meta.TTL&&c in T.__jstorage_meta.TTL&&delete T.__jstorage_meta.TTL[c],delete T.__jstorage_meta.CRC32[c],e(),j(),H(c,\"deleted\"),!0):!1},setTTL:function(g,c){var f=+new Date;M(g);c=Number(c)||0;return g in T?(T.__jstorage_meta.TTL||(T.__jstorage_meta.TTL={}),0<c?T.__jstorage_meta.TTL[g]=f+c:delete T.__jstorage_meta.TTL[g],e(),d(),j(),!0):!1},getTTL:function(f){var c=+new Date;M(f);return f in T&&T.__jstorage_meta.TTL&&T.__jstorage_meta.TTL[f]?(f=T.__jstorage_meta.TTL[f]-c)||0:0},flush:function(){T={__jstorage_meta:{CRC32:{}}};e();j();H(null,\"flushed\");return !0},storageObj:function(){function c(){}c.prototype=T;return new c},index:function(){var f=[],c;for(c in T){T.hasOwnProperty(c)&&\"__jstorage_meta\"!=c&&f.push(c)}return f},storageSize:function(){return a},currentBackend:function(){return S},storageAvailable:function(){return !!S},listenKeyChange:function(f,c){M(f);P[f]||(P[f]=[]);P[f].push(c)},stopListening:function(g,f){M(g);if(P[g]){if(f){for(var h=P[g].length-1;0<=h;h--){P[g][h]==f&&P[g].splice(h,1)}}else{delete P[g]}}},subscribe:function(f,c){f=(f||\"\").toString();if(!f){throw new TypeError(\"Channel not defined\")}n[f]||(n[f]=[]);n[f].push(c)},publish:function(f,c){f=(f||\"\").toString();if(!f){throw new TypeError(\"Channel not defined\")}T.__jstorage_meta||(T.__jstorage_meta={});T.__jstorage_meta.PubSub||(T.__jstorage_meta.PubSub=[]);T.__jstorage_meta.PubSub.unshift([+new Date,f,c]);e();j()},reInit:function(){K()},noConflict:function(c){delete window.$.jStorage;c&&(window.jStorage=this);return this}};(function(){var h=!1;if(\"localStorage\" in window){try{window.localStorage.setItem(\"_tmptest\",\"tmpval\"),h=!0,window.localStorage.removeItem(\"_tmptest\")}catch(g){}}if(h){try{window.localStorage&&(Q=window.localStorage,S=\"localStorage\",J=Q.jStorage_update)}catch(t){}}else{if(\"globalStorage\" in window){try{window.globalStorage&&(Q=\"localhost\"==window.location.hostname?window.globalStorage[\"localhost.localdomain\"]:window.globalStorage[window.location.hostname],S=\"globalStorage\",J=Q.jStorage_update)}catch(p){}}else{if(R=document.createElement(\"link\"),R.addBehavior){R.style.behavior=\"url(#default#userData)\";document.getElementsByTagName(\"head\")[0].appendChild(R);try{R.load(\"jStorage\")}catch(s){R.setAttribute(\"jStorage\",\"{}\"),R.save(\"jStorage\"),R.load(\"jStorage\")}h=\"{}\";try{h=R.getAttribute(\"jStorage\")}catch(f){}try{J=R.getAttribute(\"jStorage_update\")}catch(r){}Q.jStorage=h;S=\"userDataBehavior\"}else{R=null;return}}}I();d();\"localStorage\"==S||\"globalStorage\"==S?\"addEventListener\" in window?window.addEventListener(\"storage\",l,!1):document.attachEvent(\"onstorage\",l):\"userDataBehavior\"==S&&setInterval(l,1000);o();\"addEventListener\" in window&&window.addEventListener(\"pageshow\",function(c){c.persisted&&l()},!1)})()})();$(function(){if($(\"#nav-menu\").length){$(\".collapsibleListOpen, .collapsibleListClosed\").toggleClass(\"collapsibleListOpen collapsibleListClosed\");CollapsibleLists.applyTo(document.getElementById(\"nav-menu\"))}$(\"#nav-menu\").click(function(a){if(a.target==this){$(this).toggleClass(\"shown\")}})});$(function(){$(\"#nav-icon\").click(function(){$(this).toggleClass(\"open\")})});$(document).ready(function(){checkSize();$(window).resize(checkSize)});function checkSize(){var a=$(\"#js-sidebar-links\").children(\"nav\"),b=$(\"#sidebar-wrapper\").children(\"nav\");if(($(\"#js-sidebar-links\").css(\"display\")==\"block\")&&b.length){b.appendTo($(\"#js-sidebar-links\"))}else{if(($(\"#js-sidebar-links\").css(\"display\")==\"none\")&&a.length){a.appendTo($(\"#sidebar-wrapper\"))}}}function gtmEvent(){if(typeof arguments[0]===\"object\"){var a=arguments[0];a.event=\"customEvent\"}if(typeof arguments[0]===\"string\"){var a={event:\"customEvent\",eventCategory:arguments[0],eventAction:arguments[1],eventLabel:typeof arguments[2]!==\"undefined\"?arguments[2]:\"\",eventValue:typeof arguments[3]!==\"undefined\"?arguments[3]:\"\"};if(arguments[4]&&typeof arguments[4]===\"object\"&&typeof arguments[4].nonInteraction!==\"undefined\"){a.nonInteraction=arguments[4].nonInteraction}}if(a){var b=dataLayer.push(a);if(a.debug||(arguments[4]&&typeof arguments[4]===\"object\"&&typeof arguments[4].debug)){console.debug(\"Custom Event Processed?\",!b,a)}}}function gaPushEvent(b){var a={hitType:\"event\",eventCategory:b[1],eventAction:b[2]};if(b[3]){a.eventLabel=b[3]}if(b[4]){a.eventValue=b[4]}if(b[5]){a.nonInteraction=Number(b[4])}if(typeof dataLayer===\"object\"||typeof dataLayer===\"array\"){gtmEvent(a)}else{if(typeof ga===\"function\"){ga(\"send\",a)}else{if(typeof _gaq===\"object\"||typeof _gaq===\"array\"){_gaq.push(b)}}}}jQuery(function(a){a.expr[\":\"].external=function(b){return !b.href.match(/^mailto:/)&&!b.href.match(/^#:/)&&(b.hostname.replace(/^www\\./i,\"\")!=document.location.hostname.replace(/^www\\./i,\"\"))};a(\"a:external\").on(\"click keypress\",function(d){var b=a(this).attr(\"href\");var c=[\"_trackEvent\",\"Link\",\"Outbound\",b,null,true];gaPushEvent(c)});a('a[href^=\"mailto:\"]').on(\"click keypress\",function(d){var b=a(this).attr(\"href\").substring(7);var c=[\"_trackEvent\",\"Link\",\"Email\",b];gaPushEvent(c)});a(\".feedback-positive, .feedback-negative\").on(\"click keypress\",function(f){f.preventDefault();var b=a(this).hasClass(\"feedback-positive\");var c=b?\"Good\":\"Bad\";var g=Number(b)*10;var d=[\"_trackEvent\",\"Feedback\",\"Vote\",c,g];gaPushEvent(d);a(this).closest(\".feedback\").text(\"Thanks for providing feedback!\")});a(\".feedback-more\").on(\"click keypress\",function(){var b=[\"_trackEvent\",\"Feedback\",\"More\",\"Click\"];gaPushEvent(b);a(this).closest(\".feedback\").text(\"Thanks for providing feedback!\")});a(\"img[height=1][width=1]\").hide()});\n/*!\n * Modernizr v2.7.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n;window.Modernizr=(function(B,c,g){var K=\"2.7.2\",x={},z=true,N=c.documentElement,a=\"modernizr\",J=c.createElement(a),F=J.style,M=c.createElement(\"input\"),D=\":)\",b={}.toString,j=\" -webkit- -moz- -o- -ms- \".split(\" \"),h=\"Webkit Moz O ms\",G=h.split(\" \"),L=h.toLowerCase().split(\" \"),I={svg:\"http://www.w3.org/2000/svg\"},l={},p={},f={},e=[],k=e.slice,t,n=function(W,Y,Q,X){var P,V,S,T,O=c.createElement(\"div\"),U=c.body,R=U||c.createElement(\"body\");if(parseInt(Q,10)){while(Q--){S=c.createElement(\"div\");S.id=X?X[Q]:a+(Q+1);O.appendChild(S)}}P=[\"&#173;\",'<style id=\"s',a,'\">',W,\"</style>\"].join(\"\");O.id=a;(U?O:R).innerHTML+=P;R.appendChild(O);if(!U){R.style.background=\"\";R.style.overflow=\"hidden\";T=N.style.overflow;N.style.overflow=\"hidden\";N.appendChild(R)}V=Y(O,W);if(!U){R.parentNode.removeChild(R);N.style.overflow=T}else{O.parentNode.removeChild(O)}return !!V},H=function(Q){var P=B.matchMedia||B.msMatchMedia;if(P){return P(Q).matches}var O;n(\"@media \"+Q+\" { #\"+a+\" { position: absolute; } }\",function(R){O=(B.getComputedStyle?getComputedStyle(R,null):R.currentStyle)[\"position\"]==\"absolute\"});return O},o=(function(){var P={select:\"input\",change:\"input\",submit:\"form\",reset:\"form\",error:\"img\",load:\"img\",abort:\"img\"};function O(Q,S){S=S||c.createElement(P[Q]||\"div\");Q=\"on\"+Q;var R=Q in S;if(!R){if(!S.setAttribute){S=c.createElement(\"div\")}if(S.setAttribute&&S.removeAttribute){S.setAttribute(Q,\"\");R=s(S[Q],\"function\");if(!s(S[Q],\"undefined\")){S[Q]=g}S.removeAttribute(Q)}}S=null;return R}return O})(),i=({}).hasOwnProperty,y;if(!s(i,\"undefined\")&&!s(i.call,\"undefined\")){y=function(O,P){return i.call(O,P)}}else{y=function(O,P){return((P in O)&&s(O.constructor.prototype[P],\"undefined\"))}}if(!Function.prototype.bind){Function.prototype.bind=function d(Q){var R=this;if(typeof R!=\"function\"){throw new TypeError()}var O=k.call(arguments,1),P=function(){if(this instanceof P){var U=function(){};U.prototype=R.prototype;var T=new U();var S=R.apply(T,O.concat(k.call(arguments)));if(Object(S)===S){return S}return T}else{return R.apply(Q,O.concat(k.call(arguments)))}};return P}}function E(O){F.cssText=O}function v(P,O){return E(j.join(P+\";\")+(O||\"\"))}function s(P,O){return typeof P===O}function u(P,O){return !!~(\"\"+P).indexOf(O)}function A(Q,O){for(var P in Q){var R=Q[P];if(!u(R,\"-\")&&F[R]!==g){return O==\"pfx\"?R:true}}return false}function r(P,S,R){for(var O in P){var Q=S[P[O]];if(Q!==g){if(R===false){return P[O]}if(s(Q,\"function\")){return Q.bind(R||S)}return Q}}return false}function m(S,O,R){var P=S.charAt(0).toUpperCase()+S.slice(1),Q=(S+\" \"+G.join(P+\" \")+P).split(\" \");if(s(O,\"string\")||s(O,\"undefined\")){return A(Q,O)}else{Q=(S+\" \"+(L).join(P+\" \")+P).split(\" \");return r(Q,O,R)}}l.flexbox=function(){return m(\"flexWrap\")};l.flexboxlegacy=function(){return m(\"boxDirection\")};l.canvas=function(){var O=c.createElement(\"canvas\");return !!(O.getContext&&O.getContext(\"2d\"))};l.canvastext=function(){return !!(x.canvas&&s(c.createElement(\"canvas\").getContext(\"2d\").fillText,\"function\"))};l.webgl=function(){return !!B.WebGLRenderingContext};l.touch=function(){var O;if((\"ontouchstart\" in B)||B.DocumentTouch&&c instanceof DocumentTouch){O=true}else{n([\"@media (\",j.join(\"touch-enabled),(\"),a,\")\",\"{#modernizr{top:9px;position:absolute}}\"].join(\"\"),function(P){O=P.offsetTop===9})}return O};l.geolocation=function(){return\"geolocation\" in navigator};l.postmessage=function(){return !!B.postMessage};l.websqldatabase=function(){return !!B.openDatabase};l.indexedDB=function(){return !!m(\"indexedDB\",B)};l.hashchange=function(){return o(\"hashchange\",B)&&(c.documentMode===g||c.documentMode>7)};l.history=function(){return !!(B.history&&history.pushState)};l.draganddrop=function(){var O=c.createElement(\"div\");return(\"draggable\" in O)||(\"ondragstart\" in O&&\"ondrop\" in O)};l.websockets=function(){return\"WebSocket\" in B||\"MozWebSocket\" in B};l.rgba=function(){E(\"background-color:rgba(150,255,150,.5)\");return u(F.backgroundColor,\"rgba\")};l.hsla=function(){E(\"background-color:hsla(120,40%,100%,.5)\");return u(F.backgroundColor,\"rgba\")||u(F.backgroundColor,\"hsla\")};l.multiplebgs=function(){E(\"background:url(https://),url(https://),red url(https://)\");return(/(url\\s*\\(.*?){3}/).test(F.background)};l.backgroundsize=function(){return m(\"backgroundSize\")};l.borderimage=function(){return m(\"borderImage\")};l.borderradius=function(){return m(\"borderRadius\")};l.boxshadow=function(){return m(\"boxShadow\")};l.textshadow=function(){return c.createElement(\"div\").style.textShadow===\"\"};l.opacity=function(){v(\"opacity:.55\");return(/^0.55$/).test(F.opacity)};l.cssanimations=function(){return m(\"animationName\")};l.csscolumns=function(){return m(\"columnCount\")};l.cssgradients=function(){var Q=\"background-image:\",P=\"gradient(linear,left top,right bottom,from(#9f9),to(white));\",O=\"linear-gradient(left top,#9f9, white);\";E((Q+\"-webkit- \".split(\" \").join(P+Q)+j.join(O+Q)).slice(0,-Q.length));return u(F.backgroundImage,\"gradient\")};l.cssreflections=function(){return m(\"boxReflect\")};l.csstransforms=function(){return !!m(\"transform\")};l.csstransforms3d=function(){var O=!!m(\"perspective\");if(O&&\"webkitPerspective\" in N.style){n(\"@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}\",function(P,Q){O=P.offsetLeft===9&&P.offsetHeight===3})}return O};l.csstransitions=function(){return m(\"transition\")};l.fontface=function(){var O;n('@font-face {font-family:\"font\";src:url(\"https://\")}',function(S,T){var R=c.getElementById(\"smodernizr\"),P=R.sheet||R.styleSheet,Q=P?(P.cssRules&&P.cssRules[0]?P.cssRules[0].cssText:P.cssText||\"\"):\"\";O=/src/i.test(Q)&&Q.indexOf(T.split(\" \")[0])===0});return O};l.generatedcontent=function(){var O;n([\"#\",a,\"{font:0/0 a}#\",a,':after{content:\"',D,'\";visibility:hidden;font:3px/1 a}'].join(\"\"),function(P){O=P.offsetHeight>=3});return O};l.video=function(){var P=c.createElement(\"video\"),O=false;try{if(O=!!P.canPlayType){O=new Boolean(O);O.ogg=P.canPlayType('video/ogg; codecs=\"theora\"').replace(/^no$/,\"\");O.h264=P.canPlayType('video/mp4; codecs=\"avc1.42E01E\"').replace(/^no$/,\"\");O.webm=P.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,\"\")}}catch(Q){}return O};l.audio=function(){var P=c.createElement(\"audio\"),O=false;try{if(O=!!P.canPlayType){O=new Boolean(O);O.ogg=P.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,\"\");O.mp3=P.canPlayType(\"audio/mpeg;\").replace(/^no$/,\"\");O.wav=P.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/,\"\");O.m4a=(P.canPlayType(\"audio/x-m4a;\")||P.canPlayType(\"audio/aac;\")).replace(/^no$/,\"\")}}catch(Q){}return O};l.localstorage=function(){try{localStorage.setItem(a,a);localStorage.removeItem(a);return true}catch(O){return false}};l.sessionstorage=function(){try{sessionStorage.setItem(a,a);sessionStorage.removeItem(a);return true}catch(O){return false}};l.webworkers=function(){return !!B.Worker};l.applicationcache=function(){return !!B.applicationCache};l.svg=function(){return !!c.createElementNS&&!!c.createElementNS(I.svg,\"svg\").createSVGRect};l.inlinesvg=function(){var O=c.createElement(\"div\");O.innerHTML=\"<svg/>\";return(O.firstChild&&O.firstChild.namespaceURI)==I.svg};l.smil=function(){return !!c.createElementNS&&/SVGAnimate/.test(b.call(c.createElementNS(I.svg,\"animate\")))};l.svgclippaths=function(){return !!c.createElementNS&&/SVGClipPath/.test(b.call(c.createElementNS(I.svg,\"clipPath\")))};function C(){x.input=(function(Q){for(var P=0,O=Q.length;P<O;P++){f[Q[P]]=!!(Q[P] in M)}if(f.list){f.list=!!(c.createElement(\"datalist\")&&B.HTMLDataListElement)}return f})(\"autocomplete autofocus list placeholder max min multiple pattern required step\".split(\" \"));x.inputtypes=(function(R){for(var Q=0,P,T,S,O=R.length;Q<O;Q++){M.setAttribute(\"type\",T=R[Q]);P=M.type!==\"text\";if(P){M.value=D;M.style.cssText=\"position:absolute;visibility:hidden;\";if(/^range$/.test(T)&&M.style.WebkitAppearance!==g){N.appendChild(M);S=c.defaultView;P=S.getComputedStyle&&S.getComputedStyle(M,null).WebkitAppearance!==\"textfield\"&&(M.offsetHeight!==0);N.removeChild(M)}else{if(/^(search|tel)$/.test(T)){}else{if(/^(url|email)$/.test(T)){P=M.checkValidity&&M.checkValidity()===false}else{P=M.value!=D}}}}p[R[Q]]=!!P}return p})(\"search tel url email datetime date month week time datetime-local number range color\".split(\" \"))}for(var w in l){if(y(l,w)){t=w.toLowerCase();x[t]=l[w]();e.push((x[t]?\"\":\"no-\")+t)}}x.input||C();x.addTest=function(P,Q){if(typeof P==\"object\"){for(var O in P){if(y(P,O)){x.addTest(O,P[O])}}}else{P=P.toLowerCase();if(x[P]!==g){return x}Q=typeof Q==\"function\"?Q():Q;if(typeof z!==\"undefined\"&&z){N.className+=\" \"+(Q?\"\":\"no-\")+P}x[P]=Q}return x};E(\"\");J=M=null;(function(Y,aa){var U=\"3.7.0\";var R=Y.html5||{};var V=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;var Q=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;var ae;var W=\"_html5shiv\";var O=0;var ac={};var S;(function(){try{var ah=aa.createElement(\"a\");ah.innerHTML=\"<xyz></xyz>\";ae=(\"hidden\" in ah);S=ah.childNodes.length==1||(function(){(aa.createElement)(\"a\");var aj=aa.createDocumentFragment();return(typeof aj.cloneNode==\"undefined\"||typeof aj.createDocumentFragment==\"undefined\"||typeof aj.createElement==\"undefined\")}())}catch(ai){ae=true;S=true}}());function T(ah,aj){var ak=ah.createElement(\"p\"),ai=ah.getElementsByTagName(\"head\")[0]||ah.documentElement;ak.innerHTML=\"x<style>\"+aj+\"</style>\";return ai.insertBefore(ak.lastChild,ai.firstChild)}function Z(){var ah=X.elements;return typeof ah==\"string\"?ah.split(\" \"):ah}function ad(ah){var ai=ac[ah[W]];if(!ai){ai={};O++;ah[W]=O;ac[O]=ai}return ai}function ab(ak,ah,aj){if(!ah){ah=aa}if(S){return ah.createElement(ak)}if(!aj){aj=ad(ah)}var ai;if(aj.cache[ak]){ai=aj.cache[ak].cloneNode()}else{if(Q.test(ak)){ai=(aj.cache[ak]=aj.createElem(ak)).cloneNode()}else{ai=aj.createElem(ak)}}return ai.canHaveChildren&&!V.test(ak)&&!ai.tagUrn?aj.frag.appendChild(ai):ai}function af(aj,al){if(!aj){aj=aa}if(S){return aj.createDocumentFragment()}al=al||ad(aj);var am=al.frag.cloneNode(),ak=0,ai=Z(),ah=ai.length;for(;ak<ah;ak++){am.createElement(ai[ak])}return am}function ag(ah,ai){if(!ai.cache){ai.cache={};ai.createElem=ah.createElement;ai.createFrag=ah.createDocumentFragment;ai.frag=ai.createFrag()}ah.createElement=function(aj){if(!X.shivMethods){return ai.createElem(aj)}return ab(aj,ah,ai)};ah.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+Z().join().replace(/[\\w\\-]+/g,function(aj){ai.createElem(aj);ai.frag.createElement(aj);return'c(\"'+aj+'\")'})+\");return n}\")(X,ai.frag)}function P(ah){if(!ah){ah=aa}var ai=ad(ah);if(X.shivCSS&&!ae&&!ai.hasCSS){ai.hasCSS=!!T(ah,\"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}\")}if(!S){ag(ah,ai)}return ah}var X={elements:R.elements||\"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video\",version:U,shivCSS:(R.shivCSS!==false),supportsUnknownElements:S,shivMethods:(R.shivMethods!==false),type:\"default\",shivDocument:P,createElement:ab,createDocumentFragment:af};Y.html5=X;P(aa)}(this,c));x._version=K;x._prefixes=j;x._domPrefixes=L;x._cssomPrefixes=G;x.mq=H;x.hasEvent=o;x.testProp=function(O){return A([O])};x.testAllProps=m;x.testStyles=n;x.prefixed=function(Q,P,O){if(!P){return m(Q,\"pfx\")}else{return m(Q,P,O)}};N.className=N.className.replace(/(^|\\s)no-js(\\s|$)/,\"$1$2\")+(z?\" js \"+e.join(\" \"):\"\");return x})(this,this.document);\n/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n;if(\"undefined\"==typeof jQuery){throw new Error(\"Bootstrap's JavaScript requires jQuery\")}+function(d){function c(){var f=document.createElement(\"bootstrap\"),e={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"oTransitionEnd otransitionend\",transition:\"transitionend\"};for(var g in e){if(void 0!==f.style[g]){return{end:e[g]}}}return !1}d.fn.emulateTransitionEnd=function(a){var h=!1,g=this;d(this).one(d.support.transition.end,function(){h=!0});var f=function(){h||d(g).trigger(d.support.transition.end)};return setTimeout(f,a),this},d(function(){d.support.transition=c()})}(jQuery),+function(f){var e='[data-dismiss=\"alert\"]',h=function(a){f(a).on(\"click\",e,this.close)};h.prototype.close=function(a){function l(){i.trigger(\"closed.bs.alert\").remove()}var k=f(this),j=k.attr(\"data-target\");j||(j=k.attr(\"href\"),j=j&&j.replace(/.*(?=#[^\\s]*$)/,\"\"));var i=f(j);a&&a.preventDefault(),i.length||(i=k.hasClass(\"alert\")?k:k.parent()),i.trigger(a=f.Event(\"close.bs.alert\")),a.isDefaultPrevented()||(i.removeClass(\"in\"),f.support.transition&&i.hasClass(\"fade\")?i.one(f.support.transition.end,l).emulateTransitionEnd(150):l())};var g=f.fn.alert;f.fn.alert=function(a){return this.each(function(){var c=f(this),b=c.data(\"bs.alert\");b||c.data(\"bs.alert\",b=new h(this)),\"string\"==typeof a&&b[a].call(c)})},f.fn.alert.Constructor=h,f.fn.alert.noConflict=function(){return f.fn.alert=g,this},f(document).on(\"click.bs.alert.data-api\",e,h.prototype.close)}(jQuery),+function(e){var d=function(b,a){this.$element=e(b),this.options=e.extend({},d.DEFAULTS,a),this.isLoading=!1};d.DEFAULTS={loadingText:\"loading...\"},d.prototype.setState=function(a){var j=\"disabled\",i=this.$element,h=i.is(\"input\")?\"val\":\"html\",g=i.data();a+=\"Text\",g.resetText||i.data(\"resetText\",i[h]()),i[h](g[a]||this.options[a]),setTimeout(e.proxy(function(){\"loadingText\"==a?(this.isLoading=!0,i.addClass(j).attr(j,j)):this.isLoading&&(this.isLoading=!1,i.removeClass(j).removeAttr(j))},this),0)},d.prototype.toggle=function(){var h=!0,g=this.$element.closest('[data-toggle=\"buttons\"]');if(g.length){var i=this.$element.find(\"input\");\"radio\"==i.prop(\"type\")&&(i.prop(\"checked\")&&this.$element.hasClass(\"active\")?h=!1:g.find(\".active\").removeClass(\"active\")),h&&i.prop(\"checked\",!this.$element.hasClass(\"active\")).trigger(\"change\")}h&&this.$element.toggleClass(\"active\")};var f=e.fn.button;e.fn.button=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.button\"),b=\"object\"==typeof a&&a;c||g.data(\"bs.button\",c=new d(this,b)),\"toggle\"==a?c.toggle():a&&c.setState(a)})},e.fn.button.Constructor=d,e.fn.button.noConflict=function(){return e.fn.button=f,this},e(document).on(\"click.bs.button.data-api\",\"[data-toggle^=button]\",function(a){var g=e(a.target);g.hasClass(\"btn\")||(g=g.closest(\".btn\")),g.button(\"toggle\"),a.preventDefault()})}(jQuery),+function(e){var d=function(a,g){this.$element=e(a),this.$indicators=this.$element.find(\".carousel-indicators\"),this.options=g,this.paused=this.sliding=this.interval=this.$active=this.$items=null,\"hover\"==this.options.pause&&this.$element.on(\"mouseenter\",e.proxy(this.pause,this)).on(\"mouseleave\",e.proxy(this.cycle,this))};d.DEFAULTS={interval:5000,pause:\"hover\",wrap:!0},d.prototype.cycle=function(a){return a||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},d.prototype.getActiveIndex=function(){return this.$active=this.$element.find(\".item.active\"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},d.prototype.to=function(a){var h=this,g=this.getActiveIndex();return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one(\"slid.bs.carousel\",function(){h.to(a)}):g==a?this.pause().cycle():this.slide(a>g?\"next\":\"prev\",e(this.$items[a]))},d.prototype.pause=function(a){return a||(this.paused=!0),this.$element.find(\".next, .prev\").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},d.prototype.next=function(){return this.sliding?void 0:this.slide(\"next\")},d.prototype.prev=function(){return this.sliding?void 0:this.slide(\"prev\")},d.prototype.slide=function(s,r){var p=this.$element.find(\".item.active\"),o=r||p[s](),n=this.interval,m=\"next\"==s?\"left\":\"right\",l=\"next\"==s?\"first\":\"last\",k=this;if(!o.length){if(!this.options.wrap){return}o=this.$element.find(\".item\")[l]()}if(o.hasClass(\"active\")){return this.sliding=!1}var a=e.Event(\"slide.bs.carousel\",{relatedTarget:o[0],direction:m});return this.$element.trigger(a),a.isDefaultPrevented()?void 0:(this.sliding=!0,n&&this.pause(),this.$indicators.length&&(this.$indicators.find(\".active\").removeClass(\"active\"),this.$element.one(\"slid.bs.carousel\",function(){var c=e(k.$indicators.children()[k.getActiveIndex()]);c&&c.addClass(\"active\")})),e.support.transition&&this.$element.hasClass(\"slide\")?(o.addClass(s),o[0].offsetWidth,p.addClass(m),o.addClass(m),p.one(e.support.transition.end,function(){o.removeClass([s,m].join(\" \")).addClass(\"active\"),p.removeClass([\"active\",m].join(\" \")),k.sliding=!1,setTimeout(function(){k.$element.trigger(\"slid.bs.carousel\")},0)}).emulateTransitionEnd(1000*p.css(\"transition-duration\").slice(0,-1))):(p.removeClass(\"active\"),o.addClass(\"active\"),this.sliding=!1,this.$element.trigger(\"slid.bs.carousel\")),n&&this.cycle(),this)};var f=e.fn.carousel;e.fn.carousel=function(a){return this.each(function(){var i=e(this),h=i.data(\"bs.carousel\"),c=e.extend({},d.DEFAULTS,i.data(),\"object\"==typeof a&&a),b=\"string\"==typeof a?a:c.slide;h||i.data(\"bs.carousel\",h=new d(this,c)),\"number\"==typeof a?h.to(a):b?h[b]():c.interval&&h.pause().cycle()})},e.fn.carousel.Constructor=d,e.fn.carousel.noConflict=function(){return e.fn.carousel=f,this},e(document).on(\"click.bs.carousel.data-api\",\"[data-slide], [data-slide-to]\",function(a){var l,k=e(this),j=e(k.attr(\"data-target\")||(l=k.attr(\"href\"))&&l.replace(/.*(?=#[^\\s]+$)/,\"\")),i=e.extend({},j.data(),k.data()),h=k.attr(\"data-slide-to\");h&&(i.interval=!1),j.carousel(i),(h=k.attr(\"data-slide-to\"))&&j.data(\"bs.carousel\").to(h),a.preventDefault()}),e(window).on(\"load\",function(){e('[data-ride=\"carousel\"]').each(function(){var a=e(this);a.carousel(a.data())})})}(jQuery),+function(e){var d=function(b,a){this.$element=e(b),this.options=e.extend({},d.DEFAULTS,a),this.transitioning=null,this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var b=this.$element.hasClass(\"width\");return b?\"width\":\"height\"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(\"in\")){var a=e.Event(\"show.bs.collapse\");if(this.$element.trigger(a),!a.isDefaultPrevented()){var l=this.$parent&&this.$parent.find(\"> .panel > .in\");if(l&&l.length){var k=l.data(\"bs.collapse\");if(k&&k.transitioning){return}l.collapse(\"hide\"),k||l.data(\"bs.collapse\",null)}var j=this.dimension();this.$element.removeClass(\"collapse\").addClass(\"collapsing\")[j](0),this.transitioning=1;var i=function(){this.$element.removeClass(\"collapsing\").addClass(\"collapse in\")[j](\"auto\"),this.transitioning=0,this.$element.trigger(\"shown.bs.collapse\")};if(!e.support.transition){return i.call(this)}var h=e.camelCase([\"scroll\",j].join(\"-\"));this.$element.one(e.support.transition.end,e.proxy(i,this)).emulateTransitionEnd(350)[j](this.$element[0][h])}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(\"in\")){var a=e.Event(\"hide.bs.collapse\");if(this.$element.trigger(a),!a.isDefaultPrevented()){var h=this.dimension();this.$element[h](this.$element[h]())[0].offsetHeight,this.$element.addClass(\"collapsing\").removeClass(\"collapse\").removeClass(\"in\"),this.transitioning=1;var g=function(){this.transitioning=0,this.$element.trigger(\"hidden.bs.collapse\").removeClass(\"collapsing\").addClass(\"collapse\")};return e.support.transition?void this.$element[h](0).one(e.support.transition.end,e.proxy(g,this)).emulateTransitionEnd(350):g.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass(\"in\")?\"hide\":\"show\"]()};var f=e.fn.collapse;e.fn.collapse=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.collapse\"),b=e.extend({},d.DEFAULTS,g.data(),\"object\"==typeof a&&a);!c&&b.toggle&&\"show\"==a&&(a=!a),c||g.data(\"bs.collapse\",c=new d(this,b)),\"string\"==typeof a&&c[a]()})},e.fn.collapse.Constructor=d,e.fn.collapse.noConflict=function(){return e.fn.collapse=f,this},e(document).on(\"click.bs.collapse.data-api\",\"[data-toggle=collapse]\",function(s){var r,p=e(this),o=p.attr(\"data-target\")||s.preventDefault()||(r=p.attr(\"href\"))&&r.replace(/.*(?=#[^\\s]+$)/,\"\"),n=e(o),m=n.data(\"bs.collapse\"),l=m?\"toggle\":p.data(),k=p.attr(\"data-parent\"),a=k&&e(k);m&&m.transitioning||(a&&a.find('[data-toggle=collapse][data-parent=\"'+k+'\"]').not(p).addClass(\"collapsed\"),p[n.hasClass(\"in\")?\"addClass\":\"removeClass\"](\"collapsed\")),n.collapse(l)})}(jQuery),+function(i){function h(a){i(m).remove(),i(l).each(function(){var c=n(i(this)),b={relatedTarget:this};c.hasClass(\"open\")&&(c.trigger(a=i.Event(\"hide.bs.dropdown\",b)),a.isDefaultPrevented()||c.removeClass(\"open\").trigger(\"hidden.bs.dropdown\",b))})}function n(a){var f=a.attr(\"data-target\");f||(f=a.attr(\"href\"),f=f&&/#[A-Za-z]/.test(f)&&f.replace(/.*(?=#[^\\s]*$)/,\"\"));var e=f&&i(f);return e&&e.length?e:a.parent()}var m=\".dropdown-backdrop\",l=\"[data-toggle=dropdown]\",k=function(a){i(a).on(\"click.bs.dropdown\",this.toggle)};k.prototype.toggle=function(p){var o=i(this);if(!o.is(\".disabled, :disabled\")){var c=n(o),b=c.hasClass(\"open\");if(h(),!b){\"ontouchstart\" in document.documentElement&&!c.closest(\".navbar-nav\").length&&i('<div class=\"dropdown-backdrop\"/>').insertAfter(i(this)).on(\"click\",h);var a={relatedTarget:this};if(c.trigger(p=i.Event(\"show.bs.dropdown\",a)),p.isDefaultPrevented()){return}c.toggleClass(\"open\").trigger(\"shown.bs.dropdown\",a),o.focus()}return !1}},k.prototype.keydown=function(a){if(/(38|40|27)/.test(a.keyCode)){var s=i(this);if(a.preventDefault(),a.stopPropagation(),!s.is(\".disabled, :disabled\")){var r=n(s),p=r.hasClass(\"open\");if(!p||p&&27==a.keyCode){return 27==a.which&&r.find(l).focus(),s.click()}var o=\" li:not(.divider):visible a\",e=r.find(\"[role=menu]\"+o+\", [role=listbox]\"+o);if(e.length){var c=e.index(e.filter(\":focus\"));38==a.keyCode&&c>0&&c--,40==a.keyCode&&c<e.length-1&&c++,~c||(c=0),e.eq(c).focus()}}}};var j=i.fn.dropdown;i.fn.dropdown=function(a){return this.each(function(){var e=i(this),b=e.data(\"bs.dropdown\");b||e.data(\"bs.dropdown\",b=new k(this)),\"string\"==typeof a&&b[a].call(e)})},i.fn.dropdown.Constructor=k,i.fn.dropdown.noConflict=function(){return i.fn.dropdown=j,this},i(document).on(\"click.bs.dropdown.data-api\",h).on(\"click.bs.dropdown.data-api\",\".dropdown form\",function(b){b.stopPropagation()}).on(\"click.bs.dropdown.data-api\",l,k.prototype.toggle).on(\"keydown.bs.dropdown.data-api\",l+\", [role=menu], [role=listbox]\",k.prototype.keydown)}(jQuery),+function(e){var d=function(a,g){this.options=g,this.$element=e(a),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(\".modal-content\").load(this.options.remote,e.proxy(function(){this.$element.trigger(\"loaded.bs.modal\")},this))};d.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},d.prototype.toggle=function(b){return this[this.isShown?\"hide\":\"show\"](b)},d.prototype.show=function(a){var h=this,g=e.Event(\"show.bs.modal\",{relatedTarget:a});this.$element.trigger(g),this.isShown||g.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on(\"click.dismiss.bs.modal\",'[data-dismiss=\"modal\"]',e.proxy(this.hide,this)),this.backdrop(function(){var c=e.support.transition&&h.$element.hasClass(\"fade\");h.$element.parent().length||h.$element.appendTo(document.body),h.$element.show().scrollTop(0),c&&h.$element[0].offsetWidth,h.$element.addClass(\"in\").attr(\"aria-hidden\",!1),h.enforceFocus();var b=e.Event(\"shown.bs.modal\",{relatedTarget:a});c?h.$element.find(\".modal-dialog\").one(e.support.transition.end,function(){h.$element.focus().trigger(b)}).emulateTransitionEnd(300):h.$element.focus().trigger(b)}))},d.prototype.hide=function(a){a&&a.preventDefault(),a=e.Event(\"hide.bs.modal\"),this.$element.trigger(a),this.isShown&&!a.isDefaultPrevented()&&(this.isShown=!1,this.escape(),e(document).off(\"focusin.bs.modal\"),this.$element.removeClass(\"in\").attr(\"aria-hidden\",!0).off(\"click.dismiss.bs.modal\"),e.support.transition&&this.$element.hasClass(\"fade\")?this.$element.one(e.support.transition.end,e.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},d.prototype.enforceFocus=function(){e(document).off(\"focusin.bs.modal\").on(\"focusin.bs.modal\",e.proxy(function(b){this.$element[0]===b.target||this.$element.has(b.target).length||this.$element.focus()},this))},d.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(\"keyup.dismiss.bs.modal\",e.proxy(function(b){27==b.which&&this.hide()},this)):this.isShown||this.$element.off(\"keyup.dismiss.bs.modal\")},d.prototype.hideModal=function(){var b=this;this.$element.hide(),this.backdrop(function(){b.removeBackdrop(),b.$element.trigger(\"hidden.bs.modal\")})},d.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},d.prototype.backdrop=function(a){var h=this.$element.hasClass(\"fade\")?\"fade\":\"\";if(this.isShown&&this.options.backdrop){var g=e.support.transition&&h;if(this.$backdrop=e('<div class=\"modal-backdrop '+h+'\" />').appendTo(document.body),this.$element.on(\"click.dismiss.bs.modal\",e.proxy(function(b){b.target===b.currentTarget&&(\"static\"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),g&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass(\"in\"),!a){return}g?this.$backdrop.one(e.support.transition.end,a).emulateTransitionEnd(150):a()}else{!this.isShown&&this.$backdrop?(this.$backdrop.removeClass(\"in\"),e.support.transition&&this.$element.hasClass(\"fade\")?this.$backdrop.one(e.support.transition.end,a).emulateTransitionEnd(150):a()):a&&a()}};var f=e.fn.modal;e.fn.modal=function(b,a){return this.each(function(){var i=e(this),h=i.data(\"bs.modal\"),c=e.extend({},d.DEFAULTS,i.data(),\"object\"==typeof b&&b);h||i.data(\"bs.modal\",h=new d(this,c)),\"string\"==typeof b?h[b](a):c.show&&h.show(a)})},e.fn.modal.Constructor=d,e.fn.modal.noConflict=function(){return e.fn.modal=f,this},e(document).on(\"click.bs.modal.data-api\",'[data-toggle=\"modal\"]',function(a){var j=e(this),i=j.attr(\"href\"),h=e(j.attr(\"data-target\")||i&&i.replace(/.*(?=#[^\\s]+$)/,\"\")),g=h.data(\"bs.modal\")?\"toggle\":e.extend({remote:!/#/.test(i)&&i},h.data(),j.data());j.is(\"a\")&&a.preventDefault(),h.modal(g,this).one(\"hide\",function(){j.is(\":visible\")&&j.focus()})}),e(document).on(\"show.bs.modal\",\".modal\",function(){e(document.body).addClass(\"modal-open\")}).on(\"hidden.bs.modal\",\".modal\",function(){e(document.body).removeClass(\"modal-open\")})}(jQuery),+function(e){var d=function(g,c){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init(\"tooltip\",g,c)};d.DEFAULTS={animation:!0,placement:\"top\",selector:!1,template:'<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,container:!1},d.prototype.init=function(a,p,o){this.enabled=!0,this.type=a,this.$element=e(p),this.options=this.getOptions(o);for(var n=this.options.trigger.split(\" \"),m=n.length;m--;){var l=n[m];if(\"click\"==l){this.$element.on(\"click.\"+this.type,this.options.selector,e.proxy(this.toggle,this))}else{if(\"manual\"!=l){var k=\"hover\"==l?\"mouseenter\":\"focusin\",j=\"hover\"==l?\"mouseleave\":\"focusout\";this.$element.on(k+\".\"+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(j+\".\"+this.type,this.options.selector,e.proxy(this.leave,this))}}}this.options.selector?this._options=e.extend({},this.options,{trigger:\"manual\",selector:\"\"}):this.fixTitle()},d.prototype.getDefaults=function(){return d.DEFAULTS},d.prototype.getOptions=function(a){return a=e.extend({},this.getDefaults(),this.$element.data(),a),a.delay&&\"number\"==typeof a.delay&&(a.delay={show:a.delay,hide:a.delay}),a},d.prototype.getDelegateOptions=function(){var a={},g=this.getDefaults();return this._options&&e.each(this._options,function(b,c){g[b]!=c&&(a[b]=c)}),a},d.prototype.enter=function(a){var g=a instanceof this.constructor?a:e(a.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type);return clearTimeout(g.timeout),g.hoverState=\"in\",g.options.delay&&g.options.delay.show?void (g.timeout=setTimeout(function(){\"in\"==g.hoverState&&g.show()},g.options.delay.show)):g.show()},d.prototype.leave=function(a){var g=a instanceof this.constructor?a:e(a.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type);return clearTimeout(g.timeout),g.hoverState=\"out\",g.options.delay&&g.options.delay.hide?void (g.timeout=setTimeout(function(){\"out\"==g.hoverState&&g.hide()},g.options.delay.hide)):g.hide()},d.prototype.show=function(){var H=e.Event(\"show.bs.\"+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(H),H.isDefaultPrevented()){return}var G=this,F=this.tip();this.setContent(),this.options.animation&&F.addClass(\"fade\");var E=\"function\"==typeof this.options.placement?this.options.placement.call(this,F[0],this.$element[0]):this.options.placement,D=/\\s?auto?\\s?/i,C=D.test(E);C&&(E=E.replace(D,\"\")||\"top\"),F.detach().css({top:0,left:0,display:\"block\"}).addClass(E),this.options.container?F.appendTo(this.options.container):F.insertAfter(this.$element);var B=this.getPosition(),A=F[0].offsetWidth,z=F[0].offsetHeight;if(C){var y=this.$element.parent(),x=E,w=document.documentElement.scrollTop||document.body.scrollTop,v=\"body\"==this.options.container?window.innerWidth:y.outerWidth(),u=\"body\"==this.options.container?window.innerHeight:y.outerHeight(),t=\"body\"==this.options.container?0:y.offset().left;E=\"bottom\"==E&&B.top+B.height+z-w>u?\"top\":\"top\"==E&&B.top-w-z<0?\"bottom\":\"right\"==E&&B.right+A>v?\"left\":\"left\"==E&&B.left-A<t?\"right\":E,F.removeClass(x).addClass(E)}var s=this.getCalculatedOffset(E,B,A,z);this.applyPlacement(s,E),this.hoverState=null;var a=function(){G.$element.trigger(\"shown.bs.\"+G.type)};e.support.transition&&this.$tip.hasClass(\"fade\")?F.one(e.support.transition.end,a).emulateTransitionEnd(150):a()}},d.prototype.applyPlacement=function(w,v){var u,t=this.tip(),s=t[0].offsetWidth,r=t[0].offsetHeight,p=parseInt(t.css(\"margin-top\"),10),o=parseInt(t.css(\"margin-left\"),10);isNaN(p)&&(p=0),isNaN(o)&&(o=0),w.top=w.top+p,w.left=w.left+o,e.offset.setOffset(t[0],e.extend({using:function(b){t.css({top:Math.round(b.top),left:Math.round(b.left)})}},w),0),t.addClass(\"in\");var n=t[0].offsetWidth,m=t[0].offsetHeight;if(\"top\"==v&&m!=r&&(u=!0,w.top=w.top+r-m),/bottom|top/.test(v)){var a=0;w.left<0&&(a=-2*w.left,w.left=0,t.offset(w),n=t[0].offsetWidth,m=t[0].offsetHeight),this.replaceArrow(a-s+n,n,\"left\")}else{this.replaceArrow(m-r,m,\"top\")}u&&t.offset(w)},d.prototype.replaceArrow=function(h,g,i){this.arrow().css(i,h?50*(1-h/g)+\"%\":\"\")},d.prototype.setContent=function(){var g=this.tip(),c=this.getTitle();g.find(\".tooltip-inner\")[this.options.html?\"html\":\"text\"](c),g.removeClass(\"fade in top bottom left right\")},d.prototype.hide=function(){function a(){\"in\"!=i.hoverState&&h.detach(),i.$element.trigger(\"hidden.bs.\"+i.type)}var i=this,h=this.tip(),g=e.Event(\"hide.bs.\"+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(h.removeClass(\"in\"),e.support.transition&&this.$tip.hasClass(\"fade\")?h.one(e.support.transition.end,a).emulateTransitionEnd(150):a(),this.hoverState=null,this)},d.prototype.fixTitle=function(){var b=this.$element;(b.attr(\"title\")||\"string\"!=typeof b.attr(\"data-original-title\"))&&b.attr(\"data-original-title\",b.attr(\"title\")||\"\").attr(\"title\",\"\")},d.prototype.hasContent=function(){return this.getTitle()},d.prototype.getPosition=function(){var a=this.$element[0];return e.extend({},\"function\"==typeof a.getBoundingClientRect?a.getBoundingClientRect():{width:a.offsetWidth,height:a.offsetHeight},this.$element.offset())},d.prototype.getCalculatedOffset=function(h,g,j,i){return\"bottom\"==h?{top:g.top+g.height,left:g.left+g.width/2-j/2}:\"top\"==h?{top:g.top-i,left:g.left+g.width/2-j/2}:\"left\"==h?{top:g.top+g.height/2-i/2,left:g.left-j}:{top:g.top+g.height/2-i/2,left:g.left+g.width}},d.prototype.getTitle=function(){var h,g=this.$element,i=this.options;return h=g.attr(\"data-original-title\")||(\"function\"==typeof i.title?i.title.call(g[0]):i.title)},d.prototype.tip=function(){return this.$tip=this.$tip||e(this.options.template)},d.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".tooltip-arrow\")},d.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},d.prototype.enable=function(){this.enabled=!0},d.prototype.disable=function(){this.enabled=!1},d.prototype.toggleEnabled=function(){this.enabled=!this.enabled},d.prototype.toggle=function(a){var g=a?e(a.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type):this;g.tip().hasClass(\"in\")?g.leave(g):g.enter(g)},d.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off(\".\"+this.type).removeData(\"bs.\"+this.type)};var f=e.fn.tooltip;e.fn.tooltip=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.tooltip\"),b=\"object\"==typeof a&&a;(c||\"destroy\"!=a)&&(c||g.data(\"bs.tooltip\",c=new d(this,b)),\"string\"==typeof a&&c[a]())})},e.fn.tooltip.Constructor=d,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=f,this}}(jQuery),+function(e){var d=function(g,c){this.init(\"popover\",g,c)};if(!e.fn.tooltip){throw new Error(\"Popover requires tooltip.js\")}d.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'}),d.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),d.prototype.constructor=d,d.prototype.getDefaults=function(){return d.DEFAULTS},d.prototype.setContent=function(){var h=this.tip(),g=this.getTitle(),i=this.getContent();h.find(\".popover-title\")[this.options.html?\"html\":\"text\"](g),h.find(\".popover-content\")[this.options.html?\"string\"==typeof i?\"html\":\"append\":\"text\"](i),h.removeClass(\"fade top bottom left right in\"),h.find(\".popover-title\").html()||h.find(\".popover-title\").hide()},d.prototype.hasContent=function(){return this.getTitle()||this.getContent()},d.prototype.getContent=function(){var g=this.$element,c=this.options;return g.attr(\"data-content\")||(\"function\"==typeof c.content?c.content.call(g[0]):c.content)},d.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".arrow\")},d.prototype.tip=function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip};var f=e.fn.popover;e.fn.popover=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.popover\"),b=\"object\"==typeof a&&a;(c||\"destroy\"!=a)&&(c||g.data(\"bs.popover\",c=new d(this,b)),\"string\"==typeof a&&c[a]())})},e.fn.popover.Constructor=d,e.fn.popover.noConflict=function(){return e.fn.popover=f,this}}(jQuery),+function(e){function d(h,g){var b,a=e.proxy(this.process,this);this.$element=e(e(h).is(\"body\")?window:h),this.$body=e(\"body\"),this.$scrollElement=this.$element.on(\"scroll.bs.scroll-spy.data-api\",a),this.options=e.extend({},d.DEFAULTS,g),this.selector=(this.options.target||(b=e(h).attr(\"href\"))&&b.replace(/.*(?=#[^\\s]+$)/,\"\")||\"\")+\" .nav li > a\",this.offsets=e([]),this.targets=e([]),this.activeTarget=null,this.refresh(),this.process()}d.DEFAULTS={offset:10},d.prototype.refresh=function(){var a=this.$element[0]==window?\"offset\":\"position\";this.offsets=e([]),this.targets=e([]);var g=this;this.$body.find(this.selector).map(function(){var h=e(this),c=h.data(\"target\")||h.attr(\"href\"),b=/^#./.test(c)&&e(c);return b&&b.length&&b.is(\":visible\")&&[[b[a]().top+(!e.isWindow(g.$scrollElement.get(0))&&g.$scrollElement.scrollTop()),c]]||null}).sort(function(h,c){return h[0]-c[0]}).each(function(){g.offsets.push(this[0]),g.targets.push(this[1])})},d.prototype.process=function(){var i,h=this.$scrollElement.scrollTop()+this.options.offset,n=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,m=n-this.$scrollElement.height(),l=this.offsets,k=this.targets,j=this.activeTarget;if(h>=m){return j!=(i=k.last()[0])&&this.activate(i)}if(j&&h<=l[0]){return j!=(i=k[0])&&this.activate(i)}for(i=l.length;i--;){j!=k[i]&&h>=l[i]&&(!l[i+1]||h<=l[i+1])&&this.activate(k[i])}},d.prototype.activate=function(a){this.activeTarget=a,e(this.selector).parentsUntil(this.options.target,\".active\").removeClass(\"active\");var h=this.selector+'[data-target=\"'+a+'\"],'+this.selector+'[href=\"'+a+'\"]',g=e(h).parents(\"li\").addClass(\"active\");g.parent(\".dropdown-menu\").length&&(g=g.closest(\"li.dropdown\").addClass(\"active\")),g.trigger(\"activate.bs.scrollspy\")};var f=e.fn.scrollspy;e.fn.scrollspy=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.scrollspy\"),b=\"object\"==typeof a&&a;c||g.data(\"bs.scrollspy\",c=new d(this,b)),\"string\"==typeof a&&c[a]()})},e.fn.scrollspy.Constructor=d,e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=f,this},e(window).on(\"load\",function(){e('[data-spy=\"scroll\"]').each(function(){var a=e(this);a.scrollspy(a.data())})})}(jQuery),+function(e){var d=function(a){this.element=e(a)};d.prototype.show=function(){var a=this.element,l=a.closest(\"ul:not(.dropdown-menu)\"),k=a.data(\"target\");if(k||(k=a.attr(\"href\"),k=k&&k.replace(/.*(?=#[^\\s]*$)/,\"\")),!a.parent(\"li\").hasClass(\"active\")){var j=l.find(\".active:last a\")[0],i=e.Event(\"show.bs.tab\",{relatedTarget:j});if(a.trigger(i),!i.isDefaultPrevented()){var h=e(k);this.activate(a.parent(\"li\"),l),this.activate(h,h.parent(),function(){a.trigger({type:\"shown.bs.tab\",relatedTarget:j})})}}},d.prototype.activate=function(a,l,k){function j(){i.removeClass(\"active\").find(\"> .dropdown-menu > .active\").removeClass(\"active\"),a.addClass(\"active\"),h?(a[0].offsetWidth,a.addClass(\"in\")):a.removeClass(\"fade\"),a.parent(\".dropdown-menu\")&&a.closest(\"li.dropdown\").addClass(\"active\"),k&&k()}var i=l.find(\"> .active\"),h=k&&e.support.transition&&i.hasClass(\"fade\");h?i.one(e.support.transition.end,j).emulateTransitionEnd(150):j(),i.removeClass(\"in\")};var f=e.fn.tab;e.fn.tab=function(a){return this.each(function(){var c=e(this),b=c.data(\"bs.tab\");b||c.data(\"bs.tab\",b=new d(this)),\"string\"==typeof a&&b[a]()})},e.fn.tab.Constructor=d,e.fn.tab.noConflict=function(){return e.fn.tab=f,this},e(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"], [data-toggle=\"pill\"]',function(a){a.preventDefault(),e(this).tab(\"show\")})}(jQuery),+function(e){var d=function(b,a){this.options=e.extend({},d.DEFAULTS,a),this.$window=e(window).on(\"scroll.bs.affix.data-api\",e.proxy(this.checkPosition,this)).on(\"click.bs.affix.data-api\",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};d.RESET=\"affix affix-top affix-bottom\",d.DEFAULTS={offset:0},d.prototype.getPinnedOffset=function(){if(this.pinnedOffset){return this.pinnedOffset}this.$element.removeClass(d.RESET).addClass(\"affix\");var b=this.$window.scrollTop(),g=this.$element.offset();return this.pinnedOffset=g.top-b},d.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},d.prototype.checkPosition=function(){if(this.$element.is(\":visible\")){var s=e(document).height(),r=this.$window.scrollTop(),p=this.$element.offset(),o=this.options.offset,n=o.top,m=o.bottom;\"top\"==this.affixed&&(p.top+=r),\"object\"!=typeof o&&(m=n=o),\"function\"==typeof n&&(n=o.top(this.$element)),\"function\"==typeof m&&(m=o.bottom(this.$element));var l=null!=this.unpin&&r+this.unpin<=p.top?!1:null!=m&&p.top+this.$element.height()>=s-m?\"bottom\":null!=n&&n>=r?\"top\":!1;if(this.affixed!==l){this.unpin&&this.$element.css(\"top\",\"\");var b=\"affix\"+(l?\"-\"+l:\"\"),a=e.Event(b+\".bs.affix\");this.$element.trigger(a),a.isDefaultPrevented()||(this.affixed=l,this.unpin=\"bottom\"==l?this.getPinnedOffset():null,this.$element.removeClass(d.RESET).addClass(b).trigger(e.Event(b.replace(\"affix\",\"affixed\"))),\"bottom\"==l&&this.$element.offset({top:s-m-this.$element.height()}))}}};var f=e.fn.affix;e.fn.affix=function(a){return this.each(function(){var g=e(this),c=g.data(\"bs.affix\"),b=\"object\"==typeof a&&a;c||g.data(\"bs.affix\",c=new d(this,b)),\"string\"==typeof a&&c[a]()})},e.fn.affix.Constructor=d,e.fn.affix.noConflict=function(){return e.fn.affix=f,this},e(window).on(\"load\",function(){e('[data-spy=\"affix\"]').each(function(){var a=e(this),g=a.data();g.offset=g.offset||{},g.offsetBottom&&(g.offset.bottom=g.offsetBottom),g.offsetTop&&(g.offset.top=g.offsetTop),a.affix(g)})})}(jQuery);$(document).ready(function(){q=$.jStorage.get(\"search_query\");if($(\"#search\").length){if(q!=\"\"){$(\"input#page-query\").val(q);$(\".bar-indicator\").show();search($(\"input#page-query\").val())}$(\"form#search\").submit(function(){$(\".bar-indicator\").show();search($(\"input#page-query\").val());return false})}$(\"form.navbar-search\").submit(function(){query=$(\"input#query\").val();$.jStorage.set(\"search_query\",query);var a=$(\".nav-link > a\")[0].href.replace(\"/index.html\",\"\");document.location.href=a+\"/search.html\";return false})});function search(d){var c=$(\".nav-link > a\")[0].pathname.replace(\"/index.html\",\"\");var b=c+\"/search.html?q=\"+encodeURIComponent(d);search_send_ga(\"send\",{hitType:\"pageview\",page:b,title:\"Search: \"+d});$(\".circle-indicator\").show();var a=$.getJSON(\"https://86xw1.api.searchify.com/v1/indexes/docs/search?q=\"+encodeURIComponent(d)+\"&fetch=title&snippet=text&len=500&callback=?\").done(function(e){$(\"div#results\").empty();root=$(\"#root\").val();last_char=root.substr(root.length-1);if(last_char==\"/\"){root=root.slice(0,-1)}if(e.matches==0){$(\"div#results\").append(\"<p>No results found in Documentation.</p>        <p>Suggestions:</p>        <ul>        <li>Make sure all keywords are spelled correctly.</li>        <li>Try different keywords.</li>        <li>Try more general keywords.</li>        <li>Try fewer keywords.</li>        </ul>\");$(\"#docs-tab-badge\").text(\"0\")}else{$(\"#docs-tab-badge\").text(e.matches)}$.each(e.results,function(g,f){$(\"div#results\").append('<div class=\"result\">            <a class=\"title\" href=\"'+root+f.docid+'\"><h3>'+f.title+\"</h3></a>            <p>\"+f.snippet_text+\"</p>        </div>\")})}).fail(function(){$(\"div#results\").empty();$(\"div#results\").append(\"<p>Documentation search failed :( Please try again.</p>\")}).always(function(){$(\"#indicator\").hide()});$.ajax({url:\"https://sendgrid.com/blog/feed/?q=\"+d,dataType:\"xml\"}).done(function(i){var h=$(i);var f=[];var e=10;var g=h.find(\"item\").slice(0,e);if(g.length==0){$(\"div#blog-results\").append(\"<p>No blog posts found.</p>              <p>Suggestions:</p>              <ul>              <li>Make sure all keywords are spelled correctly.</li>              <li>Try different keywords.</li>              <li>Try more general keywords.</li>              <li>Try fewer keywords.</li>              </ul>\");$(\"#blog-tab-badge\").text(\"O\")}else{$(\"#blog-tab-badge\").text(g.length)}$.each(g,function(j){if(j===e){return false}var l=$(this);var k=l.find(\"description\").text().split(\".\").slice(0,3).join(\".\")+\".\";f.push('<div class=\"result\"><a class=\"title\" href=\"'+l.find(\"link\").text()+'\"><h3>'+l.find(\"title\").text()+\"</h3></a><p>\"+k+\"</p></div>\")});$(\"#blog-results\").html(f.join(\"\"))}).fail(function(){$(\"div#blog-results\").empty();$(\"div#blog-results\").append(\"<p>Blog search failed :( Please try again.</p>\")}).always(function(){$(\"#blog-indicator\").hide()})}function search_send_ga(b,a){if(search_verify_ga()){ga(b,a)}}function search_verify_ga(){if(typeof(ga)==\"function\"){return true}return false}$(function(){$(\"input\").on(\"focus\",function(){$(this).siblings(\"label\").addClass(\"is-focused\");$(this).parent(\".input-group\").addClass(\"is-focused\");$(this).parent(\".form-group\").addClass(\"is-focused\")});$(\"input\").on(\"blur\",function(){$(this).siblings(\"label\").removeClass(\"is-focused\");$(this).parent(\".input-group\").removeClass(\"is-focused\");$(this).parent(\".form-group\").removeClass(\"is-focused\");if($(this).val()){$(this).siblings(\"label\").addClass(\"is-dirty\")}else{$(this).siblings(\"label\").removeClass(\"is-dirty\")}});$(\"input\").each(function(){if($(this).val()){$(this).siblings(\"label\").addClass(\"is-dirty\")}else{$(this).siblings(\"label\").removeClass(\"is-dirty\")}})});\n/*! JsRender v1.0.0-rc.70 (Beta - Release Candidate): http://jsviews.com/#jsrender */\n;\n/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */\n(function(factory){var global=(0,eval)(\"this\"),$=global.jQuery;if(typeof define===\"function\"&&define.amd){define(factory)}else{if(typeof exports===\"object\"){module.exports=$?factory($):function($){if($&&!$.fn){throw\"Provide jQuery or null\"}return factory($)}}else{factory(false)}}}(function($){var global=(0,eval)(\"this\"),setGlobals=$===false;$=$&&$.fn?$:global.jQuery;var versionNumber=\"v1.0.0-beta\",jsvStoreName,rTag,rTmplString,topView,$views,$isFunction,$isArray,$templates,$converters,$helpers,$tags,$sub,$viewsSettings,delimOpenChar0=\"{\",delimOpenChar1=\"{\",delimCloseChar0=\"}\",delimCloseChar1=\"}\",linkChar=\"^\",rPath=/^(!*?)(?:null|true|false|\\d[\\d.]*|([\\w$]+|\\.|~([\\w$]+)|#(view|([\\w$]+))?)([\\w$.^]*?)(?:[.[^]([\\w$]+)\\]?)?)$/g,rParams=/(\\()(?=\\s*\\()|(?:([([])\\s*)?(?:(\\^?)(!*?[#~]?[\\w$.^]+)?\\s*((\\+\\+|--)|\\+|-|&&|\\|\\||===|!==|==|!=|<=|>=|[<>%*:?\\/]|(=))\\s*|(!*?[#~]?[\\w$.^]+)([([])?)|(,\\s*)|(\\(?)\\\\?(?:(')|(\"))|(?:\\s*(([)\\]])(?=\\s*[.^]|\\s*$|[^\\(\\[])|[)\\]])([([]?))|(\\s+)/g,isRenderCall,rNewLine=/[ \\t]*(\\r\\n|\\n|\\r)/g,rUnescapeQuotes=/\\\\(['\"])/g,rEscapeQuotes=/['\"\\\\]/g,rBuildHash=/(?:\\x08|^)(onerror:)?(?:(~?)(([\\w$_\\.]+):)?([^\\x08]+))\\x08(,)?([^\\x08]+)/gi,rTestElseIf=/^if\\s/,rFirstElem=/<(\\w+)[>\\s]/,rAttrEncode=/[\\x00`><\"'&]/g,rIsHtml=/[\\x00`><\\\"'&]/,rHasHandlers=/^on[A-Z]|^convert(Back)?$/,rHtmlEncode=rAttrEncode,viewId=0,charEntities={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"\\x00\":\"&#0;\",\"'\":\"&#39;\",'\"':\"&#34;\",\"`\":\"&#96;\"},HTML=\"html\",OBJECT=\"object\",tmplAttr=\"data-jsv-tmpl\",jsvTmpl=\"jsvTmpl\",indexStr=\"For #index in nested block use #getIndex().\",$render={},jsr=global.jsrender,jsrToJq=jsr&&$&&!$.render,jsvStores={template:{compile:compileTmpl},tag:{compile:compileTag},helper:{},converter:{}};$views={jsviews:versionNumber,settings:function(settings){$extend($viewsSettings,settings);dbgMode($viewsSettings._dbgMode);if($viewsSettings.jsv){$viewsSettings.jsv()}},sub:{View:View,Err:JsViewsError,tmplFn:tmplFn,parse:parseParams,extend:$extend,extendCtx:extendCtx,syntaxErr:syntaxError,onStore:{},_ths:tagHandlersFromProps,_tg:function(){}},map:dataMap,_cnvt:convertVal,_tag:renderTag,_err:error};function getDerivedMethod(baseMethod,method){return function(){var ret,tag=this,prevBase=tag.base;tag.base=baseMethod;ret=method.apply(tag,arguments);tag.base=prevBase;return ret}}function getMethod(baseMethod,method){if($isFunction(method)){method=getDerivedMethod(!baseMethod?noop:baseMethod._d?baseMethod:getDerivedMethod(noop,baseMethod),method);method._d=1}return method}function tagHandlersFromProps(tag,tagCtx){for(var prop in tagCtx.props){if(rHasHandlers.test(prop)){tag[prop]=getMethod(tag[prop],tagCtx.props[prop])}}}function retVal(val){return val}function noop(){return\"\"}function dbgBreak(val){try{;throw\"dbg breakpoint\"}catch(e){}return this.base?this.baseApply(arguments):val}function dbgMode(debugMode){$viewsSettings._dbgMode=debugMode!==false}function JsViewsError(message){this.name=($.link?\"JsViews\":\"JsRender\")+\" Error\";this.message=message||this.name}function $extend(target,source){var name;for(name in source){target[name]=source[name]}return target}(JsViewsError.prototype=new Error()).constructor=JsViewsError;function $viewsDelimiters(openChars,closeChars,link){if(this!==0||openChars){delimOpenChar0=openChars?openChars.charAt(0):delimOpenChar0;delimOpenChar1=openChars?openChars.charAt(1):delimOpenChar1;delimCloseChar0=closeChars?closeChars.charAt(0):delimCloseChar0;delimCloseChar1=closeChars?closeChars.charAt(1):delimCloseChar1;linkChar=link||linkChar;openChars=\"\\\\\"+delimOpenChar0+\"(\\\\\"+linkChar+\")?\\\\\"+delimOpenChar1;closeChars=\"\\\\\"+delimCloseChar0+\"\\\\\"+delimCloseChar1;rTag=\"(?:(?:(\\\\w+(?=[\\\\/\\\\s\\\\\"+delimCloseChar0+\"]))|(?:(\\\\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\\\\*)))\\\\s*((?:[^\\\\\"+delimCloseChar0+\"]|\\\\\"+delimCloseChar0+\"(?!\\\\\"+delimCloseChar1+\"))*?)\";$sub.rTag=rTag+\")\";rTag=new RegExp(openChars+rTag+\"(\\\\/)?|(?:\\\\/(\\\\w+)))\"+closeChars,\"g\");rTmplString=new RegExp(\"<.*>|([^\\\\\\\\]|^)[{}]|\"+openChars+\".*\"+closeChars)}return[delimOpenChar0,delimOpenChar1,delimCloseChar0,delimCloseChar1,linkChar]}function getView(inner,type){if(!type){type=inner;inner=undefined}var views,i,l,found,view=this,root=!type||type===\"root\";if(inner){found=view.type===type?view:undefined;if(!found){views=view.views;if(view._.useKey){for(i in views){if(found=views[i].get(inner,type)){break}}}else{for(i=0,l=views.length;!found&&i<l;i++){found=views[i].get(inner,type)}}}}else{if(root){while(view.parent.parent){found=view=view.parent}}else{while(view&&!found){found=view.type===type?view:undefined;view=view.parent}}}return found}function getNestedIndex(){var view=this.get(\"item\");return view?view.index:undefined}getNestedIndex.depends=function(){return[this.get(\"item\"),\"index\"]};function getIndex(){return this.index}getIndex.depends=\"index\";function getHelper(helper){var wrapped,view=this,ctx=view.linkCtx,res=(view.ctx||{})[helper];if(res===undefined&&ctx&&ctx.ctx){res=ctx.ctx[helper]}if(res===undefined){res=$helpers[helper]}if(res){if($isFunction(res)&&!res._wrp){wrapped=function(){return res.apply((!this||this===global)?view:this,arguments)};wrapped._wrp=true;$extend(wrapped,res)}}return wrapped||res}function convertVal(converter,view,tagCtx,onError){var tag,value,boundTag=typeof tagCtx===\"number\"&&view.tmpl.bnds[tagCtx-1],linkCtx=view.linkCtx;if(onError!==undefined){tagCtx=onError={props:{},args:[onError]}}else{if(boundTag){tagCtx=boundTag(view.data,view,$views)}}value=tagCtx.args[0];if(converter||boundTag){tag=linkCtx&&linkCtx.tag;if(!tag){tag=$extend(new $sub._tg(),{_:{inline:!linkCtx,bnd:boundTag,unlinked:true},tagName:\":\",cvt:converter,flow:true,tagCtx:tagCtx});if(linkCtx){linkCtx.tag=tag;tag.linkCtx=linkCtx}tagCtx.ctx=extendCtx(tagCtx.ctx,(linkCtx?linkCtx.view:view).ctx)}tag._er=onError&&value;tagHandlersFromProps(tag,tagCtx);tagCtx.view=view;tag.ctx=tagCtx.ctx||{};tagCtx.ctx=undefined;view._.tag=tag;value=tag.cvtArgs(tag.convert||converter!==\"true\"&&converter)[0];value=boundTag&&view._.onRender?view._.onRender(value,view,boundTag):value;view._.tag=undefined}return value!=undefined?value:\"\"}function convertArgs(converter){var tag=this,tagCtx=tag.tagCtx,view=tagCtx.view,args=tagCtx.args;converter=tag.convert||converter;converter=converter&&(\"\"+converter===converter?(view.getRsc(\"converters\",converter)||error(\"Unknown converter: '\"+converter+\"'\")):converter);args=!args.length&&!tagCtx.index?[view.data]:converter?args.slice():args;if(converter){if(converter.depends){tag.depends=$sub.getDeps(tag.depends,tag,converter.depends,converter)}args[0]=converter.apply(tag,args)}return args}function getResource(resourceType,itemName){var res,store,view=this;while((res===undefined)&&view){store=view.tmpl&&view.tmpl[resourceType];res=store&&store[itemName];view=view.parent}return res||$views[resourceType][itemName]}function renderTag(tagName,parentView,tmpl,tagCtxs,isUpdate,onError){parentView=parentView||topView;var tag,tag_,tagDef,template,tags,attr,parentTag,i,l,itemRet,tagCtx,tagCtxCtx,content,callInit,mapDef,thisMap,args,props,initialTmpl,tagDataMap,ret=\"\",linkCtx=parentView.linkCtx||0,ctx=parentView.ctx,parentTmpl=tmpl||parentView.tmpl,boundTag=typeof tagCtxs===\"number\"&&parentView.tmpl.bnds[tagCtxs-1];if(tagName._is===\"tag\"){tag=tagName;tagName=tag.tagName;tagCtxs=tag.tagCtxs;template=tag.template}else{tagDef=parentView.getRsc(\"tags\",tagName)||error(\"Unknown tag: {{\"+tagName+\"}} \");template=tagDef.template}if(onError!==undefined){ret+=onError;tagCtxs=onError=[{props:{},args:[]}]}else{if(boundTag){tagCtxs=boundTag(parentView.data,parentView,$views)}}l=tagCtxs.length;for(i=0;i<l;i++){tagCtx=tagCtxs[i];if(!linkCtx||!linkCtx.tag||i&&!linkCtx.tag._.inline||tag._er){if(content=tagCtx.tmpl){content=tagCtx.content=parentTmpl.tmpls[content-1]}tagCtx.index=i;tagCtx.tmpl=template||content;tagCtx.render=renderContent;tagCtx.view=parentView;tagCtx.ctx=extendCtx(tagCtx.ctx,ctx)}if(tmpl=tagCtx.props.tmpl){tmpl=\"\"+tmpl===tmpl?parentView.getRsc(\"templates\",tmpl)||$templates(tmpl):tmpl;tagCtx.tmpl=tmpl}if(!tag){tag=new tagDef._ctr();callInit=!!tag.init;tag.parent=parentTag=ctx&&ctx.tag;tag.tagCtxs=tagCtxs;tagDataMap=tag.dataMap;if(linkCtx){tag._.inline=false;linkCtx.tag=tag;tag.linkCtx=linkCtx}if(tag._.bnd=boundTag||linkCtx.fn){tag._.arrVws={}}else{if(tag.dataBoundOnly){error(\"{^{\"+tagName+\"}} tag must be data-bound\")}}}tagCtxs=tag.tagCtxs;tagDataMap=tag.dataMap;tagCtx.tag=tag;if(tagDataMap&&tagCtxs){tagCtx.map=tagCtxs[i].map}if(!tag.flow){tagCtxCtx=tagCtx.ctx=tagCtx.ctx||{};tags=tag.parents=tagCtxCtx.parentTags=ctx&&extendCtx(tagCtxCtx.parentTags,ctx.parentTags)||{};if(parentTag){tags[parentTag.tagName]=parentTag}tags[tag.tagName]=tagCtxCtx.tag=tag}}if(boundTag||linkCtx){parentView._.tag=tag}if(!(tag._er=onError)){tagHandlersFromProps(tag,tagCtxs[0]);tag.rendering={};for(i=0;i<l;i++){tagCtx=tag.tagCtx=tagCtxs[i];props=tagCtx.props;args=tag.cvtArgs();if(mapDef=props.dataMap||tagDataMap){if(args.length||props.dataMap){thisMap=tagCtx.map;if(!thisMap||thisMap.src!==args[0]||isUpdate){if(thisMap&&thisMap.src){thisMap.unmap()}thisMap=tagCtx.map=mapDef.map(args[0],props,undefined,!tag._.bnd)}args=[thisMap.tgt]}}tag.ctx=tagCtx.ctx;if(!i){if(callInit){initialTmpl=tag.template;tag.init(tagCtx,linkCtx,tag.ctx);callInit=undefined;if(tag.template!==initialTmpl){tag._.tmpl=tag.template}}if(linkCtx){linkCtx.attr=tag.attr=linkCtx.attr||tag.attr}attr=tag.attr;tag._.noVws=attr&&attr!==HTML}itemRet=undefined;if(tag.render){itemRet=tag.render.apply(tag,args)}if(!args.length){args=[parentView]}if(itemRet===undefined){itemRet=tagCtx.render(args.length?args[0]:parentView,true)||(isUpdate?undefined:\"\")}ret=ret?ret+(itemRet||\"\"):itemRet}tag.rendering=undefined}tag.tagCtx=tagCtxs[0];tag.ctx=tag.tagCtx.ctx;if(tag._.noVws){if(tag._.inline){ret=attr===\"text\"?$converters.html(ret):\"\"}}return boundTag&&parentView._.onRender?parentView._.onRender(ret,parentView,boundTag):ret}function View(context,type,parentView,data,template,key,contentTmpl,onRender){var views,parentView_,tag,self_,self=this,isArray=type===\"array\";self.content=contentTmpl;self.views=isArray?[]:{};self.parent=parentView;self.type=type||\"top\";self.data=data;self.tmpl=template;self_=self._={key:0,useKey:isArray?0:1,id:\"\"+viewId++,onRender:onRender,bnds:{}};self.linked=!!onRender;if(parentView){views=parentView.views;parentView_=parentView._;if(parentView_.useKey){views[self_.key=\"_\"+parentView_.useKey++]=self;self.index=indexStr;self.getIndex=getNestedIndex;tag=parentView_.tag;self_.bnd=isArray&&(!tag||!!tag._.bnd&&tag)}else{if(views.length===(self_.key=self.index=key)){views.push(self)}else{views.splice(key,0,self)}}self.ctx=context||parentView.ctx}else{self.ctx=context}}View.prototype={get:getView,getIndex:getIndex,getRsc:getResource,hlp:getHelper,_is:\"view\"};function compileChildResources(parentTmpl){var storeName,resources,resourceName,resource,settings,compile,onStore;for(storeName in jsvStores){settings=jsvStores[storeName];if((compile=settings.compile)&&(resources=parentTmpl[storeName+\"s\"])){for(resourceName in resources){resource=resources[resourceName]=compile(resourceName,resources[resourceName],parentTmpl,0);resource._is=storeName;if(resource&&(onStore=$sub.onStore[storeName])){onStore(resourceName,resource,compile)}}}}}function compileTag(name,tagDef,parentTmpl){var tmpl,baseTag,prop,compiledDef=new $sub._tg();function Tag(){var tag=this;tag._={inline:true,unlinked:true};tag.tagName=name}if($isFunction(tagDef)){tagDef={depends:tagDef.depends,render:tagDef}}else{if(\"\"+tagDef===tagDef){tagDef={template:tagDef}}}if(baseTag=tagDef.baseTag){tagDef.flow=!!tagDef.flow;tagDef.baseTag=baseTag=\"\"+baseTag===baseTag?(parentTmpl&&parentTmpl.tags[baseTag]||$tags[baseTag]):baseTag;compiledDef=$extend(compiledDef,baseTag);for(prop in tagDef){compiledDef[prop]=getMethod(baseTag[prop],tagDef[prop])}}else{compiledDef=$extend(compiledDef,tagDef)}if((tmpl=compiledDef.template)!==undefined){compiledDef.template=\"\"+tmpl===tmpl?($templates[tmpl]||$templates(tmpl)):tmpl}if(compiledDef.init!==false){(Tag.prototype=compiledDef).constructor=compiledDef._ctr=Tag}if(parentTmpl){compiledDef._parentTmpl=parentTmpl}return compiledDef}function baseApply(args){return this.base.apply(this,args)}function compileTmpl(name,tmpl,parentTmpl,options){function lookupTemplate(value){var currentName,tmpl;if((\"\"+value===value)||value.nodeType>0&&(elem=value)){if(!elem){if(/^\\.\\/[^\\\\:*?\"<>]*$/.test(value)){if(tmpl=$templates[name=name||value]){value=tmpl}else{elem=document.getElementById(value)}}else{if($.fn&&!rTmplString.test(value)){try{elem=$(document).find(value)[0]}catch(e){}}}}if(elem){if(options){value=elem.innerHTML}else{currentName=elem.getAttribute(tmplAttr);if(currentName){if(currentName!==jsvTmpl){value=$templates[currentName];delete $templates[currentName]}else{if($.fn){value=$.data(elem)[jsvTmpl]}}}else{name=name||($.fn?jsvTmpl:value);value=compileTmpl(name,elem.innerHTML,parentTmpl,options)}value.tmplName=name=name||currentName;if(name!==jsvTmpl){$templates[name]=value}elem.setAttribute(tmplAttr,name);if($.fn){$.data(elem,jsvTmpl,value)}}}elem=undefined}else{if(!value.fn){value=undefined}}return value}var elem,compiledTmpl,tmplOrMarkup=tmpl=tmpl||\"\";if(options===0){options=undefined;tmplOrMarkup=lookupTemplate(tmplOrMarkup)}options=options||(tmpl.markup?tmpl:{});options.tmplName=name;if(parentTmpl){options._parentTmpl=parentTmpl}if(!tmplOrMarkup&&tmpl.markup&&(tmplOrMarkup=lookupTemplate(tmpl.markup))){if(tmplOrMarkup.fn){tmplOrMarkup=tmplOrMarkup.markup}}if(tmplOrMarkup!==undefined){if(tmplOrMarkup.fn||tmpl.fn){if(tmplOrMarkup.fn){compiledTmpl=tmplOrMarkup}}else{tmpl=tmplObject(tmplOrMarkup,options);tmplFn(tmplOrMarkup.replace(rEscapeQuotes,\"\\\\$&\"),tmpl)}if(!compiledTmpl){compileChildResources(options);compiledTmpl=$extend(function(){return tmpl.render.apply(tmpl,arguments)},tmpl)}if(name&&!parentTmpl&&name!==jsvTmpl){$render[name]=compiledTmpl}return compiledTmpl}}function dataMap(mapDef){function Map(source,options){this.tgt=mapDef.getTgt(source,options)}if($isFunction(mapDef)){mapDef={getTgt:mapDef}}if(mapDef.baseMap){mapDef=$extend($extend({},mapDef.baseMap),mapDef)}mapDef.map=function(source,options){return new Map(source,options)};return mapDef}function tmplObject(markup,options){var htmlTag,wrapMap=$viewsSettings.wrapMap||{},tmpl=$extend({tmpls:[],links:{},bnds:[],_is:\"template\",render:renderContent},options);tmpl.markup=markup;if(!options.htmlTag){htmlTag=rFirstElem.exec(markup);tmpl.htmlTag=htmlTag?htmlTag[1].toLowerCase():\"\"}htmlTag=wrapMap[tmpl.htmlTag];if(htmlTag&&htmlTag!==wrapMap.div){tmpl.markup=$.trim(tmpl.markup)}return tmpl}function registerStore(storeName,storeSettings){function theStore(name,item,parentTmpl){var onStore,compile,itemName,thisStore;if(name&&typeof name===OBJECT&&!name.nodeType&&!name.markup&&!name.getTgt){for(itemName in name){theStore(itemName,name[itemName],item)}return $views}if(item===undefined){item=name;name=undefined}if(name&&\"\"+name!==name){parentTmpl=item;item=name;name=undefined}thisStore=parentTmpl?parentTmpl[storeNames]=parentTmpl[storeNames]||{}:theStore;compile=storeSettings.compile;if(item===null){if(name){delete thisStore[name]}}else{item=compile?compile(name,item,parentTmpl,0):item;if(name){thisStore[name]=item}}if(compile&&item){item._is=storeName}if(item&&(onStore=$sub.onStore[storeName])){onStore(name,item,compile)}return item}var storeNames=storeName+\"s\";$views[storeNames]=theStore}function renderContent(data,context,noIteration,parentView,key,onRender){var i,l,tag,tmpl,tagCtx,isTopRenderCall,prevData,prevIndex,view=parentView,result=\"\";if(context===true){noIteration=context;context=undefined}else{if(typeof context!==OBJECT){context=undefined}}if(tag=this.tag){tagCtx=this;tmpl=tag._.tmpl||tagCtx.tmpl;view=view||tagCtx.view;if(!arguments.length){data=view}}else{tmpl=this}if(tmpl){if(!view&&data&&data._is===\"view\"){view=data}if(view){if(data===view){data=view.data}}if(!tmpl.fn){tmpl=tag._.tmpl=$templates[tmpl]||$templates(tmpl)}isTopRenderCall=!view;isRenderCall=isRenderCall||isTopRenderCall;if(!view){(context=context||{}).root=data}if(!isRenderCall||$viewsSettings.useViews||tmpl.useViews||view&&view!==topView){result=renderWithViews(tmpl,data,context,noIteration,view,key,onRender,tag)}else{if(view){prevData=view.data;prevIndex=view.index;view.index=indexStr}else{view=topView;view.data=data;view.ctx=context}if($isArray(data)&&!noIteration){for(i=0,l=data.length;i<l;i++){view.index=i;view.data=data[i];result+=tmpl.fn(data[i],view,$views)}}else{result+=tmpl.fn(data,view,$views)}view.data=prevData;view.index=prevIndex}if(isTopRenderCall){isRenderCall=undefined}}return result}function renderWithViews(tmpl,data,context,noIteration,view,key,onRender,tag){function setItemVar(item){newCtx=$extend({},context);newCtx[itemVar]=item}var i,l,newView,childView,itemResult,swapContent,contentTmpl,outerOnRender,tmplName,itemVar,newCtx,tagCtx,result=\"\";if(tag){tmplName=tag.tagName;tagCtx=tag.tagCtx;context=context?extendCtx(context,tag.ctx):tag.ctx;contentTmpl=tagCtx.content;if(tagCtx.props.link===false){context=context||{};context.link=false}if(itemVar=tagCtx.props.itemVar){if(itemVar.charAt(0)!==\"~\"){syntaxError(\"Use itemVar='~myItem'\")}itemVar=itemVar.slice(1)}}if(view){contentTmpl=contentTmpl||view.content;onRender=onRender||view._.onRender;context=extendCtx(context,view.ctx)}if(key===true){swapContent=true;key=0}if(onRender&&(context&&context.link===false||tag&&tag._.noVws)){onRender=undefined}outerOnRender=onRender;if(onRender===true){outerOnRender=undefined;onRender=view._.onRender}context=tmpl.helpers?extendCtx(tmpl.helpers,context):context;newCtx=context;if($isArray(data)&&!noIteration){newView=swapContent?view:(key!==undefined&&view)||new View(context,\"array\",view,data,tmpl,key,contentTmpl,onRender);if(itemVar){newView.it=itemVar}itemVar=newView.it;for(i=0,l=data.length;i<l;i++){if(itemVar){setItemVar(data[i])}childView=new View(newCtx,\"item\",newView,data[i],tmpl,(key||0)+i,contentTmpl,onRender);itemResult=tmpl.fn(data[i],childView,$views);result+=newView._.onRender?newView._.onRender(itemResult,childView):itemResult}}else{if(itemVar){setItemVar(data)}newView=swapContent?view:new View(newCtx,tmplName||\"data\",view,data,tmpl,key,contentTmpl,onRender);if(tag&&!tag.flow){newView.tag=tag}result+=tmpl.fn(data,newView,$views)}return outerOnRender?outerOnRender(result,newView):result}function error(e,view,fallback){var message=$viewsSettings.onError(e,view,fallback);if(\"\"+e===e){throw new $sub.Err(message)}return !view.linkCtx&&view.linked?$converters.html(message):message}function syntaxError(message){error(\"Syntax error\\n\"+message)}function tmplFn(markup,tmpl,isLinkExpr,convertBack,hasElse){function pushprecedingContent(shift){shift-=loc;if(shift){content.push(markup.substr(loc,shift).replace(rNewLine,\"\\\\n\"))}}function blockTagCheck(tagName,block){if(tagName){tagName+=\"}}\";syntaxError((block?\"{{\"+block+\"}} block has {{/\"+tagName+\" without {{\"+tagName:\"Unmatched or missing {{/\"+tagName)+\", in template:\\n\"+markup)}}function parseTag(all,bind,tagName,converter,colon,html,comment,codeTag,params,slash,closeBlock,index){if(html){colon=\":\";converter=HTML}slash=slash||isLinkExpr&&!hasElse;var pathBindings=(bind||isLinkExpr)&&[[]],props=\"\",args=\"\",ctxProps=\"\",paramsArgs=\"\",paramsProps=\"\",paramsCtxProps=\"\",onError=\"\",useTrigger=\"\",block=!slash&&!colon&&!comment;tagName=tagName||(params=params||\"#data\",colon);pushprecedingContent(index);loc=index+all.length;if(codeTag){if(allowCode){content.push([\"*\",\"\\n\"+params.replace(/^:/,\"ret+= \").replace(rUnescapeQuotes,\"$1\")+\";\\n\"])}}else{if(tagName){if(tagName===\"else\"){if(rTestElseIf.test(params)){syntaxError('for \"{{else if expr}}\" use \"{{else expr}}\"')}pathBindings=current[7]&&[[]];current[8]=markup.substring(current[8],index);current=stack.pop();content=current[2];block=true}if(params){parseParams(params.replace(rNewLine,\" \"),pathBindings,tmpl).replace(rBuildHash,function(all,onerror,isCtx,key,keyToken,keyValue,arg,param){key=\"'\"+keyToken+\"':\";if(arg){args+=keyValue+\",\";paramsArgs+=\"'\"+param+\"',\"}else{if(isCtx){ctxProps+=key+keyValue+\",\";paramsCtxProps+=key+\"'\"+param+\"',\"}else{if(onerror){onError+=keyValue}else{if(keyToken===\"trigger\"){useTrigger+=keyValue}props+=key+keyValue+\",\";paramsProps+=key+\"'\"+param+\"',\";hasHandlers=hasHandlers||rHasHandlers.test(keyToken)}}}return\"\"}).slice(0,-1)}if(pathBindings&&pathBindings[0]){pathBindings.pop()}newNode=[tagName,converter||!!convertBack||hasHandlers||\"\",block&&[],parsedParam(paramsArgs,paramsProps,paramsCtxProps),parsedParam(args,props,ctxProps),onError,useTrigger,pathBindings||0];content.push(newNode);if(block){stack.push(current);current=newNode;current[8]=loc}}else{if(closeBlock){blockTagCheck(closeBlock!==current[0]&&current[0]!==\"else\"&&closeBlock,current[0]);current[8]=markup.substring(current[8],index);current=stack.pop()}}}blockTagCheck(!current&&closeBlock);content=current[2]}var result,newNode,hasHandlers,allowCode=$viewsSettings.allowCode||tmpl&&tmpl.allowCode,astTop=[],loc=0,stack=[],content=astTop,current=[,,astTop];if(allowCode){tmpl.allowCode=allowCode}if(isLinkExpr){markup=delimOpenChar0+markup+delimCloseChar1}blockTagCheck(stack[0]&&stack[0][2].pop()[0]);markup.replace(rTag,parseTag);pushprecedingContent(markup.length);if(loc=astTop[astTop.length-1]){blockTagCheck(\"\"+loc!==loc&&(+loc[8]===loc[8])&&loc[0])}if(isLinkExpr){result=buildCode(astTop,markup,isLinkExpr);setPaths(result,[astTop[0][7]])}else{result=buildCode(astTop,tmpl)}return result}function setPaths(fn,pathsArr){var key,paths,i=0,l=pathsArr.length;fn.deps=[];for(;i<l;i++){paths=pathsArr[i];for(key in paths){if(key!==\"_jsvto\"&&paths[key].length){fn.deps=fn.deps.concat(paths[key])}}}fn.paths=paths}function parsedParam(args,props,ctx){return[args.slice(0,-1),props.slice(0,-1),ctx.slice(0,-1)]}function paramStructure(parts,type){return\"\\n\\t\"+(type?type+\":{\":\"\")+\"args:[\"+parts[0]+\"]\"+(parts[1]||!type?\",\\n\\tprops:{\"+parts[1]+\"}\":\"\")+(parts[2]?\",\\n\\tctx:{\"+parts[2]+\"}\":\"\")}function parseParams(params,pathBindings,tmpl){function parseTokens(all,lftPrn0,lftPrn,bound,path,operator,err,eq,path2,prn,comma,lftPrn2,apos,quot,rtPrn,rtPrnDot,prn2,space,index,full){bound=bindings&&bound;if(bound&&!eq){path=bound+path}operator=operator||\"\";lftPrn=lftPrn||lftPrn0||lftPrn2;path=path||path2;prn=prn||prn2||\"\";var expr,exprFn,binds,theOb,newOb;function parsePath(allPath,not,object,helper,view,viewProperty,pathTokens,leafToken){var subPath=object===\".\";if(object){path=path.slice(not.length);if(!subPath){allPath=(helper?'view.hlp(\"'+helper+'\")':view?\"view\":\"data\")+(leafToken?(viewProperty?\".\"+viewProperty:helper?\"\":(view?\"\":\".\"+object))+(pathTokens||\"\"):(leafToken=helper?\"\":view?viewProperty||\"\":object,\"\"));allPath=allPath+(leafToken?\".\"+leafToken:\"\");allPath=not+(allPath.slice(0,9)===\"view.data\"?allPath.slice(5):allPath)}if(bindings){binds=named===\"linkTo\"?(bindto=pathBindings._jsvto=pathBindings._jsvto||[]):bndCtx.bd;if(theOb=subPath&&binds[binds.length-1]){if(theOb._jsv){while(theOb.sb){theOb=theOb.sb}if(theOb.bnd){path=\"^\"+path.slice(1)}theOb.sb=path;theOb.bnd=theOb.bnd||path.charAt(0)===\"^\"}}else{binds.push(path)}pathStart[parenDepth]=index+(subPath?1:0)}}return allPath}if(err&&!aposed&&!quoted){syntaxError(params)}else{if(bindings&&rtPrnDot&&!aposed&&!quoted){if(!named||boundName||bindto){expr=pathStart[parenDepth-1];if(full.length-1>index-(expr||0)){expr=full.slice(expr,index+all.length);if(exprFn!==true){binds=bindto||bndStack[parenDepth-1].bd;theOb=binds[binds.length-1];if(theOb&&theOb.prm){while(theOb.sb&&theOb.sb.prm){theOb=theOb.sb}newOb=theOb.sb={path:theOb.sb,bnd:theOb.bnd}}else{binds.push(newOb={path:binds.pop()})}}rtPrnDot=delimOpenChar1+\":\"+expr+\" onerror=''\"+delimCloseChar0;exprFn=tmplLinks[rtPrnDot];if(!exprFn){tmplLinks[rtPrnDot]=true;tmplLinks[rtPrnDot]=exprFn=tmplFn(rtPrnDot,tmpl,true)}if(exprFn!==true&&newOb){newOb._jsv=exprFn;newOb.prm=bndCtx.bd;newOb.bnd=newOb.bnd||newOb.path&&newOb.path.indexOf(\"^\")>=0}}}}return(aposed?(aposed=!apos,(aposed?all:lftPrn2+'\"')):quoted?(quoted=!quot,(quoted?all:lftPrn2+'\"')):((lftPrn?(pathStart[parenDepth]=index++,bndCtx=bndStack[++parenDepth]={bd:[]},lftPrn):\"\")+(space?(parenDepth?\"\":(paramIndex=full.slice(paramIndex,index),named?(named=boundName=bindto=false,\"\\b\"):\"\\b,\")+paramIndex+(paramIndex=index+all.length,bindings&&pathBindings.push(bndCtx.bd=[]),\"\\b\")):eq?(parenDepth&&syntaxError(params),bindings&&pathBindings.pop(),named=path,boundName=bound,paramIndex=index+all.length,bound&&(bindings=bndCtx.bd=pathBindings[named]=[]),path+\":\"):path?(path.split(\"^\").join(\".\").replace(rPath,parsePath)+(prn?(bndCtx=bndStack[++parenDepth]={bd:[]},fnCall[parenDepth]=true,prn):operator)):operator?operator:rtPrn?((fnCall[parenDepth]=false,bndCtx=bndStack[--parenDepth],rtPrn)+(prn?(bndCtx=bndStack[++parenDepth],fnCall[parenDepth]=true,prn):\"\")):comma?(fnCall[parenDepth]||syntaxError(params),\",\"):lftPrn0?\"\":(aposed=apos,quoted=quot,'\"'))))}}var named,bindto,boundName,quoted,aposed,bindings=pathBindings&&pathBindings[0],bndCtx={bd:bindings},bndStack={0:bndCtx},paramIndex=0,tmplLinks=tmpl?tmpl.links:bindings&&(bindings.links=bindings.links||{}),parenDepth=0,fnCall={},pathStart={},result=(params+(tmpl?\" \":\"\")).replace(rParams,parseTokens);return !parenDepth&&result||syntaxError(params)}function buildCode(ast,tmpl,isLinkExpr){var i,node,tagName,converter,tagCtx,hasTag,hasEncoder,getsVal,hasCnvt,useCnvt,tmplBindings,pathBindings,params,boundOnErrStart,boundOnErrEnd,tagRender,nestedTmpls,tmplName,nestedTmpl,tagAndElses,content,markup,nextIsElse,oldCode,isElse,isGetVal,tagCtxFn,onError,tagStart,trigger,tmplBindingKey=0,useViews=$viewsSettings.useViews||tmpl.useViews||tmpl.tags||tmpl.templates||tmpl.helpers||tmpl.converters,code=\"\",tmplOptions={},l=ast.length;if(\"\"+tmpl===tmpl){tmplName=isLinkExpr?'data-link=\"'+tmpl.replace(rNewLine,\" \").slice(1,-1)+'\"':tmpl;tmpl=0}else{tmplName=tmpl.tmplName||\"unnamed\";if(tmpl.allowCode){tmplOptions.allowCode=true}if(tmpl.debug){tmplOptions.debug=true}tmplBindings=tmpl.bnds;nestedTmpls=tmpl.tmpls}for(i=0;i<l;i++){node=ast[i];if(\"\"+node===node){code+='\\n+\"'+node+'\"'}else{tagName=node[0];if(tagName===\"*\"){code+=\";\\n\"+node[1]+\"\\nret=ret\"}else{converter=node[1];content=!isLinkExpr&&node[2];tagCtx=paramStructure(node[3],\"params\")+\"},\"+paramStructure(params=node[4]);onError=node[5];trigger=node[6];markup=node[8]&&node[8].replace(rUnescapeQuotes,\"$1\");if(isElse=tagName===\"else\"){if(pathBindings){pathBindings.push(node[7])}}else{tmplBindingKey=0;if(tmplBindings&&(pathBindings=node[7])){pathBindings=[pathBindings];tmplBindingKey=tmplBindings.push(1)}}useViews=useViews||params[1]||params[2]||pathBindings||/view.(?!index)/.test(params[0]);if(isGetVal=tagName===\":\"){if(converter){tagName=converter===HTML?\">\":converter+tagName}}else{if(content){nestedTmpl=tmplObject(markup,tmplOptions);nestedTmpl.tmplName=tmplName+\"/\"+tagName;nestedTmpl.useViews=nestedTmpl.useViews||useViews;buildCode(content,nestedTmpl);useViews=nestedTmpl.useViews;nestedTmpls.push(nestedTmpl)}if(!isElse){tagAndElses=tagName;useViews=useViews||tagName&&(!$tags[tagName]||!$tags[tagName].flow);oldCode=code;code=\"\"}nextIsElse=ast[i+1];nextIsElse=nextIsElse&&nextIsElse[0]===\"else\"}tagStart=onError?\";\\ntry{\\nret+=\":\"\\n+\";boundOnErrStart=\"\";boundOnErrEnd=\"\";if(isGetVal&&(pathBindings||trigger||converter&&converter!==HTML)){tagCtxFn=\"return {\"+tagCtx+\"};\";tagRender='c(\"'+converter+'\",view,';tagCtxFn=new Function(\"data,view,j,u\",\" // \"+tmplName+\" \"+tmplBindingKey+\" \"+tagName+\"\\n\"+tagCtxFn);tagCtxFn._er=onError;boundOnErrStart=tagRender+tmplBindingKey+\",\";boundOnErrEnd=\")\";tagCtxFn._tag=tagName;if(isLinkExpr){return tagCtxFn}setPaths(tagCtxFn,pathBindings);useCnvt=true}code+=(isGetVal?(isLinkExpr?(onError?\"\\ntry{\\n\":\"\")+\"return \":tagStart)+(useCnvt?(useCnvt=undefined,useViews=hasCnvt=true,tagRender+(pathBindings?((tmplBindings[tmplBindingKey-1]=tagCtxFn),tmplBindingKey):\"{\"+tagCtx+\"}\")+\")\"):tagName===\">\"?(hasEncoder=true,\"h(\"+params[0]+\")\"):(getsVal=true,\"((v=\"+(params[0]||\"data\")+')!=null?v:\"\")')):(hasTag=true,\"\\n{view:view,tmpl:\"+(content?nestedTmpls.length:\"0\")+\",\"+tagCtx+\"},\"));if(tagAndElses&&!nextIsElse){code=\"[\"+code.slice(0,-1)+\"]\";tagRender='t(\"'+tagAndElses+'\",view,this,';if(isLinkExpr||pathBindings){code=new Function(\"data,view,j,u\",\" // \"+tmplName+\" \"+tmplBindingKey+\" \"+tagAndElses+\"\\nreturn \"+code+\";\");code._er=onError;code._tag=tagAndElses;if(pathBindings){setPaths(tmplBindings[tmplBindingKey-1]=code,pathBindings)}if(isLinkExpr){return code}boundOnErrStart=tagRender+tmplBindingKey+\",undefined,\";boundOnErrEnd=\")\"}code=oldCode+tagStart+tagRender+(tmplBindingKey||code)+\")\";pathBindings=0;tagAndElses=0}if(onError){useViews=true;code+=\";\\n}catch(e){ret\"+(isLinkExpr?\"urn \":\"+=\")+boundOnErrStart+\"j._err(e,view,\"+onError+\")\"+boundOnErrEnd+\";}\\n\"+(isLinkExpr?\"\":\"ret=ret\")}}}}code=\"// \"+tmplName+\"\\nvar v\"+(hasTag?\",t=j._tag\":\"\")+(hasCnvt?\",c=j._cnvt\":\"\")+(hasEncoder?\",h=j.converters.html\":\"\")+(isLinkExpr?\";\\n\":',ret=\"\"\\n')+(tmplOptions.debug?\"debugger;\":\"\")+code+(isLinkExpr?\"\\n\":\";\\nreturn ret;\");if($viewsSettings._dbgMode){code=\"try {\\n\"+code+\"\\n}catch(e){\\nreturn j._err(e, view);\\n}\"}try{code=new Function(\"data,view,j,u\",code)}catch(e){syntaxError(\"Compiled template code:\\n\\n\"+code+'\\n: \"'+e.message+'\"')}if(tmpl){tmpl.fn=code;tmpl.useViews=!!useViews}return code}function extendCtx(context,parentContext){return context&&context!==parentContext?(parentContext?$extend($extend({},parentContext),context):context):parentContext&&$extend({},parentContext)}function getCharEntity(ch){return charEntities[ch]||(charEntities[ch]=\"&#\"+ch.charCodeAt(0)+\";\")}function getTargetProps(source){var key,prop,props=[];if(typeof source===OBJECT){for(key in source){prop=source[key];if(!prop||!prop.toJSON||prop.toJSON()){if(!$isFunction(prop)){props.push({key:key,prop:prop})}}}}return props}function $fnRender(data,context,noIteration){var tmplElem=this.jquery&&(this[0]||error('Unknown template: \"'+this.selector+'\"')),tmpl=tmplElem.getAttribute(tmplAttr);return renderContent.call(tmpl?$.data(tmplElem)[jsvTmpl]:$templates(tmplElem),data,context,noIteration)}function htmlEncode(text){return text!=undefined?rIsHtml.test(text)&&(\"\"+text).replace(rHtmlEncode,getCharEntity)||text:\"\"}if(!(jsr||$&&$.render)){for(jsvStoreName in jsvStores){registerStore(jsvStoreName,jsvStores[jsvStoreName])}$templates=$views.templates;$converters=$views.converters;$helpers=$views.helpers;$tags=$views.tags;$sub=$views.sub;$viewsSettings=$views.settings;$sub._tg.prototype={baseApply:baseApply,cvtArgs:convertArgs};topView=$sub.topView=new View();if($){$.fn.render=$fnRender;if($.observable){$extend($sub,$.views.sub);$views.map=$.views.map}}else{$={};if(setGlobals){global.jsrender=$}$.renderFile=$.__express=$.compile=function(){throw\"Node.js: use npm jsrender, or jsrender-node.js\"};$.isFunction=function(ob){return typeof ob===\"function\"};$.isArray=Array.isArray||function(obj){return({}.toString).call(obj)===\"[object Array]\"};$sub._jq=function(jq){if(jq!==$){$extend(jq,$);$=jq;$.fn.render=$fnRender;delete $.jsrender}};$.jsrender=versionNumber}$isFunction=$.isFunction;$isArray=$.isArray;$.render=$render;$.views=$views;$.templates=$templates=$views.templates;$viewsSettings({debugMode:dbgMode,delimiters:$viewsDelimiters,onError:function(e,view,fallback){if(view){e=fallback===undefined?\"{Error: \"+(e.message||e)+\"}\":$isFunction(fallback)?fallback(e,view):fallback}return e==undefined?\"\":e},_dbgMode:false});$tags({\"if\":{render:function(val){var self=this,tagCtx=self.tagCtx,ret=(self.rendering.done||!val&&(arguments.length||!tagCtx.index))?\"\":(self.rendering.done=true,self.selected=tagCtx.index,tagCtx.render(tagCtx.view,true));return ret},flow:true},\"for\":{render:function(val){var finalElse=!arguments.length,value,self=this,tagCtx=self.tagCtx,result=\"\",done=0;if(!self.rendering.done){value=finalElse?tagCtx.view.data:val;if(value!==undefined){result+=tagCtx.render(value,finalElse);done+=$isArray(value)?value.length:1}if(self.rendering.done=done){self.selected=tagCtx.index}}return result},flow:true},props:{baseTag:\"for\",dataMap:dataMap(getTargetProps),flow:true},include:{flow:true},\"*\":{render:retVal,flow:true},\":*\":{render:retVal,flow:true},dbg:$helpers.dbg=$converters.dbg=dbgBreak});$converters({html:htmlEncode,attr:htmlEncode,url:function(text){return text!=undefined?encodeURI(\"\"+text):text===null?text:\"\"}});$viewsDelimiters()}if(jsrToJq){jsr.views.sub._jq($)}return $||jsr}));$(document).ready(function(){$(\".feedback-more\").click(function(a){a.preventDefault();$(\"#feedbackModal\").modal()})});function getNav(){var b=$(\"ul.main-navigation, ul[role=main-navigation]\").before('<fieldset class=\"mobile-nav\">');var a=$(\"fieldset.mobile-nav\").append(\"<select>\");a.find(\"select\").append('<option value=\"\">Navigate&hellip;</option>');var c=function(d,e){a.find(\"select\").append('<option value=\"'+this.href+'\">&raquo; '+$(this).text()+\"</option>\")};b.find(\"a\").each(c);$(\"ul.subscription a\").each(c);a.find(\"select\").bind(\"change\",function(d){if(d.target.value){window.location.href=d.target.value}})}function testFeatures(){var a=[\"maskImage\"];$(a).map(function(c,b){if(Modernizr.testAllProps(b)){$(\"html\").addClass(b)}else{$(\"html\").addClass(\"no-\"+b)}});if(\"placeholder\" in document.createElement(\"input\")){$(\"html\").addClass(\"placeholder\")}else{$(\"html\").addClass(\"no-placeholder\")}}function addCodeLineNumbers(){if(navigator.appName===\"Microsoft Internet Explorer\"){return}$(\"div.gist-highlight\").each(function(g){var d='<table><tbody><tr><td class=\"gutter\">',a='<pre class=\"line-numbers\">',h='</pre></td><td class=\"code\">',b=\"</td></tr></tbody></table>\",f=$(\".line\",g).length;for(var c=1;c<=f;c++){a+='<span class=\"line-number\">'+c+\"</span>\\n\"}var e=d+a+h+\"<pre>\"+$(\"pre\",g).html()+\"</pre>\"+b;$(g).html(e)})}function flashVideoFallback(){var b=\"/assets/jwplayer/player.swf\",a=\"/assets/jwplayer/glow/glow.xml\";$(\"video\").each(function(c,d){d=$(d);if(!Modernizr.video.h264&&swfobject.getFlashPlayerVersion()||window.location.hash.indexOf(\"flash-test\")!==-1){d.children(\"source[src$=mp4]\").first().map(c,function(g){var h=$(g).attr(\"src\"),i=\"video_\"+Math.round(1+Math.random()*(100000)),f=d.attr(\"width\"),e=parseInt(d.attr(\"height\"),10)+30;d.after('<div class=\"flash-video\"><div><div id='+i+\">\");swfobject.embedSWF(b,i,f,e+30,\"9.0.0\",{file:h,image:d.attr(\"poster\"),skin:a},{movie:h,wmode:\"opaque\",allowfullscreen:\"true\"})});d.remove()}})}function wrapFlashVideos(){$(\"object\").each(function(b,a){if($(a).find(\"param[name=movie]\").length){$(a).wrap('<div class=\"flash-video\">')}});$(\"iframe[src*=vimeo],iframe[src*=youtube]\").wrap('<div class=\"flash-video\">')}function renderDeliciousLinks(c){var b=\"<ul>\";for(var d=0,a=c.length;d<a;d++){b+='<li><a href=\"'+c[d].u+'\" title=\"Tags: '+(c[d].t==\"\"?\"\":c[d].t.join(\", \"))+'\">'+c[d].d+\"</a></li>\"}b+=\"</ul>\";$(\"#delicious\").html(b)}$(\"document\").ready(function(){testFeatures();wrapFlashVideos();flashVideoFallback();addCodeLineNumbers();getNav()});(function(e){var c=\"addEventListener\",b=\"gesturestart\",g=\"querySelectorAll\",f=[1,1],d=g in e?e[g](\"meta[name=viewport]\"):[];function a(){d.content=\"width=device-width,minimum-scale=\"+f[0]+\",maximum-scale=\"+f[1];e.removeEventListener(b,a,true)}if((d=d[d.length-1])&&c in e){a();f=[0.25,1.6];e[c](b,a,true)}}(document));\n/*!\tSWFObject v2.2 modified by Brandon Mathis to contain only what is necessary to dynamically embed flash objects\n  * Uncompressed source in javascripts/libs/swfobject-dynamic.js\n  * <http://code.google.com/p/swfobject/>\n\treleased under the MIT License <http://www.opensource.org/licenses/mit-license.php>\n*/\n;var swfobject=function(){function w(t,s,n){var g,i=b(n);if(h.wk&&h.wk<312){return g}if(i){if(typeof t.id==d){t.id=n}if(h.ie&&h.win){var m=\"\",o;for(o in t){if(t[o]!=Object.prototype[o]){o.toLowerCase()==\"data\"?s.movie=t[o]:o.toLowerCase()==\"styleclass\"?m+=' class=\"'+t[o]+'\"':o.toLowerCase()!=\"classid\"&&(m+=\" \"+o+'=\"'+t[o]+'\"')}}o=\"\";for(var l in s){s[l]!=Object.prototype[l]&&(o+='<param name=\"'+l+'\" value=\"'+s[l]+'\" />')}i.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+m+\">\"+o+\"</object>\";g=b(t.id)}else{l=f.createElement(a);l.setAttribute(\"type\",c);for(var j in t){t[j]!=Object.prototype[j]&&(j.toLowerCase()==\"styleclass\"?l.setAttribute(\"class\",t[j]):j.toLowerCase()!=\"classid\"&&l.setAttribute(j,t[j]))}for(m in s){s[m]!=Object.prototype[m]&&m.toLowerCase()!=\"movie\"&&(t=l,o=m,j=s[m],n=f.createElement(\"param\"),n.setAttribute(\"name\",o),n.setAttribute(\"value\",j),t.appendChild(n))}i.parentNode.replaceChild(l,i);g=l}}return g}function b(i){var g=null;try{g=f.getElementById(i)}catch(j){}return g}function r(i){var g=h.pv,i=i.split(\".\");i[0]=parseInt(i[0],10);i[1]=parseInt(i[1],10)||0;i[2]=parseInt(i[2],10)||0;return g[0]>i[0]||g[0]==i[0]&&g[1]>i[1]||g[0]==i[0]&&g[1]==i[1]&&g[2]>=i[2]?!0:!1}function p(g){return/[\\\\\\\"<>\\.;]/.exec(g)!=null&&typeof encodeURIComponent!=d?encodeURIComponent(g):g}var d=\"undefined\",a=\"object\",c=\"application/x-shockwave-flash\",k=window,f=document,e=navigator,h=function(){var u=typeof f.getElementById!=d&&typeof f.getElementsByTagName!=d&&typeof f.createElement!=d,t=e.userAgent.toLowerCase(),o=e.platform.toLowerCase(),l=o?/win/.test(o):/win/.test(t),o=o?/mac/.test(o):/mac/.test(t),t=/webkit/.test(t)?parseFloat(t.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):!1,i=!+\"\\u000b1\",n=[0,0,0],s=null;if(typeof e.plugins!=d&&typeof e.plugins[\"Shockwave Flash\"]==a){if((s=e.plugins[\"Shockwave Flash\"].description)&&!(typeof e.mimeTypes!=d&&e.mimeTypes[c]&&!e.mimeTypes[c].enabledPlugin)){i=!1,s=s.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\"),n[0]=parseInt(s.replace(/^(.*)\\..*$/,\"$1\"),10),n[1]=parseInt(s.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10),n[2]=/[a-zA-Z]/.test(s)?parseInt(s.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof k.ActiveXObject!=d){try{var m=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");if(m&&(s=m.GetVariable(\"$version\"))){i=!0,s=s.split(\" \")[1].split(\",\"),n=[parseInt(s[0],10),parseInt(s[1],10),parseInt(s[2],10)]}}catch(j){}}}return{w3:u,pv:n,wk:t,ie:i,win:l,mac:o}}();return{embedSWF:function(D,C,A,v,t,z,B,y,x){var u={success:!1,id:C};if(h.w3&&!(h.wk&&h.wk<312)&&D&&C&&A&&v&&t){A+=\"\";v+=\"\";var l={};if(y&&typeof y===a){for(var s in y){l[s]=y[s]}}l.data=D;l.width=A;l.height=v;D={};if(B&&typeof B===a){for(var o in B){D[o]=B[o]}}if(z&&typeof z===a){for(var g in z){typeof D.flashvars!=d?D.flashvars+=\"&\"+g+\"=\"+z[g]:D.flashvars=g+\"=\"+z[g]}}if(r(t)){C=w(l,D,C),u.success=!0,u.ref=C}}x&&x(u)},ua:h,getFlashPlayerVersion:function(){return{major:h.pv[0],minor:h.pv[1],release:h.pv[2]}},hasFlashPlayerVersion:r,createSWF:function(i,g,j){if(h.w3){return w(i,g,j)}},getQueryParamValue:function(i){var g=f.location.search||f.location.hash;if(g){/\\?/.test(g)&&(g=g.split(\"?\")[1]);if(i==null){return p(g)}for(var g=g.split(\"&\"),j=0;j<g.length;j++){if(g[j].substring(0,g[j].indexOf(\"=\"))==i){return p(g[j].substring(g[j].indexOf(\"=\")+1))}}}return\"\"}}}();var hljs=new function(){function F(a){return a.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function w(a){return a.nodeName.toLowerCase()}function H(b,a){var c=b&&b.exec(a);return c&&c.index==0}function M(a){return Array.prototype.map.call(a.childNodes,function(b){if(b.nodeType==3){return O.useBR?b.nodeValue.replace(/\\n/g,\"\"):b.nodeValue}if(w(b)==\"br\"){return\"\\n\"}return M(b)}).join(\"\")}function y(a){var b=(a.className+\" \"+(a.parentNode?a.parentNode.className:\"\")).split(/\\s+/);b=b.map(function(c){return c.replace(/^language-/,\"\")});return b.filter(function(c){return G(c)||c==\"no-highlight\"})[0]}function B(a,d){var c={};for(var b in a){c[b]=a[b]}if(d){for(var b in d){c[b]=d[b]}}return c}function v(a){var c=[];(function b(f,e){for(var d=f.firstChild;d;d=d.nextSibling){if(d.nodeType==3){e+=d.nodeValue.length}else{if(w(d)==\"br\"){e+=1}else{if(d.nodeType==1){c.push({event:\"start\",offset:e,node:d});e=b(d,e);c.push({event:\"stop\",offset:e,node:d})}}}}return e})(a,0);return c}function z(h,f,b){var g=0;var j=\"\";var e=[];function c(){if(!h.length||!f.length){return h.length?h:f}if(h[0].offset!=f[0].offset){return(h[0].offset<f[0].offset)?h:f}return f[0].event==\"start\"?h:f}function d(l){function m(n){return\" \"+n.nodeName+'=\"'+F(n.value)+'\"'}j+=\"<\"+w(l)+Array.prototype.map.call(l.attributes,m).join(\"\")+\">\"}function k(l){j+=\"</\"+w(l)+\">\"}function i(l){(l.event==\"start\"?d:k)(l.node)}while(h.length||f.length){var a=c();j+=F(b.substr(g,a[0].offset-g));g=a[0].offset;if(a==h){e.reverse().forEach(k);do{i(a.splice(0,1)[0]);a=c()}while(a==h&&a.length&&a[0].offset==g);e.reverse().forEach(d)}else{if(a[0].event==\"start\"){e.push(a[0].node)}else{e.pop()}i(a.splice(0,1)[0])}}return j+F(b.substr(g))}function D(d){function c(e){return(e&&e.source)||e}function b(e,f){return RegExp(c(e),\"m\"+(d.cI?\"i\":\"\")+(f?\"g\":\"\"))}function a(g,i){if(g.compiled){return}g.compiled=true;g.k=g.k||g.bK;if(g.k){var h={};function f(k,l){if(d.cI){l=l.toLowerCase()}l.split(\" \").forEach(function(n){var m=n.split(\"|\");h[m[0]]=[k,m[1]?Number(m[1]):1]})}if(typeof g.k==\"string\"){f(\"keyword\",g.k)}else{Object.keys(g.k).forEach(function(k){f(k,g.k[k])})}g.k=h}g.lR=b(g.l||/\\b[A-Za-z0-9_]+\\b/,true);if(i){if(g.bK){g.b=g.bK.split(\" \").join(\"|\")}if(!g.b){g.b=/\\B|\\b/}g.bR=b(g.b);if(!g.e&&!g.eW){g.e=/\\B|\\b/}if(g.e){g.eR=b(g.e)}g.tE=c(g.e)||\"\";if(g.eW&&i.tE){g.tE+=(g.e?\"|\":\"\")+i.tE}}if(g.i){g.iR=b(g.i)}if(g.r===undefined){g.r=1}if(!g.c){g.c=[]}var j=[];g.c.forEach(function(k){if(k.v){k.v.forEach(function(l){j.push(B(k,l))})}else{j.push(k==\"self\"?g:k)}});g.c=j;g.c.forEach(function(k){a(k,g)});if(g.starts){a(g.starts,i)}var e=g.c.map(function(k){return k.bK?\"\\\\.?\\\\b(\"+k.b+\")\\\\b\\\\.?\":k.b}).concat([g.tE]).concat([g.i]).map(c).filter(Boolean);g.t=e.length?b(e.join(\"|\"),true):{exec:function(k){return null}};g.continuation={}}a(d)}function N(a,h,l,b){function s(R,Q){for(var S=0;S<Q.c.length;S++){if(H(Q.c[S].bR,R)){return Q.c[S]}}}function j(Q,R){if(H(Q.eR,R)){return Q}if(Q.eW){return j(Q.parent,R)}}function W(R,Q){return !l&&H(Q.iR,R)}function u(Q,S){var R=g.cI?S[0].toLowerCase():S[0];return Q.k.hasOwnProperty(R)&&Q.k[R]}function p(ab,ad,Q,R){var aa=R?\"\":O.classPrefix,S='<span class=\"'+aa,ac=Q?\"\":\"</span>\";S+=ab+'\">';return S+ad+ac}function f(){var S=F(U);if(!n.k){return S}var Y=\"\";var Z=0;n.lR.lastIndex=0;var R=n.lR.exec(S);while(R){Y+=S.substr(Z,R.index-Z);var Q=u(n,R);if(Q){o+=Q[1];Y+=p(Q[0],R[0])}else{Y+=R[0]}Z=n.lR.lastIndex;R=n.lR.exec(S)}return Y+S.substr(Z)}function t(){if(n.sL&&!K[n.sL]){return F(U)}var Q=n.sL?N(n.sL,U,true,n.continuation.top):J(U);if(n.r>0){o+=Q.r}if(n.subLanguageMode==\"continuous\"){n.continuation.top=Q.top}return p(Q.language,Q.value,false,true)}function c(){return n.sL!==undefined?t():f()}function d(Q,R){var S=Q.cN?p(Q.cN,\"\",true):\"\";if(Q.rB){T+=S;U=\"\"}else{if(Q.eB){T+=F(R)+S;U=\"\"}else{T+=S;U=R}}n=Object.create(Q,{parent:{value:n}})}function r(Y,Z){U+=Y;if(Z===undefined){T+=c();return 0}var R=s(Z,n);if(R){T+=c();d(R,Z);return R.rB?0:Z.length}var Q=j(n,Z);if(Q){var S=n;if(!(S.rE||S.eE)){U+=Z}T+=c();do{if(n.cN){T+=\"</span>\"}o+=n.r;n=n.parent}while(n!=Q.parent);if(S.eE){T+=F(Z)}U=\"\";if(Q.starts){d(Q.starts,\"\")}return S.rE?0:Z.length}if(W(Z,n)){throw new Error('Illegal lexeme \"'+Z+'\" for mode \"'+(n.cN||\"<unnamed>\")+'\"')}U+=Z;return Z.length||1}var g=G(a);if(!g){throw new Error('Unknown language: \"'+a+'\"')}D(g);var n=b||g;var T=\"\";for(var i=n;i!=g;i=i.parent){if(i.cN){T=p(i.cN,T,true)}}var U=\"\";var o=0;try{var V,k,m=0;while(true){n.t.lastIndex=m;V=n.t.exec(h);if(!V){break}k=r(h.substr(m,V.index-m),V[0]);m=V.index+k}r(h.substr(m));for(var i=n;i.parent;i=i.parent){if(i.cN){T+=\"</span>\"}}return{r:o,value:T,language:a,top:n}}catch(e){if(e.message.indexOf(\"Illegal\")!=-1){return{r:0,value:F(h)}}else{throw e}}}function J(d,a){a=a||O.languages||Object.keys(K);var c={r:0,value:F(d)};var b=c;a.forEach(function(f){if(!G(f)){return}var e=N(f,d,false);e.language=f;if(e.r>b.r){b=e}if(e.r>c.r){b=c;c=e}});if(b.language){c.second_best=b}return c}function I(a){if(O.tabReplace){a=a.replace(/^((<[^>]+>|\\t)+)/gm,function(c,d,e,b){return d.replace(/\\t/g,O.tabReplace)})}if(O.useBR){a=a.replace(/\\n/g,\"<br>\")}return a}function A(e){var f=M(e);var b=y(e);if(b==\"no-highlight\"){return}var d=b?N(b,f,true):J(f);var c=v(e);if(c.length){var a=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"pre\");a.innerHTML=d.value;d.value=z(c,v(a),f)}d.value=I(d.value);e.innerHTML=d.value;e.className+=\" hljs \"+(!b&&d.language||\"\");e.result={language:d.language,re:d.r};if(d.second_best){e.second_best={language:d.second_best.language,re:d.second_best.r}}}var O={classPrefix:\"hljs-\",tabReplace:null,useBR:false,languages:undefined};function x(a){O=B(O,a)}function E(){if(E.called){return}E.called=true;var a=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(a,A)}function P(){addEventListener(\"DOMContentLoaded\",E,false);addEventListener(\"load\",E,false)}var K={};var C={};function L(c,a){var b=K[c]=a(this);if(b.aliases){b.aliases.forEach(function(d){C[d]=c})}}function G(a){return K[a]||K[C[a]]}this.highlight=N;this.highlightAuto=J;this.fixMarkup=I;this.highlightBlock=A;this.configure=x;this.initHighlighting=E;this.initHighlightingOnLoad=P;this.registerLanguage=L;this.getLanguage=G;this.inherit=B;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE]};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE]};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gim]*/,i:/\\n/,c:[this.BE,{b:/\\[/,e:/\\]/,r:0,c:[this.BE]}]};this.TM={cN:\"title\",b:this.IR,r:0};this.UTM={cN:\"title\",b:this.UIR,r:0}}();hljs.registerLanguage(\"scilab\",function(d){var c=[d.CNM,{cN:\"string\",b:\"'|\\\"\",e:\"'|\\\"\",c:[d.BE,{b:\"''\"}]}];return{k:{keyword:\"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s\",built_in:\"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix\"},i:'(\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function endfunction\",e:\"$\",k:\"function endfunction|10\",c:[d.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",r:0,c:c},{cN:\"comment\",b:\"//\",e:\"$\"}].concat(c)}});hljs.registerLanguage(\"xml\",function(f){var h=\"[A-Za-z0-9\\\\._:-]+\";var g={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"};var e={eW:true,i:/</,r:0,c:[g,{cN:\"attribute\",b:h,r:0},{b:\"=\",r:0,c:[{cN:\"value\",v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\"],cI:true,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[e],starts:{e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[e],starts:{e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{b:\"<%\",e:\"%>\",sL:\"vbscript\"},g,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ /><]+\",r:0},e]}]}});hljs.registerLanguage(\"asciidoc\",function(b){return{c:[{cN:\"comment\",b:\"^/{4,}\\\\n\",e:\"\\\\n/{4,}$\",r:10},{cN:\"comment\",b:\"^//\",e:\"$\",r:0},{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",r:10},{cN:\"header\",b:\"^(={1,5}) .+?( \\\\1)?$\",r:10},{cN:\"header\",b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\",r:10},{cN:\"attribute\",b:\"^:.+?:\",e:\"\\\\s\",eE:true,r:10},{cN:\"attribute\",b:\"^\\\\[.+?\\\\]$\",r:0},{cN:\"blockquote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",r:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",r:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",r:0}],r:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"label\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",r:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",r:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",r:0}],r:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",r:0},{cN:\"smartquote\",b:\"``.+?''\",r:10},{cN:\"smartquote\",b:\"`.+?'\",r:10},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",r:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^'{3,}[ \\\\t]*$\",r:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:true,c:[{b:\"(link|image:?):\",r:0},{cN:\"link_url\",b:\"\\\\w\",e:\"[^\\\\[]+\",r:0},{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage(\"coffeescript\",function(l){var g={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module exports global window document\"};var h=\"[A-Za-z$_][0-9A-Za-z$_]*\";var i=l.inherit(l.TM,{b:h});var j={cN:\"subst\",b:/#\\{/,e:/}/,k:g};var k=[l.BNM,l.inherit(l.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[l.BE]},{b:/'/,e:/'/,c:[l.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[l.BE,j]},{b:/\"/,e:/\"/,c:[l.BE,j]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[j,l.HCM]},{b:\"//[gim]*\",r:0},{b:\"/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)\"}]},{cN:\"property\",b:\"@\"+h},{b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"}];j.c=k;return{k:g,c:k.concat([{cN:\"comment\",b:\"###\",e:\"###\"},l.HCM,{cN:\"function\",b:\"(\"+h+\"\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",e:\"[-=]>\",rB:true,c:[i,{cN:\"params\",b:\"\\\\(\",rB:true,c:[{b:/\\(/,e:/\\)/,k:g,c:[\"self\"].concat(k)}]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:true,i:/[:=\"\\[\\]]/,c:[i]},i]},{cN:\"attribute\",b:h+\":\",e:\":\",rB:true,eE:true,r:0}])}});hljs.registerLanguage(\"fix\",function(b){return{c:[{b:/[^\\u2401\\u0001]+/,e:/[\\u2401\\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\\u2401\\u0001=]+)/,e:/=([^\\u2401\\u0001=]+)/,rE:true,rB:false,cN:\"attribute\"},{b:/=/,e:/([\\u2401\\u0001])/,eE:true,eB:true,cN:\"string\"}]}],cI:true}});hljs.registerLanguage(\"mel\",function(b){return{k:\"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform\",i:\"</\",c:[b.CNM,b.ASM,b.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[b.BE]},{cN:\"variable\",v:[{b:\"\\\\$\\\\d\"},{b:\"[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},{b:\"\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\",r:0}]},b.CLCM,b.CBLCLM]}});hljs.registerLanguage(\"objectivec\",function(f){var g={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"};var h=/[a-zA-Z@][a-zA-Z0-9_]*/;var e=\"@interface @class @protocol @implementation\";return{k:g,l:h,i:\"</\",c:[f.CLCM,f.CBLCLM,f.CNM,f.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(\"+e.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",k:e,l:h,c:[f.UTM]},{cN:\"variable\",b:\"\\\\.\"+f.UIR,r:0}]}});hljs.registerLanguage(\"apache\",function(d){var c={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,c:[d.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",c]},c,d.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"livecodeserver\",function(g){var h={cN:\"variable\",b:\"\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+\",r:0};var f={cN:\"comment\",e:\"$\",v:[g.CBLCLM,g.HCM,{b:\"--\"},{b:\"[^:]//\"}]};var i=g.inherit(g.TM,{v:[{b:\"\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*\"},{b:\"\\\\b_[a-z0-9\\\\-]+\"}]});var j=g.inherit(g.TM,{b:\"\\\\b([A-Za-z0-9_\\\\-]+)\\\\b\"});return{cI:false,k:{keyword:\"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if\",constant:\"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK\",operator:\"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys\",built_in:\"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write\"},c:[h,{cN:\"keyword\",b:\"\\\\bend\\\\sif\\\\b\"},{cN:\"function\",bK:\"function\",e:\"$\",c:[h,j,g.ASM,g.QSM,g.BNM,g.CNM,i]},{cN:\"function\",bK:\"end\",e:\"$\",c:[j,i]},{cN:\"command\",bK:\"command on\",e:\"$\",c:[h,j,g.ASM,g.QSM,g.BNM,g.CNM,i]},{cN:\"command\",bK:\"end\",e:\"$\",c:[j,i]},{cN:\"preprocessor\",b:\"<\\\\?rev|<\\\\?lc|<\\\\?livecode\",r:10},{cN:\"preprocessor\",b:\"<\\\\?\"},{cN:\"preprocessor\",b:\"\\\\?>\"},f,g.ASM,g.QSM,g.BNM,g.CNM,i],i:\";$|^\\\\[|^=\"}});hljs.registerLanguage(\"glsl\",function(b){return{k:{keyword:\"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly\",built_in:\"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse\",literal:\"true false\"},i:'\"',c:[b.CLCM,b.CBLCLM,b.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"}]}});hljs.registerLanguage(\"lasso\",function(r){var t=\"[a-zA-Z_][a-zA-Z0-9_.]*\";var l=\"<\\\\?(lasso(script)?|=)\";var s=\"\\\\]|\\\\?>\";var n={literal:\"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft\",built_in:\"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited\",keyword:\"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome\"};var u={cN:\"comment\",b:\"<!--\",e:\"-->\",r:0};var k={cN:\"preprocessor\",b:\"\\\\[noprocess\\\\]\",starts:{cN:\"markup\",e:\"\\\\[/noprocess\\\\]\",rE:true,c:[u]}};var p={cN:\"preprocessor\",b:\"\\\\[/noprocess|\"+l};var m={cN:\"variable\",b:\"'\"+t+\"'\"};var o=[r.CLCM,{cN:\"javadoc\",b:\"/\\\\*\\\\*!\",e:\"\\\\*/\"},r.CBLCLM,r.inherit(r.CNM,{b:r.CNR+\"|-?(infinity|nan)\\\\b\"}),r.inherit(r.ASM,{i:null}),r.inherit(r.QSM,{i:null}),{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"variable\",v:[{b:\"[#$]\"+t},{b:\"#\",e:\"\\\\d+\",i:\"\\\\W\"}]},{cN:\"tag\",b:\"::\\\\s*\",e:t,i:\"\\\\W\"},{cN:\"attribute\",b:\"\\\\.\\\\.\\\\.|-\"+r.UIR},{cN:\"subst\",v:[{b:\"->\\\\s*\",c:[m]},{b:\":=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+\",r:0}]},{cN:\"built_in\",b:\"\\\\.\\\\.?\",r:0,c:[m]},{cN:\"class\",bK:\"define\",rE:true,e:\"\\\\(|=>\",c:[r.inherit(r.TM,{b:r.UIR+\"(=(?!>))?\"})]}];return{aliases:[\"ls\",\"lassoscript\"],cI:true,l:t+\"|&[lg]t;\",k:n,c:[{cN:\"preprocessor\",b:s,r:0,starts:{cN:\"markup\",e:\"\\\\[|\"+l,rE:true,r:0,c:[u]}},k,p,{cN:\"preprocessor\",b:\"\\\\[no_square_brackets\",starts:{e:\"\\\\[/no_square_brackets\\\\]\",l:t+\"|&[lg]t;\",k:n,c:[{cN:\"preprocessor\",b:s,r:0,starts:{cN:\"markup\",e:l,rE:true,c:[u]}},k,p].concat(o)}},{cN:\"preprocessor\",b:\"\\\\[\",r:0},{cN:\"shebang\",b:\"^#!.+lasso9\\\\b\",r:10}].concat(o)}});hljs.registerLanguage(\"mathematica\",function(b){return{aliases:[\"mma\"],l:\"(\\\\$|\\\\b)\"+b.IR+\"\\\\b\",k:\"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber\",c:[{cN:\"comment\",b:/\\(\\*/,e:/\\*\\)/},b.ASM,b.QSM,b.CNM,{cN:\"list\",b:/\\{/,e:/\\}/,i:/:/}]}});hljs.registerLanguage(\"tex\",function(f){var g={cN:\"command\",b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?\"};var h={cN:\"command\",b:\"\\\\\\\\[^a-zA-Zа-яА-я0-9]\"};var e={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{c:[{b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[g,h,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},g,h,e,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[g,h,e],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[g,h,e],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}});hljs.registerLanguage(\"cs\",function(c){var d=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield\";return{k:d,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},c.CLCM,c.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},c.ASM,c.QSM,c.CNM,{bK:\"protected public private internal\",e:/[{;=]/,k:d,c:[{bK:\"class namespace interface\",starts:{c:[c.TM]}},{b:c.IR+\"\\\\s*\\\\(\",rB:true,c:[c.TM]}]}]}});hljs.registerLanguage(\"css\",function(e){var d=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var f={cN:\"function\",b:d+\"\\\\(\",e:\"\\\\)\",c:[\"self\",e.NM,e.ASM,e.QSM]};return{cI:true,i:\"[=/|']\",c:[e.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:true,eE:true,r:0,c:[f,e.ASM,e.QSM,e.NM]}]},{cN:\"tag\",b:d,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[e.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[f,e.NM,e.QSM,e.ASM,e.CBLCLM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"python\",function(h){var i={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /};var g={cN:\"string\",c:[h.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[i],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[i],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},h.ASM,h.QSM]};var k={cN:\"number\",r:0,v:[{b:h.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:h.CNR+\"[lLjJ]?\"}]};var j={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",i,k,g]};var l={e:/:/,i:/[${=;\\n]/,c:[h.UTM,j]};return{k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[i,k,g,h.HCM,h.inherit(l,{cN:\"function\",bK:\"def\",r:10}),h.inherit(l,{cN:\"class\",bK:\"class\"}),{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"profile\",function(b){return{c:[b.CNM,{cN:\"built_in\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[b.ASM,b.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:\"ncalls tottime|10 cumtime|10 filename\",r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[b.CNM],r:10},b.ASM,b.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[b.UTM],r:0}]}});hljs.registerLanguage(\"django\",function(d){var c={cN:\"filter\",b:/\\|[A-Za-z]+\\:?/,k:\"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone\",c:[{cN:\"argument\",b:/\"/,e:/\"/},{cN:\"argument\",b:/'/,e:/'/}]};return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"template_comment\",b:/\\{%\\s*comment\\s*%}/,e:/\\{%\\s*endcomment\\s*%}/},{cN:\"template_comment\",b:/\\{#/,e:/#}/},{cN:\"template_tag\",b:/\\{%/,e:/%}/,k:\"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim\",c:[c]},{cN:\"variable\",b:/\\{\\{/,e:/}}/,c:[c]}]}});hljs.registerLanguage(\"nginx\",function(f){var d={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+f.UIR}]};var e={eW:true,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[f.HCM,{cN:\"string\",c:[f.BE,d],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:true,eE:true},{cN:\"regexp\",c:[f.BE,d],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},d]};return{c:[f.HCM,{b:f.UIR+\"\\\\s\",e:\";|{\",rB:true,c:[f.inherit(f.UTM,{starts:e})],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"smalltalk\",function(f){var e=\"[a-z][a-zA-Z0-9_]*\";var g={cN:\"char\",b:\"\\\\$.{1}\"};var h={cN:\"symbol\",b:\"#\"+f.UIR};return{k:\"self super nil true false thisContext\",c:[{cN:\"comment\",b:'\"',e:'\"'},f.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:e+\":\",r:0},f.CNM,h,g,{cN:\"localvars\",b:\"\\\\|[ ]*\"+e+\"([ ]+\"+e+\")*[ ]*\\\\|\",rB:true,e:/\\|/,i:/\\S/,c:[{b:\"(\\\\|[ ]*)?\"+e}]},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[f.ASM,g,f.CNM,h]}]}});hljs.registerLanguage(\"sql\",function(b){return{cI:true,i:/[<>]/,c:[{cN:\"operator\",b:\"\\\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\\\b(?!:)\",e:\";\",eW:true,k:{keyword:\"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database\",aggregate:\"count sum min max avg\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[b.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[b.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[b.BE]},b.CNM]},b.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}});hljs.registerLanguage(\"oxygene\",function(h){var j=\"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained\";var i={cN:\"comment\",b:\"{\",e:\"}\",r:0};var l={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var n={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]};var m={cN:\"string\",b:\"(#\\\\d+)+\"};var k={cN:\"function\",bK:\"function constructor destructor procedure method\",e:\"[:;]\",k:\"function constructor|10 destructor|10 procedure|10 method|10\",c:[h.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:j,c:[n,m]},i,l]};return{cI:true,k:j,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[i,l,h.CLCM,n,m,h.NM,k,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:j,c:[n,m,i,l,h.CLCM,k]}]}});hljs.registerLanguage(\"actionscript\",function(f){var h=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var e=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var g={cN:\"rest_arg\",b:\"[.]{3}\",e:h,r:10};return{k:{keyword:\"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with\",literal:\"true false null undefined\"},c:[f.ASM,f.QSM,f.CLCM,f.CBLCLM,f.CNM,{cN:\"package\",bK:\"package\",e:\"{\",c:[f.TM]},{cN:\"class\",bK:\"class interface\",e:\"{\",c:[{bK:\"extends implements\"},f.TM]},{cN:\"preprocessor\",bK:\"import include\",e:\";\"},{cN:\"function\",bK:\"function\",e:\"[{;]\",i:\"\\\\S\",c:[f.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[f.ASM,f.QSM,f.CLCM,f.CBLCLM,g]},{cN:\"type\",b:\":\",e:e,r:10}]}]}});hljs.registerLanguage(\"ruleslanguage\",function(b){return{k:{keyword:\"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING\",built_in:\"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME\"},c:[b.CLCM,b.CBLCLM,b.ASM,b.QSM,b.CNM,{cN:\"array\",b:\"#[a-zA-Z .]+\"}]}});hljs.registerLanguage(\"mizar\",function(b){return{k:[\"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\"thesis contradiction scheme reserve struct\",\"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\"connectedness uniqueness commutativity idempotence involutiveness projectivity\"].join(\" \"),c:[{cN:\"comment\",b:\"::\",e:\"$\"}]}});hljs.registerLanguage(\"handlebars\",function(c){var d=\"each in with if else unless bindattr action collection debugger log outlet template unbound view yield\";return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"expression\",b:\"{{\",e:\"}}\",c:[{cN:\"begin-block\",b:\"#[a-zA-Z- .]+\",k:d},{cN:\"string\",b:'\"',e:'\"'},{cN:\"end-block\",b:\"\\\\/[a-zA-Z- .]+\",k:d},{cN:\"variable\",b:\"[a-zA-Z-.]+\",k:d}]}]}});hljs.registerLanguage(\"scss\",function(g){var j=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var i={cN:\"function\",b:j+\"\\\\(\",e:\"\\\\)\",c:[\"self\",g.NM,g.ASM,g.QSM]};var f={cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"};var h={cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[i,f,g.NM,g.QSM,g.ASM,g.CBLCLM,{cN:\"important\",b:\"!important\"}]}};return{cI:true,i:\"[=/|']\",c:[g.CLCM,g.CBLCLM,{cN:\"function\",b:j+\"\\\\(\",e:\"\\\\)\",c:[\"self\",g.NM,g.ASM,g.QSM]},{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\",r:0},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",r:0},{cN:\"pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},{cN:\"attribute\",b:\"\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{cN:\"value\",b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{cN:\"value\",b:\":\",e:\";\",c:[f,g.NM,g.QSM,g.ASM,{cN:\"important\",b:\"!important\"}]},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",k:\"mixin include extend for if else each while charset import debug media page content font-face namespace warn\",c:[i,g.QSM,g.ASM,f,g.NM,{cN:\"preprocessor\",b:\"\\\\s[A-Za-z0-9_.-]+\",r:0}]}]}});hljs.registerLanguage(\"perl\",function(p){var o=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\";var m={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:o};var l={b:\"->{\",e:\"}\"};var j={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@\\*][^\\s\\w{]/,r:0}]};var n={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var k=[p.BE,m,j];var i=[j,p.HCM,n,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:true},l,{cN:\"string\",c:k,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[p.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[p.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+p.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[p.HCM,n,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[p.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];m.c=i;l.c=i;return{k:o,c:i}});hljs.registerLanguage(\"ini\",function(b){return{cI:true,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:\"on off true false yes no\",c:[b.QSM,b.NM],r:0}]}]}});hljs.registerLanguage(\"erlang\",function(w){var C=\"[a-z'][a-zA-Z0-9_']*\";var p=\"(\"+C+\":\"+C+\"|\"+C+\")\";var z={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor\",literal:\"false true\"};var t={cN:\"comment\",b:\"%\",e:\"$\",r:0};var A={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var y={b:\"fun\\\\s+\"+C+\"/\\\\d+\"};var r={b:p+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:p,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var x={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var E={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var s={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var D={b:\"#\"+w.UIR,r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+w.UIR,r:0},{b:\"{\",e:\"}\",r:0}]};var u={bK:\"fun receive if try case\",e:\"end\",k:z};u.c=[t,y,w.inherit(w.ASM,{cN:\"\"}),u,r,w.QSM,A,x,E,s,D];var v=[t,y,u,r,w.QSM,A,x,E,s,D];r.c[1].c=v;x.c=v;D.c[1].c=v;var B={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v};return{k:z,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+C+\"\\\\s*\\\\(\",e:\"->\",rB:true,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[B,w.inherit(w.TM,{b:C})],starts:{e:\";|\\\\.\",k:z,c:v}},t,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+w.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior\",c:[B]},A,w.QSM,D,E,s,x]}});hljs.registerLanguage(\"1c\",function(h){var k=\"[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*\";var n=\"возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт\";var l=\"ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон\";var i={cN:\"dquote\",b:'\"\"'};var m={cN:\"string\",b:'\"',e:'\"|$',c:[i]};var j={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[i]};return{cI:true,l:k,k:{keyword:n,built_in:l},c:[h.CLCM,h.NM,m,j,{cN:\"function\",b:\"(процедура|функция)\",e:\"$\",l:k,k:\"процедура функция\",c:[h.inherit(h.TM,{b:k}),{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:k,k:\"знач\",c:[m,j]},{cN:\"export\",b:\"экспорт\",eW:true,l:k,k:\"экспорт\",c:[h.CLCM]}]},h.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}});hljs.registerLanguage(\"haskell\",function(k){var j={cN:\"comment\",v:[{b:\"--\",e:\"$\"},{b:\"{-\",e:\"-}\",c:[\"self\"]}]};var l={cN:\"pragma\",b:\"{-#\",e:\"#-}\"};var h={cN:\"preprocessor\",b:\"^#\",e:\"$\"};var m={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var n={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[l,j,h,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},k.inherit(k.TM,{b:\"[_a-z][\\\\w']*\"})]};var i={cN:\"container\",b:\"{\",e:\"}\",c:n.c};return{k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{cN:\"module\",b:\"\\\\bmodule\\\\b\",e:\"where\",k:\"module where\",c:[n,j],i:\"\\\\W\\\\.|;\"},{cN:\"import\",b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import|0 qualified as hiding\",c:[n,j],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[m,n,j]},{cN:\"typedef\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[l,j,m,n,i]},{cN:\"default\",bK:\"default\",e:\"$\",c:[m,n,j]},{cN:\"infix\",bK:\"infix infixl infixr\",e:\"$\",c:[k.CNM,j]},{cN:\"foreign\",b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[m,k.QSM,j]},{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},l,j,h,k.QSM,k.CNM,m,k.inherit(k.TM,{b:\"^[_a-z][\\\\w']*\"}),{b:\"->|<-\"}]}});hljs.registerLanguage(\"delphi\",function(h){var i=\"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure\";var l={cN:\"comment\",v:[{b:/\\{/,e:/\\}/,r:0},{b:/\\(\\*/,e:/\\*\\)/,r:10}]};var n={cN:\"string\",b:/'/,e:/'/,c:[{b:/''/}]};var m={cN:\"string\",b:/(#\\d+)+/};var k={b:h.IR+\"\\\\s*=\\\\s*class\\\\s*\\\\(\",rB:true,c:[h.TM]};var j={cN:\"function\",bK:\"function constructor destructor procedure\",e:/[:;]/,k:\"function constructor|10 destructor|10 procedure|10\",c:[h.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:i,c:[n,m]},l]};return{cI:true,k:i,i:/(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,c:[l,h.CLCM,n,m,h.NM,k,j]}});hljs.registerLanguage(\"markdown\",function(b){return{c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,rE:true,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:true,eE:true},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:true,eE:true}],r:10},{b:\"^\\\\[.+\\\\]:\",e:\"$\",rB:true,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true},{cN:\"link_url\",b:\"\\\\s\",e:\"$\"}]}]}});hljs.registerLanguage(\"avrasm\",function(b){return{cI:true,k:{keyword:\"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr\",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf\"},c:[b.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\",r:0},b.CNM,b.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},b.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}});hljs.registerLanguage(\"lisp\",function(v){var s=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*\";var r=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var t={cN:\"shebang\",b:\"^#!\",e:\"$\"};var B={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var z={cN:\"number\",v:[{b:r,r:0},{b:\"#b[0-1]+(/[0-1]+)?\"},{b:\"#o[0-7]+(/[0-7]+)?\"},{b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{b:\"#c\\\\(\"+r+\" +\"+r,e:\"\\\\)\"}]};var w=v.inherit(v.QSM,{i:null});var p={cN:\"comment\",b:\";\",e:\"$\"};var x={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var o={cN:\"keyword\",b:\"[:&]\"+s};var A={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",B,w,z]};var C={cN:\"quoted\",c:[z,w,x,o,A],v:[{b:\"['`]\\\\(\",e:\"\\\\)\"},{b:\"\\\\(quote \",e:\"\\\\)\",k:{title:\"quote\"}}]};var u={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var y={eW:true,r:0};u.c=[{cN:\"title\",b:s},y];y.c=[C,u,B,z,w,p,x,o];return{i:/\\S/,c:[z,t,B,w,p,C,u]}});hljs.registerLanguage(\"vbnet\",function(b){return{cI:true,k:{keyword:\"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor\",built_in:\"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort\",literal:\"true false nothing\"},i:\"//|{|}|endif|gosub|variant|wend\",c:[b.inherit(b.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:\"'\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"'''|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},b.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elseif end region externalsource\"}]}});hljs.registerLanguage(\"axapta\",function(b){return{k:\"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod\",c:[b.CLCM,b.CBLCLM,b.ASM,b.QSM,b.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",bK:\"class interface\",e:\"{\",i:\":\",c:[{cN:\"inheritance\",bK:\"extends implements\",r:10},b.UTM]}]}});hljs.registerLanguage(\"ocaml\",function(b){return{k:{keyword:\"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value\",built_in:\"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string\"},i:/\\/\\//,c:[{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\"]},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[b.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},b.CBLCLM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),b.CNM]}});hljs.registerLanguage(\"erlang-repl\",function(b){return{k:{special_functions:\"spawn spawn_link self\",reserved:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"prompt\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},b.ASM,b.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}});hljs.registerLanguage(\"vala\",function(b){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface delegate namespace\",e:\"{\",i:\"[^,:\\\\n\\\\s\\\\.]\",c:[b.UTM]},b.CLCM,b.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},b.ASM,b.QSM,b.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}});hljs.registerLanguage(\"dos\",function(b){return{cI:true,k:{flow:\"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq\",keyword:\"shift cd dir echo setlocal endlocal set pause copy\",stream:\"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux\",winutils:\"ping net ipconfig taskkill xcopy ren del\"},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}});hljs.registerLanguage(\"clojure\",function(s){var y={built_in:\"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize\"};var x=\"[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$';]+\";var C=\"[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?\";var z={cN:\"number\",b:C,r:0};var t=s.inherit(s.QSM,{i:null});var k={cN:\"comment\",b:\";\",e:\"$\",r:0};var p={cN:\"collection\",b:\"[\\\\[\\\\{]\",e:\"[\\\\]\\\\}]\"};var A={cN:\"comment\",b:\"\\\\^\"+x};var B={cN:\"comment\",b:\"\\\\^\\\\{\",e:\"\\\\}\"};var v={cN:\"attribute\",b:\"[:]\"+x};var r={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var w={eW:true,k:{literal:\"true false nil\"},r:0};var u={k:y,l:x,cN:\"title\",b:x,starts:w};r.c=[{cN:\"comment\",b:\"comment\"},u,w];w.c=[r,t,A,B,k,v,p,z];p.c=[r,t,A,k,v,p,z];return{i:/\\S/,c:[k,r,{cN:\"prompt\",b:/^=> /,starts:{e:/\\n\\n|\\Z/}}]}});hljs.registerLanguage(\"go\",function(d){var c={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer\",constant:\"true false iota nil\",typename:\"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:c,i:\"</\",c:[d.CLCM,d.CBLCLM,d.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\"},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},d.CNM]}});hljs.registerLanguage(\"json\",function(h){var j={literal:\"true false null\"};var k=[h.QSM,h.CNM];var l={cN:\"value\",e:\",\",eW:true,eE:true,c:k,k:j};var g={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:true,eE:true,c:[h.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"};var i={b:\"\\\\[\",e:\"\\\\]\",c:[h.inherit(l,{cN:null})],i:\"\\\\S\"};k.splice(k.length,0,g,i);return{c:k,k:j,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(d){var f={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var e=\"assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while\";return{k:e,i:\"</\",c:[d.CLCM,d.CBLCLM,d.inherit(d.QSM,{i:null}),d.ASM,f,{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",c:[d.UTM]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{bK:\"type\",e:\"(=|<)\",c:[d.UTM],i:\"\\\\S\"},{bK:\"trait enum\",e:\"({|<)\",c:[d.UTM],i:\"\\\\S\"}]}});hljs.registerLanguage(\"java\",function(c){var d=\"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws\";return{k:d,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}],r:10},c.CLCM,c.CBLCLM,c.ASM,c.QSM,{bK:\"protected public private\",e:/[{;=]/,k:d,c:[{cN:\"class\",bK:\"class interface\",eW:true,i:/[:\"<>]/,c:[{bK:\"extends implements\",r:10},c.UTM]},{b:c.UIR+\"\\\\s*\\\\(\",rB:true,c:[c.UTM]}]},c.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"lua\",function(f){var g=\"\\\\[=*\\\\[\";var h=\"\\\\]=*\\\\]\";var j={b:g,e:h,c:[\"self\"]};var i=[{cN:\"comment\",b:\"--(?!\"+g+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+g,e:h,c:[j],r:10}];return{l:f.UIR,k:{keyword:\"and break do else elseif end false for if in local nil not or repeat return then true until while\",built_in:\"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table\"},c:i.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[f.inherit(f.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:true,c:i}].concat(i)},f.CNM,f.ASM,f.QSM,{cN:\"string\",b:g,e:h,c:[j],r:10}])}});hljs.registerLanguage(\"rsl\",function(b){return{k:{keyword:\"float color point normal vector matrix while for if do return else break extern continue\",built_in:\"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp\"},i:\"</\",c:[b.CLCM,b.CBLCLM,b.QSM,b.ASM,b.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",bK:\"surface displacement light volume imager\",e:\"\\\\(\"},{cN:\"shading\",bK:\"illuminate illuminance gather\",e:\"\\\\(\"}]}});hljs.registerLanguage(\"d\",function(C){var Y={keyword:\"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__\",built_in:\"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring\",literal:\"false null true\"};var X=\"(0|[1-9][\\\\d_]*)\",J=\"(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)\",S=\"0[bB][01_]+\",E=\"([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)\",B=\"0[xX]\"+E,K=\"([eE][+-]?\"+J+\")\",L=\"(\"+J+\"(\\\\.\\\\d*|\"+K+\")|\\\\d+\\\\.\"+J+J+\"|\\\\.\"+X+K+\"?)\",P=\"(0[xX](\"+E+\"\\\\.\"+E+\"|\\\\.?\"+E+\")[pP][+-]?\"+J+\")\",O=\"(\"+X+\"|\"+S+\"|\"+B+\")\",M=\"(\"+P+\"|\"+L+\")\";var A=\"\\\\\\\\(['\\\"\\\\?\\\\\\\\abfnrtv]|u[\\\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\\\dA-Fa-f]{2}|U[\\\\dA-Fa-f]{8})|&[a-zA-Z\\\\d]{2,};\";var N={cN:\"number\",b:\"\\\\b\"+O+\"(L|u|U|Lu|LU|uL|UL)?\",r:0};var Q={cN:\"number\",b:\"\\\\b(\"+M+\"([fF]|L|i|[fF]i|Li)?|\"+O+\"(i|[fF]i|Li))\",r:0};var H={cN:\"string\",b:\"'(\"+A+\"|.)\",e:\"'\",i:\".\"};var I={b:A,r:0};var D={cN:\"string\",b:'\"',c:[I],e:'\"[cwd]?'};var U={cN:\"string\",b:'[rq]\"',e:'\"[cwd]?',r:5};var F={cN:\"string\",b:\"`\",e:\"`[cwd]?\"};var R={cN:\"string\",b:'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',r:10};var G={cN:\"string\",b:'q\"\\\\{',e:'\\\\}\"'};var V={cN:\"shebang\",b:\"^#!\",e:\"$\",r:5};var T={cN:\"preprocessor\",b:\"#(line)\",e:\"$\",r:5};var W={cN:\"keyword\",b:\"@[a-zA-Z_][a-zA-Z_\\\\d]*\"};var Z={cN:\"comment\",b:\"\\\\/\\\\+\",c:[\"self\"],e:\"\\\\+\\\\/\",r:10};return{l:C.UIR,k:Y,c:[C.CLCM,C.CBLCLM,Z,R,D,U,F,G,Q,N,H,V,T,W]}});hljs.registerLanguage(\"javascript\",function(b){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require\"},c:[{cN:\"pi\",b:/^\\s*('|\")use strict('|\")/,r:10},b.ASM,b.QSM,b.CLCM,b.CBLCLM,b.CNM,{b:\"(\"+b.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[b.CLCM,b.CBLCLM,b.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,c:[b.inherit(b.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[b.CLCM,b.CBLCLM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+b.IR,r:0}]}});hljs.registerLanguage(\"r\",function(d){var c=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[d.HCM,{b:c,l:c,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},r:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",r:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{b:\"`\",e:\"`\",r:0},{cN:\"string\",c:[d.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"ruby\",function(n){var k=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var l=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\";var s={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var j={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[s]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[s],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]};var p={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:l};var o={cN:\"string\",c:[n.BE,p],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:\"%[qw]?\\\\(\",e:\"\\\\)\"},{b:\"%[qw]?\\\\[\",e:\"\\\\]\"},{b:\"%[qw]?{\",e:\"}\"},{b:\"%[qw]?<\",e:\">\",r:10},{b:\"%[qw]?/\",e:\"/\",r:10},{b:\"%[qw]?%\",e:\"%\",r:10},{b:\"%[qw]?-\",e:\"-\",r:10},{b:\"%[qw]?\\\\|\",e:\"\\\\|\",r:10},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]};var r={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:l};var m=[o,j,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[n.inherit(n.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+n.IR+\"::)?\"+n.IR}]},j]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[n.inherit(n.TM,{b:k}),r,j]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:[o,{b:k}],r:0},{cN:\"symbol\",b:n.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+n.RSR+\")\\\\s*\",c:[j,{cN:\"regexp\",c:[n.BE,p],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];p.c=m;r.c=m;return{k:l,c:m}});hljs.registerLanguage(\"haml\",function(b){return{cI:true,c:[{cN:\"doctype\",b:\"^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$\",r:10},{cN:\"comment\",b:\"^\\\\s*(!=#|=#|-#|/).*$\",r:0},{b:\"^\\\\s*(-|=|!=)(?!#)\",starts:{e:\"\\\\n\",sL:\"ruby\"}},{cN:\"tag\",b:\"^\\\\s*%\",c:[{cN:\"title\",b:\"\\\\w+\"},{cN:\"value\",b:\"[#\\\\.]\\\\w+\"},{b:\"{\\\\s*\",e:\"\\\\s*}\",eE:true,c:[{b:\":\\\\w+\\\\s*=>\",e:\",\\\\s+\",rB:true,eW:true,c:[{cN:\"symbol\",b:\":\\\\w+\"},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]}]},{b:\"\\\\(\\\\s*\",e:\"\\\\s*\\\\)\",eE:true,c:[{b:\"\\\\w+\\\\s*=\",e:\"\\\\s+\",rB:true,eW:true,c:[{cN:\"attribute\",b:\"\\\\w+\",r:0},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]}]}]},{cN:\"bullet\",b:\"^\\\\s*[=~]\\\\s*\",r:0},{b:\"#{\",starts:{e:\"}\",sL:\"ruby\"}}]}});hljs.registerLanguage(\"brainfuck\",function(c){var d={cN:\"literal\",b:\"[\\\\+\\\\-]\",r:0};return{c:[{cN:\"comment\",b:\"[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",rE:true,e:\"[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",r:0},{cN:\"title\",b:\"[\\\\[\\\\]]\",r:0},{cN:\"string\",b:\"[\\\\.,]\",r:0},{b:/\\+\\+|\\-\\-/,rB:true,c:[d]},d]}});hljs.registerLanguage(\"matlab\",function(d){var c=[d.CNM,{cN:\"string\",b:\"'\",e:\"'\",c:[d.BE,{b:\"''\"}]}];return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson\"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[d.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",c:c,r:0},{cN:\"cell\",b:\"\\\\{\",e:\"\\\\}'*[\\\\.']*\",c:c,i:/:/},{cN:\"comment\",b:\"\\\\%\",e:\"$\"}].concat(c)}});hljs.registerLanguage(\"vbscript\",function(b){return{cI:true,k:{keyword:\"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto\",built_in:\"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err\",literal:\"true false null nothing empty\"},i:\"//\",c:[b.inherit(b.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:/'/,e:/$/,r:0},b.CNM]}});hljs.registerLanguage(\"fsharp\",function(b){return{k:\"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield\",c:[{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\"},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[b.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},{cN:\"attribute\",b:\"\\\\B('[A-Za-z])\\\\b\",c:[b.BE]},b.CLCM,b.inherit(b.QSM,{i:null}),b.CNM]}});hljs.registerLanguage(\"makefile\",function(d){var c={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[d.BE]};return{c:[d.HCM,{b:/^\\w+\\s*\\W*=/,rB:true,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:true,starts:{e:/$/,r:0,c:[c]}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,c:[d.QSM,c]}]}});hljs.registerLanguage(\"diff\",function(b){return{c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"rib\",function(b){return{k:\"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd\",i:\"</\",c:[b.HCM,b.CNM,b.ASM,b.QSM]}});hljs.registerLanguage(\"http\",function(b){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:true,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:true,eE:true}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:true,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:true}}]}});hljs.registerLanguage(\"autohotkey\",function(e){var g={cN:\"escape\",b:\"`[\\\\s\\\\S]\"};var h={cN:\"comment\",b:\";\",e:\"$\",r:0};var f=[{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{cN:\"built_in\",bK:\"ComSpec Clipboard ClipboardAll ErrorLevel\"}];return{cI:true,k:{keyword:\"Break Continue Else Gosub If Loop Return While\",literal:\"A true false NOT AND OR\"},c:f.concat([g,e.inherit(e.QSM,{c:[g]}),h,{cN:\"number\",b:e.NR,r:0},{cN:\"var_expand\",b:\"%\",e:\"%\",i:\"\\\\n\",c:[g]},{cN:\"label\",c:[g],v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',r:0}]},{b:\",\\\\s*,\",r:10}])}});hljs.registerLanguage(\"php\",function(f){var h={cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"};var g={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/};var j={cN:\"string\",c:[f.BE,g],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},f.inherit(f.ASM,{i:null}),f.inherit(f.QSM,{i:null})]};var i={v:[f.BNM,f.CNM]};return{cI:true,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[f.CLCM,f.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},g]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:true,k:\"__halt_compiler\",l:f.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[f.BE]},g,h,{cN:\"function\",bK:\"function\",e:/[;{]/,i:\"\\\\$|\\\\[|%\",c:[f.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",h,f.CBLCLM,j,i]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\",r:10},f.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[f.UTM]},{bK:\"use\",e:\";\",c:[f.UTM]},{b:\"=>\"},j,i]}});hljs.registerLanguage(\"cmake\",function(b){return{cI:true,k:{keyword:\"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or\",operator:\"equal less greater strless strgreater strequal matches\"},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},b.HCM,b.QSM,b.NM]}});hljs.registerLanguage(\"bash\",function(e){var f={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]};var g={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,f,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};var h={cN:\"string\",b:/'/,e:/'/};return{l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for break continue while in do done exit return set declare case esac export exec\",literal:\"true false\",built_in:\"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:true,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,e.NM,g,h,f]}});hljs.registerLanguage(\"applescript\",function(f){var e=f.inherit(f.QSM,{i:\"\"});var g={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",f.CNM,e]};var h=[{cN:\"comment\",b:\"--\",e:\"$\"},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\",{b:\"--\",e:\"$\"}]},f.HCM];return{k:{keyword:\"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without\",constant:\"AppleScript false linefeed return pi quote result space tab true\",type:\"alias application boolean class constant date file integer list number real record string text\",command:\"activate beep count delay launch log offset read round run say summarize write\",property:\"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year\"},c:[e,f.CNM,{cN:\"type\",b:\"\\\\bPOSIX file\\\\b\"},{cN:\"command\",b:\"\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\\\b|^\\\\s*return\\\\b\"},{cN:\"constant\",b:\"\\\\b(text item delimiters|current application|missing value)\\\\b\"},{cN:\"keyword\",b:\"\\\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\\\b\"},{cN:\"property\",b:\"\\\\b(POSIX path|(date|time) string|quoted form)\\\\b\"},{cN:\"function_start\",bK:\"on\",i:\"[${=;\\\\n]\",c:[f.UTM,g]}].concat(h),i:\"//\"}});hljs.registerLanguage(\"vhdl\",function(b){return{cI:true,k:{keyword:\"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor\",typename:\"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector\"},i:\"{\",c:[b.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"},b.QSM,b.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)'\",c:[b.BE]},{cN:\"attribute\",b:\"'[A-Za-z](_?[A-Za-z0-9])*\",c:[b.BE]}]}});hljs.registerLanguage(\"parser3\",function(b){return{sL:\"xml\",r:0,c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},b.CNM]}});hljs.registerLanguage(\"scala\",function(e){var f={cN:\"annotation\",b:\"@[A-Za-z]+\"};var d={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{k:\"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws\",c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},e.CLCM,e.CBLCLM,d,e.ASM,e.QSM,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:\"case class trait object\",c:[{bK:\"extends with\",r:10},e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[e.ASM,e.QSM,d,f]}]},e.CNM,f]}});hljs.registerLanguage(\"cpp\",function(d){var c={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\"],k:c,i:\"</\",c:[d.CLCM,d.CBLCLM,d.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},d.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{b:\"include\\\\s*<\",e:\">\",i:\"\\\\n\"},d.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:c,r:10,c:[\"self\"]}]}});\n/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Released under the MIT license\n */\n(function(a){if(typeof define===\"function\"&&define.amd){define([\"jquery\"],a)}else{if(typeof exports===\"object\"){a(require(\"jquery\"))}else{a(jQuery)}}}(function(f){var a=/\\+/g;function d(i){return b.raw?i:encodeURIComponent(i)}function g(i){return b.raw?i:decodeURIComponent(i)}function h(i){return d(b.json?JSON.stringify(i):String(i))}function c(i){if(i.indexOf('\"')===0){i=i.slice(1,-1).replace(/\\\\\"/g,'\"').replace(/\\\\\\\\/g,\"\\\\\")}try{i=decodeURIComponent(i.replace(a,\" \"));return b.json?JSON.parse(i):i}catch(j){}}function e(j,i){var k=b.raw?j:c(j);return f.isFunction(i)?i(k):k}var b=f.cookie=function(r,p,w){if(p!==undefined&&!f.isFunction(p)){w=f.extend({},b.defaults,w);if(typeof w.expires===\"number\"){var s=w.expires,v=w.expires=new Date();v.setTime(+v+s*86400000)}return(document.cookie=[d(r),\"=\",h(p),w.expires?\"; expires=\"+w.expires.toUTCString():\"\",w.path?\"; path=\"+w.path:\"\",w.domain?\"; domain=\"+w.domain:\"\",w.secure?\"; secure\":\"\"].join(\"\"))}var x=r?undefined:{};var u=document.cookie?document.cookie.split(\"; \"):[];for(var o=0,m=u.length;o<m;o++){var n=u[o].split(\"=\");var j=g(n.shift());var k=n.join(\"=\");if(r&&r===j){x=e(k,p);break}if(!r&&(k=e(k))!==undefined){x[j]=k}}return x};b.defaults={};f.removeCookie=function(j,i){if(f.cookie(j)===undefined){return false}f.cookie(j,\"\",f.extend({},i,{expires:-1}));return !f.cookie(j)}}));$(\".details-caret\").click(function(){var a=$(this).parent(\"tr\");if(a.hasClass(\"details-open\")){a.removeClass(\"details-open\");a.addClass(\"details-closed\")}else{a.removeClass(\"details-closed\");a.addClass(\"details-open\")}});function apidocs_iframe(){if(window.location.pathname==\"/docs/API_Reference/api_v3.html\"||window.location.pathname==\"/API_Reference/api_v3.html\"){var b=window.location.hash;$(\"#content .iframe-container\").html(\"\");var a=\"https://sendgrid.api-docs.io/v3.0\";if(b){a+=\"/\"+b.replace(\"#\",\"\")}$(\"#content .iframe-container\").html($('<iframe frameborder=\"0\" width=\"1500\" height=\"1000\"></iframe>').attr(\"src\",a))}}$().ready(function(){apidocs_iframe()});"
  },
  {
    "path": "static/assets/global-ecc286f800632a989058f964b0d52b7a.css",
    "content": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"javascript:\"]:after,a[href^=\"#\"]:after{content:\"\"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:\"Open Sans\",Helvetica,Arial,sans-serif;font-size:16px;line-height:1.5;color:#294762;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#489be8;text-decoration:none}a:hover,a:focus{color:#1a82e2;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:4px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:24px;margin-bottom:24px;border:0;border-top:1px solid #fbfbfc}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:\"Open Sans\",Helvetica,Arial,sans-serif;font-weight:inherit;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#fbfbfc}h1,.h1,h2,.h2,h3,.h3{margin-top:24px;margin-bottom:12px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:12px;margin-bottom:12px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:34px}h2,.h2{font-size:24px}h3,.h3{font-size:20px}h4,.h4{font-size:16px}h5,.h5{font-size:13px}h6,.h6{font-size:16px}p{margin:0 0 12px}.lead{margin-bottom:24px;font-size:18px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:24px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#fbfbfc}.text-primary{color:#1a82e2}a.text-primary:hover{color:#1568b4}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#1a82e2}a.bg-primary:hover{background-color:#1568b4}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:11px;margin:48px 0 24px;border-bottom:1px solid none}ul,ol{margin-top:0;margin-bottom:12px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:24px}dt,dd{line-height:1.5}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #fbfbfc}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:12px 24px;margin:0 0 24px;font-size:20px;border-left:5px solid #fbfbfc}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.5;color:#fbfbfc}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\\2014 \\00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #fbfbfc;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\\00A0 \\2014'}blockquote:before,blockquote:after{content:\"\"}address{margin-bottom:24px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace}code{padding:2px 4px;font-size:90%;color:#005aa4;background-color:#f2f2f9;white-space:nowrap;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:1px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:11.5px;margin:0 0 12px;font-size:15px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:24px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.5;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=\"col-\"]{position:static;float:none;display:table-column}table td[class*=\"col-\"],table th[class*=\"col-\"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media(max-width:768px - 1){.table-responsive{width:100%;margin-bottom:18px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:24px;font-size:24px;line-height:inherit;color:#294762;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type=\"search\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=\"radio\"],input[type=\"checkbox\"]{margin:4px 0 0;margin-top:1px \\9;line-height:normal}input[type=\"file\"]{display:block}input[type=\"range\"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=\"file\"]:focus,input[type=\"radio\"]:focus,input[type=\"checkbox\"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:16px;line-height:1.5;color:#294762}.form-control{display:block;width:100%;height:38px;padding:6px 12px;font-size:16px;line-height:1.5;color:#294762;background-color:#fff;background-image:none;border:1px solid rgba(41,71,98,0.2);border-radius:none;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#1a82e2;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(26,130,226,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(26,130,226,0.6)}.form-control::-moz-placeholder{color:rgba(41,71,98,0.2);opacity:1}.form-control:-ms-input-placeholder{color:rgba(41,71,98,0.2)}.form-control::-webkit-input-placeholder{color:rgba(41,71,98,0.2)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:rgba(158,158,158,0.4);opacity:1}textarea.form-control{height:auto}input[type=\"search\"]{-webkit-appearance:none}input[type=\"date\"]{line-height:38px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:24px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type=\"radio\"],.radio-inline input[type=\"radio\"],.checkbox input[type=\"checkbox\"],.checkbox-inline input[type=\"checkbox\"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=\"radio\"][disabled],input[type=\"checkbox\"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=\"radio\"],fieldset[disabled] input[type=\"checkbox\"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:1px}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:49px;padding:10px 16px;font-size:20px;line-height:1.33;border-radius:4px}select.input-lg{height:49px;line-height:49px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.has-feedback .form-control-feedback{position:absolute;top:29px;right:0;display:block;width:38px;height:38px;line-height:38px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#5388b7}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=\"radio\"],.form-inline .checkbox input[type=\"checkbox\"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:31px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:16px;line-height:1.5;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#fff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#fff;background-color:rgba(26,130,226,0.8);border-color:#1a82e2}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#fff;background-color:rgba(22,109,189,0.8);border-color:#1462ab}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:rgba(26,130,226,0.8);border-color:#1a82e2}.btn-default .badge{color:rgba(26,130,226,0.8);background-color:#fff}.btn-primary{color:#fff;background-color:rgba(26,130,226,0.8);border-color:#1a82e2}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(22,109,189,0.8);border-color:#1462ab}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:rgba(26,130,226,0.8);border-color:#1a82e2}.btn-primary .badge{color:rgba(26,130,226,0.8);background-color:#fff}.btn-success{color:#fff;background-color:rgba(24,201,110,0.8);border-color:#18c96e}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(20,165,90,0.8);border-color:#119250}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:rgba(24,201,110,0.8);border-color:#18c96e}.btn-success .badge{color:rgba(24,201,110,0.8);background-color:#fff}.btn-info{color:#fff;background-color:rgba(0,188,212,0.8);border-color:#00bcd4}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:rgba(0,152,171,0.8);border-color:#008697}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:rgba(0,188,212,0.8);border-color:#00bcd4}.btn-info .badge{color:rgba(0,188,212,0.8);background-color:#fff}.btn-warning{color:#fff;background-color:rgba(255,153,0,0.8);border-color:#f90}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(214,129,0,0.8);border-color:#c27400}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:rgba(255,153,0,0.8);border-color:#f90}.btn-warning .badge{color:rgba(255,153,0,0.8);background-color:#fff}.btn-danger{color:#fff;background-color:rgba(183,28,28,0.8);border-color:#b71c1c}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(148,23,23,0.8);border-color:#821414}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:rgba(183,28,28,0.8);border-color:#b71c1c}.btn-danger .badge{color:rgba(183,28,28,0.8);background-color:#fff}.btn-link{color:#489be8;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#1a82e2;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:rgba(158,158,158,0.5);text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:20px;line-height:1.33;border-radius:4px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:1px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:1px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=\"submit\"].btn-block,input[type=\"reset\"].btn-block,input[type=\"button\"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot');src:url('../bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'),url('../bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:\"\\2a\"}.glyphicon-plus:before{content:\"\\2b\"}.glyphicon-euro:before{content:\"\\20ac\"}.glyphicon-minus:before{content:\"\\2212\"}.glyphicon-cloud:before{content:\"\\2601\"}.glyphicon-envelope:before{content:\"\\2709\"}.glyphicon-pencil:before{content:\"\\270f\"}.glyphicon-glass:before{content:\"\\e001\"}.glyphicon-music:before{content:\"\\e002\"}.glyphicon-search:before{content:\"\\e003\"}.glyphicon-heart:before{content:\"\\e005\"}.glyphicon-star:before{content:\"\\e006\"}.glyphicon-star-empty:before{content:\"\\e007\"}.glyphicon-user:before{content:\"\\e008\"}.glyphicon-film:before{content:\"\\e009\"}.glyphicon-th-large:before{content:\"\\e010\"}.glyphicon-th:before{content:\"\\e011\"}.glyphicon-th-list:before{content:\"\\e012\"}.glyphicon-ok:before{content:\"\\e013\"}.glyphicon-remove:before{content:\"\\e014\"}.glyphicon-zoom-in:before{content:\"\\e015\"}.glyphicon-zoom-out:before{content:\"\\e016\"}.glyphicon-off:before{content:\"\\e017\"}.glyphicon-signal:before{content:\"\\e018\"}.glyphicon-cog:before{content:\"\\e019\"}.glyphicon-trash:before{content:\"\\e020\"}.glyphicon-home:before{content:\"\\e021\"}.glyphicon-file:before{content:\"\\e022\"}.glyphicon-time:before{content:\"\\e023\"}.glyphicon-road:before{content:\"\\e024\"}.glyphicon-download-alt:before{content:\"\\e025\"}.glyphicon-download:before{content:\"\\e026\"}.glyphicon-upload:before{content:\"\\e027\"}.glyphicon-inbox:before{content:\"\\e028\"}.glyphicon-play-circle:before{content:\"\\e029\"}.glyphicon-repeat:before{content:\"\\e030\"}.glyphicon-refresh:before{content:\"\\e031\"}.glyphicon-list-alt:before{content:\"\\e032\"}.glyphicon-lock:before{content:\"\\e033\"}.glyphicon-flag:before{content:\"\\e034\"}.glyphicon-headphones:before{content:\"\\e035\"}.glyphicon-volume-off:before{content:\"\\e036\"}.glyphicon-volume-down:before{content:\"\\e037\"}.glyphicon-volume-up:before{content:\"\\e038\"}.glyphicon-qrcode:before{content:\"\\e039\"}.glyphicon-barcode:before{content:\"\\e040\"}.glyphicon-tag:before{content:\"\\e041\"}.glyphicon-tags:before{content:\"\\e042\"}.glyphicon-book:before{content:\"\\e043\"}.glyphicon-bookmark:before{content:\"\\e044\"}.glyphicon-print:before{content:\"\\e045\"}.glyphicon-camera:before{content:\"\\e046\"}.glyphicon-font:before{content:\"\\e047\"}.glyphicon-bold:before{content:\"\\e048\"}.glyphicon-italic:before{content:\"\\e049\"}.glyphicon-text-height:before{content:\"\\e050\"}.glyphicon-text-width:before{content:\"\\e051\"}.glyphicon-align-left:before{content:\"\\e052\"}.glyphicon-align-center:before{content:\"\\e053\"}.glyphicon-align-right:before{content:\"\\e054\"}.glyphicon-align-justify:before{content:\"\\e055\"}.glyphicon-list:before{content:\"\\e056\"}.glyphicon-indent-left:before{content:\"\\e057\"}.glyphicon-indent-right:before{content:\"\\e058\"}.glyphicon-facetime-video:before{content:\"\\e059\"}.glyphicon-picture:before{content:\"\\e060\"}.glyphicon-map-marker:before{content:\"\\e062\"}.glyphicon-adjust:before{content:\"\\e063\"}.glyphicon-tint:before{content:\"\\e064\"}.glyphicon-edit:before{content:\"\\e065\"}.glyphicon-share:before{content:\"\\e066\"}.glyphicon-check:before{content:\"\\e067\"}.glyphicon-move:before{content:\"\\e068\"}.glyphicon-step-backward:before{content:\"\\e069\"}.glyphicon-fast-backward:before{content:\"\\e070\"}.glyphicon-backward:before{content:\"\\e071\"}.glyphicon-play:before{content:\"\\e072\"}.glyphicon-pause:before{content:\"\\e073\"}.glyphicon-stop:before{content:\"\\e074\"}.glyphicon-forward:before{content:\"\\e075\"}.glyphicon-fast-forward:before{content:\"\\e076\"}.glyphicon-step-forward:before{content:\"\\e077\"}.glyphicon-eject:before{content:\"\\e078\"}.glyphicon-chevron-left:before{content:\"\\e079\"}.glyphicon-chevron-right:before{content:\"\\e080\"}.glyphicon-plus-sign:before{content:\"\\e081\"}.glyphicon-minus-sign:before{content:\"\\e082\"}.glyphicon-remove-sign:before{content:\"\\e083\"}.glyphicon-ok-sign:before{content:\"\\e084\"}.glyphicon-question-sign:before{content:\"\\e085\"}.glyphicon-info-sign:before{content:\"\\e086\"}.glyphicon-screenshot:before{content:\"\\e087\"}.glyphicon-remove-circle:before{content:\"\\e088\"}.glyphicon-ok-circle:before{content:\"\\e089\"}.glyphicon-ban-circle:before{content:\"\\e090\"}.glyphicon-arrow-left:before{content:\"\\e091\"}.glyphicon-arrow-right:before{content:\"\\e092\"}.glyphicon-arrow-up:before{content:\"\\e093\"}.glyphicon-arrow-down:before{content:\"\\e094\"}.glyphicon-share-alt:before{content:\"\\e095\"}.glyphicon-resize-full:before{content:\"\\e096\"}.glyphicon-resize-small:before{content:\"\\e097\"}.glyphicon-exclamation-sign:before{content:\"\\e101\"}.glyphicon-gift:before{content:\"\\e102\"}.glyphicon-leaf:before{content:\"\\e103\"}.glyphicon-fire:before{content:\"\\e104\"}.glyphicon-eye-open:before{content:\"\\e105\"}.glyphicon-eye-close:before{content:\"\\e106\"}.glyphicon-warning-sign:before{content:\"\\e107\"}.glyphicon-plane:before{content:\"\\e108\"}.glyphicon-calendar:before{content:\"\\e109\"}.glyphicon-random:before{content:\"\\e110\"}.glyphicon-comment:before{content:\"\\e111\"}.glyphicon-magnet:before{content:\"\\e112\"}.glyphicon-chevron-up:before{content:\"\\e113\"}.glyphicon-chevron-down:before{content:\"\\e114\"}.glyphicon-retweet:before{content:\"\\e115\"}.glyphicon-shopping-cart:before{content:\"\\e116\"}.glyphicon-folder-close:before{content:\"\\e117\"}.glyphicon-folder-open:before{content:\"\\e118\"}.glyphicon-resize-vertical:before{content:\"\\e119\"}.glyphicon-resize-horizontal:before{content:\"\\e120\"}.glyphicon-hdd:before{content:\"\\e121\"}.glyphicon-bullhorn:before{content:\"\\e122\"}.glyphicon-bell:before{content:\"\\e123\"}.glyphicon-certificate:before{content:\"\\e124\"}.glyphicon-thumbs-up:before{content:\"\\e125\"}.glyphicon-thumbs-down:before{content:\"\\e126\"}.glyphicon-hand-right:before{content:\"\\e127\"}.glyphicon-hand-left:before{content:\"\\e128\"}.glyphicon-hand-up:before{content:\"\\e129\"}.glyphicon-hand-down:before{content:\"\\e130\"}.glyphicon-circle-arrow-right:before{content:\"\\e131\"}.glyphicon-circle-arrow-left:before{content:\"\\e132\"}.glyphicon-circle-arrow-up:before{content:\"\\e133\"}.glyphicon-circle-arrow-down:before{content:\"\\e134\"}.glyphicon-globe:before{content:\"\\e135\"}.glyphicon-wrench:before{content:\"\\e136\"}.glyphicon-tasks:before{content:\"\\e137\"}.glyphicon-filter:before{content:\"\\e138\"}.glyphicon-briefcase:before{content:\"\\e139\"}.glyphicon-fullscreen:before{content:\"\\e140\"}.glyphicon-dashboard:before{content:\"\\e141\"}.glyphicon-paperclip:before{content:\"\\e142\"}.glyphicon-heart-empty:before{content:\"\\e143\"}.glyphicon-link:before{content:\"\\e144\"}.glyphicon-phone:before{content:\"\\e145\"}.glyphicon-pushpin:before{content:\"\\e146\"}.glyphicon-usd:before{content:\"\\e148\"}.glyphicon-gbp:before{content:\"\\e149\"}.glyphicon-sort:before{content:\"\\e150\"}.glyphicon-sort-by-alphabet:before{content:\"\\e151\"}.glyphicon-sort-by-alphabet-alt:before{content:\"\\e152\"}.glyphicon-sort-by-order:before{content:\"\\e153\"}.glyphicon-sort-by-order-alt:before{content:\"\\e154\"}.glyphicon-sort-by-attributes:before{content:\"\\e155\"}.glyphicon-sort-by-attributes-alt:before{content:\"\\e156\"}.glyphicon-unchecked:before{content:\"\\e157\"}.glyphicon-expand:before{content:\"\\e158\"}.glyphicon-collapse-down:before{content:\"\\e159\"}.glyphicon-collapse-up:before{content:\"\\e160\"}.glyphicon-log-in:before{content:\"\\e161\"}.glyphicon-flash:before{content:\"\\e162\"}.glyphicon-log-out:before{content:\"\\e163\"}.glyphicon-new-window:before{content:\"\\e164\"}.glyphicon-record:before{content:\"\\e165\"}.glyphicon-save:before{content:\"\\e166\"}.glyphicon-open:before{content:\"\\e167\"}.glyphicon-saved:before{content:\"\\e168\"}.glyphicon-import:before{content:\"\\e169\"}.glyphicon-export:before{content:\"\\e170\"}.glyphicon-send:before{content:\"\\e171\"}.glyphicon-floppy-disk:before{content:\"\\e172\"}.glyphicon-floppy-saved:before{content:\"\\e173\"}.glyphicon-floppy-remove:before{content:\"\\e174\"}.glyphicon-floppy-save:before{content:\"\\e175\"}.glyphicon-floppy-open:before{content:\"\\e176\"}.glyphicon-credit-card:before{content:\"\\e177\"}.glyphicon-transfer:before{content:\"\\e178\"}.glyphicon-cutlery:before{content:\"\\e179\"}.glyphicon-header:before{content:\"\\e180\"}.glyphicon-compressed:before{content:\"\\e181\"}.glyphicon-earphone:before{content:\"\\e182\"}.glyphicon-phone-alt:before{content:\"\\e183\"}.glyphicon-tower:before{content:\"\\e184\"}.glyphicon-stats:before{content:\"\\e185\"}.glyphicon-sd-video:before{content:\"\\e186\"}.glyphicon-hd-video:before{content:\"\\e187\"}.glyphicon-subtitles:before{content:\"\\e188\"}.glyphicon-sound-stereo:before{content:\"\\e189\"}.glyphicon-sound-dolby:before{content:\"\\e190\"}.glyphicon-sound-5-1:before{content:\"\\e191\"}.glyphicon-sound-6-1:before{content:\"\\e192\"}.glyphicon-sound-7-1:before{content:\"\\e193\"}.glyphicon-copyright-mark:before{content:\"\\e194\"}.glyphicon-registration-mark:before{content:\"\\e195\"}.glyphicon-cloud-download:before{content:\"\\e197\"}.glyphicon-cloud-upload:before{content:\"\\e198\"}.glyphicon-tree-conifer:before{content:\"\\e199\"}.glyphicon-tree-deciduous:before{content:\"\\e200\"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:16px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:11px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.5;color:rgba(41,71,98,0.6);white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#294762;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#1a82e2}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#fbfbfc}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.5;color:#fbfbfc}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:\"\"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:2px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=\"buttons\"]>.btn>input[type=\"radio\"],[data-toggle=\"buttons\"]>.btn>input[type=\"checkbox\"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=\"col-\"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:49px;padding:10px 16px;font-size:20px;line-height:1.33;border-radius:4px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:49px;line-height:49px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:16px;font-weight:normal;line-height:1;color:#294762;text-align:center;background-color:none;border:1px solid rgba(41,71,98,0.2);border-radius:2px}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:1px}.input-group-addon.input-lg{padding:10px 16px;font-size:20px;border-radius:4px}.input-group-addon input[type=\"radio\"],.input-group-addon input[type=\"checkbox\"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:12px 16px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:transparent}.nav>li.disabled>a{color:rgba(158,158,158,0.5)}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:rgba(158,158,158,0.5);text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:transparent;border-color:#489be8}.nav .nav-divider{height:1px;margin:11px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#fbfbfc #fbfbfc #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ececed;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#1a82e2}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:74px;margin-bottom:none;border:1px solid transparent}@media(min-width:768px){.navbar{border-radius:none}}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:none;overflow-x:visible;padding-right:12px;padding-left:12px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-12px;margin-left:-12px}@media(min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:12px 12px;font-size:20px;line-height:24px;height:74px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-12px}}.navbar-toggle{position:relative;float:right;margin-right:12px;padding:9px 10px;margin-top:20px;margin-bottom:20px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:2px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:6px -12px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:24px}@media(max-width:768px - 1){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:24px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12px;padding-bottom:12px}.navbar-nav.navbar-right:last-child{margin-right:-12px}}@media(min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-12px;margin-right:-12px;padding:10px 12px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:18px;margin-bottom:18px}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=\"radio\"],.navbar-form .checkbox input[type=\"checkbox\"]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media(max-width:768px - 1){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-12px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:18px;margin-bottom:18px}.navbar-btn.btn-sm{margin-top:21.5px;margin-bottom:21.5px}.navbar-btn.btn-xs{margin-top:26px;margin-bottom:26px}.navbar-text{margin-top:25px;margin-bottom:25px}@media(min-width:768px){.navbar-text{float:left;margin-left:12px;margin-right:12px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#fbfbfc;border-color:#ececed}.navbar-default .navbar-brand{color:rgba(41,70,97,0.8)}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:rgba(26,44,61,0.8);background-color:transparent}.navbar-default .navbar-text{color:#294762}.navbar-default .navbar-nav>li>a{color:rgba(41,70,97,0.8)}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#1a82e2;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#1a82e2;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:rgba(158,158,158,0.5);background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#ececed}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#1a82e2}@media(max-width:768px - 1){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:rgba(41,70,97,0.8)}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#1a82e2;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#1a82e2;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:rgba(158,158,158,0.5);background-color:transparent}}.navbar-default .navbar-link{color:rgba(41,70,97,0.8)}.navbar-default .navbar-link:hover{color:#1a82e2}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#fbfbfc}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#fbfbfc}.navbar-inverse .navbar-nav>li>a{color:#fbfbfc}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media(max-width:768px - 1){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fbfbfc}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#fbfbfc}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:24px;list-style:none;background-color:#fff;border-radius:2px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:\"›\\00a0\";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#fbfbfc}.pagination{display:inline-block;padding-left:0;margin:24px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.5;text-decoration:none;color:#489be8;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#1a82e2;background-color:#fbfbfc;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#1a82e2;border-color:#1a82e2;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#fbfbfc;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:20px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:1px;border-top-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:1px;border-top-right-radius:1px}.pager{padding-left:0;margin:24px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#fbfbfc}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#fbfbfc;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#fbfbfc}.label-default[href]:hover,.label-default[href]:focus{background-color:#dedee6}.label-primary{background-color:#1a82e2}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1568b4}.label-success{background-color:#18c96e}.label-success[href]:hover,.label-success[href]:focus{background-color:#139b55}.label-info{background-color:#00bcd4}.label-info[href]:hover,.label-info[href]:focus{background-color:#008fa1}.label-warning{background-color:#f90}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc7a00}.label-danger{background-color:#b71c1c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#8b1515}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#fbfbfc;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#489be8;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#fbfbfc}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:24px;font-weight:200}.container .jumbotron{border-radius:4px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:72px}}.thumbnail{display:block;padding:4px;margin-bottom:24px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#489be8}.thumbnail .caption{padding:9px;color:#294762}.alert{padding:15px;margin-bottom:24px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:24px;margin-bottom:24px;background-color:#f5f5f5;border-radius:2px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:13px;line-height:24px;color:#fff;text-align:center;background-color:#1a82e2;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#18c96e}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#00bcd4}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f90}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#b71c1c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#1a82e2;border-color:#1a82e2}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#cfe5f9}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:24px;background-color:#fff;border:1px solid transparent;border-radius:2px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:18px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:24px}.panel-group .panel{margin-bottom:0;border-radius:2px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#1a82e2}.panel-primary>.panel-heading{color:#fff;background-color:#1a82e2;border-color:#1a82e2}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#1a82e2}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1a82e2}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:4px}.well-sm{padding:9px;border-radius:1px}.close{float:right;font-size:24px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:4px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.5px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media(min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media(min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:13px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:4px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:16px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:\"\"}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:\" \";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:\" \";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:\" \";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:\" \";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\\2039'}.carousel-control .icon-next:before{content:'\\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:\" \";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media(max-width:768px - 1){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media(min-width:768px) and (max-width:992px - 1){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media(min-width:992px) and (max-width:1200px - 1){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media(min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media(max-width:768px - 1){.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:992px - 1){.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1200px - 1){.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}@font-face{font-family:'Colfax-Light';src:url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.eot);src:url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.eot?#iefix) format(\"embedded-opentype\"),url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.woff) format(\"woff\")}@font-face{font-family:'Colfax-Medium';src:url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.eot);src:url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.eot?#iefix) format(\"embedded-opentype\"),url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.woff) format(\"woff\")}*{transition:.2s all}html{height:100%}body{padding:0 !important;padding-left:0 !important;padding-right:0 !important;font-size:16px;line-height:24px;font-weight:300;background-color:#fff;color:#546c82}p{margin:16px 0}article{max-width:780px;margin-bottom:68px}article img{display:block;height:auto;max-width:100%}table{background-color:white}.page-header{padding-bottom:0;margin:45px 0}.container-fluid{max-width:940px}.content{margin-bottom:54px}.nopadding{padding:0}.rowpadding{padding:0 15px 0 15px}.hidden-sm{display:none !important}@media screen and (min-width:768px){.hidden-sm{display:block !important}}.visible-sm{display:none !important}@media only screen and (max-width:768px){.visible-sm{display:block !important}}body.logged-out .logged-in,body.logged-in .logged-out{display:none}body.logged-out .logged-out,body.logged-in .logged-in{display:block}body.logged-out .logged-out,body.logged-in .logged-in .btn{display:block}@media screen and (min-width:768px){body.logged-out .logged-out,body.logged-in .logged-in .btn{display:inline-block}}body:before{content:\"\";height:100%;float:left;width:0;margin-top:-32767px}b,strong{font-weight:600}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}h1,h2,h3{font-family:\"Colfax-Light\",sans-serif}h1,h2,h4{color:#294661}h1{margin-bottom:30px;line-height:45px}h2{margin-bottom:10px;margin-top:20px;line-height:36px}h3,.h3{margin-bottom:13px;margin-top:20px;line-height:30px;color:#546c82}h4{font-family:\"Colfax-Medium\",sans-serif;margin-bottom:13px;margin-top:20px;line-height:20px}h5{color:#7f91a1;font-weight:700;letter-spacing:1px;margin-bottom:13px;margin-top:20px;line-height:20px}h6{font-weight:700;margin-bottom:13px}p{margin-bottom:1em;line-height:1.875em}p.small{font-size:13px;color:#7f91a1;font-weight:400}a{color:#489be8}a:hover,a:active,a:focus{color:#1a82e2;text-decoration:none}ul,ol{margin-bottom:16px}ul{padding-left:20px}ol{padding-left:24px}li{color:rgba(41,70,97,0.8)}.text-align-center{text-align:center}@media print{#search{width:0;padding:0;margin:0;display:none}#nav-menu{width:0;padding:0;margin:0;display:none}#header{display:none}#footer{display:none}#content{padding-top:10;overflow:auto;padding-bottom:0}textarea{display:none}.pull-right.download{display:none}.code-buttons{display:none}.nav-tabs{display:none}.tab-content{background:0}.tab-content>.tab-pane{display:block}.breadcrumb,.edit-link,.feedback{display:none}.code{-webkit-margin-start:0;-webkit-margin-end:0;font-size:11px}.highlight code{background:red;background-image:none}.gutter{display:none}.line{font-size:10px}.highlight{overflow:visible !important;border:none !important;word-wrap:normal}figure.code{margin-left:0}table,h1,h2,blockquote{clear:both;page-break-inside:avoid}table *{clear:both;page-break-after:avoid;page-break-before:avoid}#footer-iframe{display:none}}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.article{width:auto}.container{margin-left:20px}#header{position:relative;z-index:1000}#header-top{background-color:#fff;padding:4px 30px 4px 0;font-size:13px}#header-top .container-fluid{max-width:1200px}#header-top a{color:rgba(41,70,97,0.8)}#header-top .login-link{font-weight:400;text-align:right}.navbar-default{background:#fff;border-bottom:1px solid #ececed;box-shadow:0 1px 3px 0 rgba(41,71,98,0.1)}.navbar-default .container-fluid{max-width:1200px}@media screen and (min-width:768px){.navbar-default .navbar-collapse{width:350px;position:absolute;left:0;right:0;top:12px;margin:0 auto}.navbar-default .navbar-collapse:hover{cursor:pointer !important;cursor:hand !important}}.navbar-default .navbar-nav{border-top:0;padding:30px 0;margin:0}@media screen and (min-width:768px){.navbar-default .navbar-nav{padding:0;margin-top:2px}}.navbar-default .navbar-buttons{margin-top:16px;margin-right:30px}.navbar-default .nav-link a{line-height:24px;position:relative;display:block;padding:10px 16px;color:rgba(41,70,97,0.8);font-size:13px;font-weight:600;letter-spacing:1px;text-transform:uppercase}.navbar-default .nav-link a:hover{text-decoration:none;color:#1a82e2}.navbar-default #logo{margin-top:21px;display:inline-block;width:155px;height:37px;margin-left:30px}.navbar-default #nav-menu a,.navbar-default #nav-menu .subtree-name{line-height:24px;position:relative;display:block;color:rgba(41,70,97,0.8);font-size:13px;font-weight:600;letter-spacing:1px;text-transform:uppercase}.navbar-default #nav-menu .nav-list{margin-left:16px}.navbar-default #nav-menu .subtree-name{padding:10px 16px 0}.navbar-default #nav-menu li.active a{color:#1a82e2}.navbar-default .current-page-item a{color:#1a82e2 !important}.navbar-default #nav-icon{margin-right:16px;margin-top:26px;width:24px;height:15px;position:relative;background:0;border:0;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.5s ease-in-out;-moz-transition:.5s ease-in-out;-o-transition:.5s ease-in-out;transition:.5s ease-in-out;cursor:pointer}.navbar-default #nav-icon .menu-icon{display:block;position:absolute;height:3px;width:100%;background:#1a82e2;border-radius:1px;opacity:1;left:0;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.25s ease-in-out;-moz-transition:.25s ease-in-out;-o-transition:.25s ease-in-out;transition:.25s ease-in-out}.navbar-default #nav-icon .menu-icon:nth-child(1){top:0;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}.navbar-default #nav-icon .menu-icon:nth-child(2){top:6px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}.navbar-default #nav-icon .menu-icon:nth-child(3){top:12px;-webkit-transform-origin:left center;-moz-transform-origin:left center;-o-transform-origin:left center;transform-origin:left center}.navbar-default #nav-icon.open .menu-icon:nth-child(1){-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:8px}.navbar-default #nav-icon.open .menu-icon:nth-child(2){width:0;opacity:0}.navbar-default #nav-icon.open .menu-icon:nth-child(3){-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);top:13.5px;left:8px}.navbar-default #js-sidebar-links{display:none !important}@media only screen and (max-width:768px){.navbar-default #js-sidebar-links{display:block !important}}.btn{font-size:13px;padding:.833em 2.813em}.btn-primary,.btn-default,.btn-success{color:#fff;background:rgba(26,130,226,0.8);border:1px solid #1a82e2}.btn-primary:hover,.btn-default:hover,.btn-success:hover,.btn-primary:focus,.btn-default:focus,.btn-success:focus{color:#fff;background:#1a82e2}.btn-primary:active,.btn-default:active,.btn-success:active{color:#fff;box-shadow:0 1px 4px 0 rgba(41,71,98,0.2)}.btn-secondary{color:#1a82e2;background:transparent;border:1px solid rgba(26,130,226,0.4)}.btn-secondary:hover,.btn-secondary:focus{color:#1a82e2;background:rgba(26,130,226,0.1)}.btn-secondary:active{color:#1a82e2;box-shadow:0 1px 4px 0 rgba(41,71,98,0.2)}.btn-small{font-size:13px;padding:.667em 1.25em}.btn-large{font-size:16px}.code-wrapper figure.code,#overlay figure.code{margin-bottom:36px;border-radius:0 2px 2px 0;border:1px solid #ececed !important;border-radius:2px}.code-wrapper .highlight table td.code,#overlay .highlight table td.code,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight table td.code,#overlay html .gist .gist-file .gist-syntax .gist-highlight table td.code{width:100%}.code-wrapper .highlight code,#overlay .highlight code{background-color:#fbfbfc !important;border-radius:0 2px 2px 0}.code-wrapper .highlight .line-numbers,#overlay .highlight .line-numbers,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight .line-numbers,#overlay html .gist .gist-file .gist-syntax .gist-highlight .line-numbers{text-align:right;font-size:13px;background:#f5f5f8;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;padding:.8em !important;border-radius:2px 0 0 2px}.code-wrapper html .gist .gist-file,#overlay html .gist .gist-file{margin-bottom:1.8em;position:relative;border:0;padding-top:26px !important}.code-wrapper html .gist .gist-file .gist-syntax,#overlay html .gist .gist-file .gist-syntax{border-bottom:0 !important}.code-wrapper html .gist .gist-file .gist-meta,#overlay html .gist .gist-file .gist-meta{color:#999;font-size:.7em !important;border:1px solid #e1e1e1 !important;border-top:1px solid #fff !important;line-height:1.5em;padding:.6em .8em}.code-wrapper html .gist .gist-file .gist-meta a[href*=\"#file\"],#overlay html .gist .gist-file .gist-meta a[href*=\"#file\"]{position:absolute;top:0;left:0;right:-10px;color:#999 !important}.code-wrapper html .gist .gist-file .gist-meta a[href*=\"raw\"],#overlay html .gist .gist-file .gist-meta a[href*=\"raw\"]{top:7px}.code-wrapper pre,#overlay pre{-webkit-border-radius:.4em;-moz-border-radius:.4em;-ms-border-radius:.4em;-o-border-radius:.4em;border-radius:.4em;border:1px solid #e1e1e1;font-size:13px;margin-bottom:2.1em;color:#222;overflow:auto;white-space:pre;word-wrap:normal;padding:.8em 1em}.code-wrapper pre code,#overlay pre code{white-space:pre}.code-wrapper h3.filename+pre,#overlay h3.filename+pre{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.code-wrapper p code,#overlay p code,.code-wrapper li code,#overlay li code{display:inline-block;white-space:no-wrap;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:.4em;-moz-border-radius:.4em;-ms-border-radius:.4em;-o-border-radius:.4em;border-radius:.4em;margin:-1px 0;padding:0 .3em}.code-wrapper p pre code,#overlay p pre code,.code-wrapper li pre code,#overlay li pre code{font-size:1em !important;border:0}.code-wrapper .pre-code,#overlay .pre-code,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre,.code-wrapper .highlight code,#overlay .highlight code{font-family:Menlo,Monaco,\"Andale Mono\",\"lucida console\",\"Courier New\",monospace !important;overflow:scroll;overflow-y:hidden;display:block;overflow-x:auto;color:#222 !important;padding:.8em !important}.code-wrapper .pre-code span,#overlay .pre-code span,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre span,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre span{color:#222 !important;font-style:normal !important;font-weight:400 !important}.code-wrapper .pre-code .cs,#overlay .pre-code .cs,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .cs,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .cs,.code-wrapper .highlight code .cs,#overlay .highlight code .cs{color:#999 !important;font-style:italic !important}.code-wrapper .pre-code .err,#overlay .pre-code .err,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .err,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .err,.code-wrapper .highlight code .err,#overlay .highlight code .err{color:#dc322f !important;background:none !important}.code-wrapper .pre-code .k,#overlay .pre-code .k,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .k,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .k,.code-wrapper .highlight code .k,#overlay .highlight code .k{color:#cb4b16 !important}.code-wrapper .pre-code .p,#overlay .pre-code .p,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .p,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .p,.code-wrapper .highlight code .p,#overlay .highlight code .p{color:#222 !important}.code-wrapper .pre-code .ow,#overlay .pre-code .ow,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .ow,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .ow,.code-wrapper .highlight code .ow,#overlay .highlight code .ow{color:#2aa198 !important}.code-wrapper .pre-code .gd,#overlay .pre-code .gd,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gd,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gd,.code-wrapper .highlight code .gd,#overlay .highlight code .gd{color:#222 !important;background-color:#f6cbcb !important;display:inline-block}.code-wrapper .pre-code .gd .x,#overlay .pre-code .gd .x,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gd .x,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gd .x,.code-wrapper .highlight code .gd .x,#overlay .highlight code .gd .x{color:#222 !important;background-color:#f2b7b6 !important;display:inline-block}.code-wrapper .pre-code .ge,#overlay .pre-code .ge,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .ge,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .ge,.code-wrapper .highlight code .ge,#overlay .highlight code .ge{color:#222 !important;font-style:italic !important}.code-wrapper .pre-code .gi,#overlay .pre-code .gi,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gi,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gi,.code-wrapper .highlight code .gi,#overlay .highlight code .gi{color:#222 !important;background-color:#e6eacc !important;display:inline-block}.code-wrapper .pre-code .gi .x,#overlay .pre-code .gi .x,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gi .x,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gi .x,.code-wrapper .highlight code .gi .x,#overlay .highlight code .gi .x{color:#222 !important;background-color:#ced699 !important;display:inline-block}.code-wrapper .pre-code .gu,#overlay .pre-code .gu,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gu,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gu,.code-wrapper .highlight code .gu,#overlay .highlight code .gu{color:#6c71c4 !important}.code-wrapper .pre-code .kc,#overlay .pre-code .kc,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .kc,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .kc,.code-wrapper .highlight code .kc,#overlay .highlight code .kc{color:#859900 !important}.code-wrapper .pre-code .kp,#overlay .pre-code .kp,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .kp,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .kp,.code-wrapper .highlight code .kp,#overlay .highlight code .kp{color:#cb4b16 !important}.code-wrapper .pre-code .kr,#overlay .pre-code .kr,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .kr,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .kr,.code-wrapper .highlight code .kr,#overlay .highlight code .kr{color:#d33682 !important}.code-wrapper .pre-code .nc,#overlay .pre-code .nc,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nc,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nc,.code-wrapper .highlight code .nc,#overlay .highlight code .nc{color:#d33682 !important}.code-wrapper .pre-code .se,#overlay .pre-code .se,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .se,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .se,.code-wrapper .highlight code .se,#overlay .highlight code .se{color:#dc322f !important}.code-wrapper .pre-code div .gd,#overlay .pre-code div .gd,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre div .gd,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre div .gd,.code-wrapper .highlight code div .gd,#overlay .highlight code div .gd,.code-wrapper .pre-code div .gd .x,#overlay .pre-code div .gd .x,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre div .gd .x,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre div .gd .x,.code-wrapper .highlight code div .gd .x,#overlay .highlight code div .gd .x,.code-wrapper .pre-code div .gi,#overlay .pre-code div .gi,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre div .gi,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre div .gi,.code-wrapper .highlight code div .gi,#overlay .highlight code div .gi,.code-wrapper .pre-code div .gi .x,#overlay .pre-code div .gi .x,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre div .gi .x,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre div .gi .x,.code-wrapper .highlight code div .gi .x,#overlay .highlight code div .gi .x{display:inline-block;width:100%}.code-wrapper .highlight,#overlay .highlight,.code-wrapper .gist-highlight,#overlay .gist-highlight{margin-bottom:1.8em;overflow-y:hidden;overflow-x:auto}.code-wrapper .highlight pre,#overlay .highlight pre,.code-wrapper .gist-highlight pre,#overlay .gist-highlight pre{background:0;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;border:0;margin-bottom:0;padding:0}.code-wrapper .highlight code,#overlay .highlight code{background-color:#fff}.code-wrapper figure.code,#overlay figure.code{background:0;border:0;margin-bottom:1.5em;padding:0}.code-wrapper figure.code figcaption,#overlay figure.code figcaption{position:relative}.code-wrapper .code-title,#overlay .code-title,.code-wrapper html .gist .gist-file .gist-meta a[href*=\"#file\"],#overlay html .gist .gist-file .gist-meta a[href*=\"#file\"],.code-wrapper h3.filename,#overlay h3.filename,.code-wrapper figure.code figcaption,#overlay figure.code figcaption{text-align:center;font-size:13px;line-height:2em;font-weight:400;margin-bottom:0;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;font-family:\"Helvetica Neue\",Arial,\"Lucida Grande\",\"Lucida Sans Unicode\",Lucida,sans-serif;border:1px solid #565656;border-top-color:#cbcbcb;border-left-color:#a5a5a5;border-right-color:#a5a5a5;border-bottom:0;text-shadow:none;color:#999;background:#000}.code-wrapper .download-source,#overlay .download-source,.code-wrapper html .gist .gist-file .gist-meta a[href*=\"raw\"],#overlay html .gist .gist-file .gist-meta a[href*=\"raw\"],.code-wrapper figure.code figcaption a,#overlay figure.code figcaption a{position:absolute;right:.8em;text-decoration:none;z-index:1;font-size:13px;padding-left:3em;color:#777 !important;text-shadow:none}.code-wrapper .highlight .line-numbers span,#overlay .highlight .line-numbers span,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight .line-numbers span,#overlay html .gist .gist-file .gist-syntax .gist-highlight .line-numbers span,.code-wrapper .pre-code .gh,#overlay .pre-code .gh,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gh,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gh,.code-wrapper .highlight code .gh,#overlay .highlight code .gh{color:#999 !important}.code-wrapper html .gist .gist-file .gist-meta a,#overlay html .gist .gist-file .gist-meta a,.code-wrapper html .gist .gist-file .gist-meta a:hover,#overlay html .gist .gist-file .gist-meta a:hover{color:#1863a1 !important;text-decoration:none}.code-wrapper html .gist .gist-file .gist-meta a[href*=\"#file\"]:hover,#overlay html .gist .gist-file .gist-meta a[href*=\"#file\"]:hover,.code-wrapper .download-source:hover,#overlay .download-source:hover,.code-wrapper html .gist .gist-file .gist-meta a[href*=\"raw\"]:hover,#overlay html .gist .gist-file .gist-meta a[href*=\"raw\"]:hover,.code-wrapper figure.code figcaption a:hover,#overlay figure.code figcaption a:hover{color:#fff !important;text-decoration:none}.code-wrapper .pre-code ::-moz-selection,#overlay .pre-code ::-moz-selection,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre ::-moz-selection,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre ::-moz-selection,.code-wrapper .highlight code ::-moz-selection,#overlay .highlight code ::-moz-selection,.code-wrapper .pre-code ::-webkit-selection,#overlay .pre-code ::-webkit-selection,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre ::-webkit-selection,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre ::-webkit-selection,.code-wrapper .highlight code ::-webkit-selection,#overlay .highlight code ::-webkit-selection,.code-wrapper .pre-code ::selection,#overlay .pre-code ::selection,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre ::selection,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre ::selection,.code-wrapper .highlight code ::selection,#overlay .highlight code ::selection{background:#e9e9e9;color:inherit;text-shadow:#fff 0 1px}.code-wrapper .pre-code .c,#overlay .pre-code .c,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .c,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .c,.code-wrapper .highlight code .c,#overlay .highlight code .c,.code-wrapper .pre-code .cm,#overlay .pre-code .cm,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .cm,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .cm,.code-wrapper .highlight code .cm,#overlay .highlight code .cm,.code-wrapper .pre-code .cp,#overlay .pre-code .cp,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .cp,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .cp,.code-wrapper .highlight code .cp,#overlay .highlight code .cp,.code-wrapper .pre-code .c1,#overlay .pre-code .c1,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .c1,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .c1,.code-wrapper .highlight code .c1,#overlay .highlight code .c1{color:#999 !important;font-style:italic !important}.code-wrapper .pre-code .o,#overlay .pre-code .o,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .o,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .o,.code-wrapper .highlight code .o,#overlay .highlight code .o,.code-wrapper .pre-code .gs,#overlay .pre-code .gs,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .gs,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .gs,.code-wrapper .highlight code .gs,#overlay .highlight code .gs{color:#222 !important}.code-wrapper .pre-code .kd,#overlay .pre-code .kd,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .kd,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .kd,.code-wrapper .highlight code .kd,#overlay .highlight code .kd,.code-wrapper .pre-code .n,#overlay .pre-code .n,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .n,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .n,.code-wrapper .highlight code .n,#overlay .highlight code .n,.code-wrapper .pre-code .na,#overlay .pre-code .na,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .na,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .na,.code-wrapper .highlight code .na,#overlay .highlight code .na,.code-wrapper .pre-code .vg,#overlay .pre-code .vg,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .vg,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .vg,.code-wrapper .highlight code .vg,#overlay .highlight code .vg,.code-wrapper .pre-code .vi,#overlay .pre-code .vi,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .vi,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .vi,.code-wrapper .highlight code .vi,#overlay .highlight code .vi,.code-wrapper .pre-code .nv,#overlay .pre-code .nv,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nv,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nv,.code-wrapper .highlight code .nv,#overlay .highlight code .nv,.code-wrapper .pre-code .si,#overlay .pre-code .si,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .si,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .si,.code-wrapper .highlight code .si,#overlay .highlight code .si{color:#268bd2 !important}.code-wrapper .pre-code .kt,#overlay .pre-code .kt,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .kt,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .kt,.code-wrapper .highlight code .kt,#overlay .highlight code .kt,.code-wrapper .pre-code .mf,#overlay .pre-code .mf,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .mf,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .mf,.code-wrapper .highlight code .mf,#overlay .highlight code .mf,.code-wrapper .pre-code .m,#overlay .pre-code .m,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .m,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .m,.code-wrapper .highlight code .m,#overlay .highlight code .m,.code-wrapper .pre-code .mh,#overlay .pre-code .mh,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .mh,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .mh,.code-wrapper .highlight code .mh,#overlay .highlight code .mh,.code-wrapper .pre-code .mi,#overlay .pre-code .mi,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .mi,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .mi,.code-wrapper .highlight code .mi,#overlay .highlight code .mi,.code-wrapper .pre-code .s,#overlay .pre-code .s,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .s,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .s,.code-wrapper .highlight code .s,#overlay .highlight code .s,.code-wrapper .pre-code .sd,#overlay .pre-code .sd,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .sd,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .sd,.code-wrapper .highlight code .sd,#overlay .highlight code .sd,.code-wrapper .pre-code .s2,#overlay .pre-code .s2,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .s2,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .s2,.code-wrapper .highlight code .s2,#overlay .highlight code .s2,.code-wrapper .pre-code .sr,#overlay .pre-code .sr,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .sr,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .sr,.code-wrapper .highlight code .sr,#overlay .highlight code .sr,.code-wrapper .pre-code .s1,#overlay .pre-code .s1,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .s1,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .s1,.code-wrapper .highlight code .s1,#overlay .highlight code .s1{color:#2aa198 !important}.code-wrapper .pre-code .nb,#overlay .pre-code .nb,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nb,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nb,.code-wrapper .highlight code .nb,#overlay .highlight code .nb,.code-wrapper .pre-code .nl,#overlay .pre-code .nl,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nl,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nl,.code-wrapper .highlight code .nl,#overlay .highlight code .nl{color:#859900 !important}.code-wrapper .pre-code .no,#overlay .pre-code .no,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .no,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .no,.code-wrapper .highlight code .no,#overlay .highlight code .no,.code-wrapper .pre-code .nn,#overlay .pre-code .nn,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nn,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nn,.code-wrapper .highlight code .nn,#overlay .highlight code .nn,.code-wrapper .pre-code .nx,#overlay .pre-code .nx,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nx,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nx,.code-wrapper .highlight code .nx,#overlay .highlight code .nx{color:#b58900 !important}.code-wrapper .pre-code .ne,#overlay .pre-code .ne,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .ne,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .ne,.code-wrapper .highlight code .ne,#overlay .highlight code .ne,.code-wrapper .pre-code .nf,#overlay .pre-code .nf,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nf,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nf,.code-wrapper .highlight code .nf,#overlay .highlight code .nf,.code-wrapper .pre-code .nt,#overlay .pre-code .nt,.code-wrapper html .gist .gist-file .gist-syntax .gist-highlight pre .nt,#overlay html .gist .gist-file .gist-syntax .gist-highlight pre .nt,.code-wrapper .highlight code .nt,#overlay .highlight code .nt{color:#268bd2 !important}.code-wrapper figure.code pre,#overlay figure.code pre,.code-wrapper figure.code .highlight,#overlay figure.code .highlight{margin-bottom:0}code.wrap,code.requestdata{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;display:inline-block;max-width:580px}.request-block{margin:10px 0}.request-block code{display:inline-block;white-space:normal;word-break:break-word}.request-block .requestdata{color:black}figure.code.expanded{position:fixed;top:0;left:0;padding:60px 40px 40px 40px;margin:0;z-index:100000}.data-key{color:#2aa198}.data-value{color:#859900}.live-params{margin:10px 0}.live-call{display:none}.cancel{display:none}.callout{font-family:\"Colfax-Light\",sans-serif;font-size:20px;padding-left:15px;color:rgba(41,70,97,0.8);background:#fff;margin:45px 0}.callout.callout-info{border-left:5px solid #1a82e2}.callout.callout-warning{border-left:5px solid #b71c1c}.callout.callout-developer{border:solid;border-width:0 0 0 20px;border-image:url(https://sendgrid.com/docs/images/file-code-share.png) 0 0 0 100%;border-top:0;border-bottom:0;border-right:0}.callout.callout-github{border-left:5px solid #1a82e2;padding-right:80px}.callout.callout-github.affix{margin-bottom:0;z-index:2000}.callout.callout-github .link{margin:16px 0 0 0}.step-active{text-shadow:0 -1px 0 #545454;height:30px;width:38px;margin:0;padding:0;color:#fff}.step-inactive{text-shadow:0 -1px 0 #8f8f8f;height:30px;width:38px;margin:0;padding:0;color:#fff}.icon-counter-active{position:relative;top:-8px;left:-6px;width:25px;height:22px;margin:0;padding:12px 0 0 15px;text-shadow:0 -1px 0 #545454;color:#fff;font-size:medium}.icon-counter-inactive{position:relative;top:-8px;left:-6px;width:25px;height:22px;margin:0;padding:12px 0 0 15px;text-shadow:0 -1px 0 #8f8f8f;color:#fff;font-size:medium}.accordion-heading{padding-top:0;height:38px;font-size:large}.accordion-inner{padding-bottom:3px}@media(min-width:768px) and (max-width:1088px){.accordion-heading{height:auto;font-size:medium}}@media(min-width:980px) and (max-width:1200px){.vidgrid-row{margin-left:20px;width:960px}}.bar-indicator{width:220px;height:20px;margin:0 auto;margin-top:16px;margin-bottom:16px}.circle-indicator{width:16px;height:16px;display:inline-block;vertical-align:middle}.anchor{margin-left:-14px;font-size:14px;color:black;line-height:26px}.anchor-icon{display:inline-block;width:14px}.anchor-icon i{left:-3px;position:relative}.icon-link{display:none}.anchor-wrap:hover .anchor-icon i{display:inline-block}#sidebar{margin-top:0;margin-bottom:0;padding:0 16px;background-color:#fbfbfc;border-bottom:1px solid #ececed}#sidebar li a{padding:0}@media screen and (min-width:768px){#sidebar{background-color:transparent;border-bottom:0;padding-top:0;padding-bottom:0;margin-top:45px;margin-bottom:45px}}#sidebar-wrapper{font-size:13px;font-weight:400}#sidebar-wrapper a{color:rgba(41,71,98,0.8)}#sidebar-wrapper a:hover,#sidebar-wrapper a:focus,#sidebar-wrapper a:active{color:#1a82e2}#sidebar-wrapper li:not(:last-child){margin-bottom:9px}#sidebar-wrapper li.collapsibleListOpen{cursor:pointer}#sidebar-wrapper li.collapsibleListClosed{cursor:pointer}#sidebar-wrapper li.collapsibleListClosed>ul{display:none}#sidebar-wrapper li.active a{color:#1a82e2;font-weight:700}#sidebar-wrapper li ul li.active{margin-left:-80px;padding-left:80px}#sidebar-wrapper li ul li ul li.active{margin-left:-120px;padding-left:120px}#sidebar-wrapper li ul li ul li ul li.active{margin-left:-160px;padding-left:160px}.subtree-name{margin-bottom:9px}.subtree-name+ul{padding-left:11px;border-left:3px solid #ececed}.parent .subtree-name:after{content:\"\\e637\";font-family:'icomoon';padding-left:5px;font-size:10px;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.page-footer{background-color:#294661;color:rgba(255,255,255,0.8);padding-top:1.875em;padding-bottom:1.875em}.page-footer span:not(:last-child){margin-right:.667em}.page-footer a{color:rgba(255,255,255,0.8)}.page-footer a:hover{color:#fff}.feedback{padding:36px 0;border-top:1px solid #ececed;border-bottom:1px solid #ececed}.feedback p{display:inline-block;margin-right:20px;margin-bottom:0}.feedback .feedback-element{color:rgba(41,70,97,0.8)}.feedback .feedback-element:hover{text-decoration:none}.feedback .feedback-element:hover img{opacity:1}.feedback .feedback-element img{display:inline-block;margin-right:3px;opacity:.8}.feedback .feedback-element p{display:none}@media screen and (min-width:480px){.feedback .feedback-element p{display:inline-block}}.feedback .feedback-positive:hover p,.feedback .feedback-positive:active p,.feedback .feedback-positive:focus p{color:#18c96e}.feedback .feedback-negative:hover p,.feedback .feedback-negative:active p,.feedback .feedback-negative:focus p{color:#b71c1c}.feedback .feedback-more:hover p,.feedback .feedback-more:active p,.feedback .feedback-more:focus p{color:#1a82e2}.feedback-cta{margin-top:36px}.feedback-cta .btn{display:block;margin:0 auto;max-width:375px}.feedback-cta .btn:not(:last-child){margin-bottom:16px}@media screen and (min-width:768px){.feedback-cta .btn{display:inline-block}.feedback-cta .btn:not(:last-child){margin-right:16px;margin-bottom:0}}#overlay{position:fixed;top:0;left:0;bottom:0;right:0;overflow:auto;background-color:rgba(0,0,0,0.7);z-index:10000}#overlay .code-buttons{margin-top:20px}.subsection-links p{font-size:13px;font-weight:400}.subsection-links .subsection-title{margin-top:0;font-weight:700}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden;margin-bottom:30px}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.flash-video{overflow:hidden;padding-bottom:56.25%;position:relative;height:0;margin-bottom:30px}.flash-video iframe{left:0;top:0;height:100%;width:100%;position:absolute}.iframe-container{overflow:hidden;width:100%;height:100%;position:absolute;left:0}.iframe-container iframe{height:100%;overflow:auto;width:100%;display:block}form{position:relative}form .input-group,form .form-group{border-bottom:1px solid rgba(41,71,98,0.2);box-shadow:transparent 0 1px 0;width:100%}form .input-group.is-focused,form .form-group.is-focused{border-bottom:1px solid #1a82e2;box-shadow:#1a82e2 0 1px 0}form input[type]:not([type=\"submit\"]),form select,form textarea{border:0;box-shadow:none;background:0;-webkit-appearance:none;border-radius:0;margin:0;padding:0;font-size:13px;color:rgba(41,71,98,0.8);width:100%;padding:6px 24px 6px 0;text-overflow:ellipsis}form input[type]:not([type=\"submit\"]):focus,form select:focus,form textarea:focus,form input[type]:not([type=\"submit\"]):active,form select:active,form textarea:active{outline:0;border:0;box-shadow:none}form label{font-size:12px;line-height:14px;font-weight:400}form label.floating-label{font-size:14px;font-weight:300;color:rgba(41,71,98,0.6);cursor:text;z-index:-1;position:absolute;top:7px;left:0}form label.floating-label.is-focused,form label.floating-label.is-dirty{font-size:12px;line-height:14px;top:-12px;font-weight:400}form.navbar-search{margin-bottom:30px}form.navbar-search .search-query{font-family:\"Open Sans\",sans-serif;font-weight:300;font-size:16px}form.navbar-search .input-btn{border:0;background:0;position:absolute;right:0;bottom:3px;z-index:2;font-size:14px;color:rgba(41,71,98,0.3)}form.navbar-search .input-btn:hover{color:#1a82e2}.nav-tabs{border:0}.nav-tabs li a{font-size:13px;color:rgba(41,71,98,0.4);letter-spacing:1px;text-transform:uppercase;font-weight:700;padding:13px 13px;border:0;border-bottom:3px solid transparent}@media screen and (min-width:768px){.nav-tabs li a{padding:24px 30px}}.nav-tabs li a:hover,.nav-tabs li a:focus{border:0;background:0;border-bottom:3px solid rgba(26,130,226,0.2);color:rgba(26,130,226,0.8)}@media only screen and (max-width:768px){.nav-tabs li .badge{display:none}}.nav-tabs li.active a{border:0;color:#1a82e2;border-bottom:3px solid #1a82e2}.nav-tabs li.active a:hover,.nav-tabs li.active a:focus{border:0;background:0;color:#1a82e2;border-bottom:3px solid #1a82e2}.badge{background:rgba(158,158,158,0.5);letter-spacing:0;border-radius:2px;font-weight:600;padding:2px 5px 3px;font-size:11px;margin-left:7px}.breadcrumb-pane{font-size:13px;font-weight:400}.breadcrumb-pane .breadcrumb{float:left;padding:45px 0 0 0;margin:0 0 10px}.breadcrumb-pane .edit-link{display:none}@media screen and (min-width:768px){.breadcrumb-pane .edit-link{display:block;margin-top:48px;float:right}}.modal,.fade{background:rgba(251,251,252,0.9)}.modal .modal-sm,.fade .modal-sm{width:inherit;max-width:460px}.modal .modal-content,.fade .modal-content{border:1px solid #ececed;-webkit-box-shadow:0 2px 6px rgba(41,71,98,0.09);box-shadow:0 2px 6px rgba(41,71,98,0.09)}.modal .btn+.btn,.fade .btn+.btn{margin-left:16px}.home-list p{color:rgba(41,70,97,0.8)}.home-list h3{color:rgba(26,130,226,0.8)}.home-list a:hover h3,.home-list a:focus h3,.home-list a:active h3{color:#1a82e2}.home-list a:hover img,.home-list a:focus img,.home-list a:active img{opacity:1}.home-list .panel{border:1px solid #ececed;border-radius:none;box-shadow:none;padding:24px;text-align:center}.home-list .panel img{margin:0 auto;max-height:40px;opacity:.8}.home-list .panel p{font-size:13px;font-weight:400;line-height:20px}.home-list .panel a:hover img,.home-list .panel a:focus img,.home-list .panel a:active img{opacity:1}.home.feedback-cta{padding-top:36px;border-top:1px solid #ececed}.glossary-section a{display:block;margin-bottom:11px}.glossary-toggle{display:inline-block;border:1px solid rgba(26,130,226,0.4);border-radius:2px;margin-top:16px}.glossary-toggle div{font-size:13px;font-weight:400;padding:12px 18px;display:inline-block}.glossary-toggle div:first-child{margin-right:-4px}.glossary-toggle div a{color:rgba(26,130,226,0.8)}.glossary-toggle div.active{background:rgba(26,130,226,0.8)}.glossary-toggle div.active a{color:#fff}#results,#kb-results,#blog-results{overflow:hidden;text-overflow:ellipsis;margin-top:68px}#results a h3,#kb-results a h3,#blog-results a h3{color:rgba(26,130,226,0.8)}#results a h3:hover,#kb-results a h3:hover,#blog-results a h3:hover,#results a h3:focus,#kb-results a h3:focus,#blog-results a h3:focus,#results a h3:active,#kb-results a h3:active,#blog-results a h3:active{color:#1a82e2}#results .result:not(:last-child),#kb-results .result:not(:last-child),#blog-results .result:not(:last-child){margin-bottom:45px}.form-search input[type=\"submit\"]{margin:16px 0 36px}.live-doc{display:none}.tryit,.cancel{margin:16px 16px 16px 0}.curl-call code{display:inline-block;white-space:normal;word-break:break-word}.clear-request{width:131px}.hljs{max-width:624px}table.apitable{color:#7f91a1;text-align:left;font-size:.833em;font-weight:400;border-collapse:collapse;table-layout:fixed;width:100%;min-width:500px}table.apitable tr{margin:0;padding:0;border:0}table.apitable tr.details-row{border-top:2px solid transparent;width:50%}table.apitable tr.details-row td{padding-top:0}table.apitable tr.details-open .details-caret img{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg)}table.apitable tr.details-closed+.details-row{display:none}table.apitable tr.depth-1 .param{padding-left:2.5em}table.apitable tr.depth-1 .param:before{left:1.25em}table.apitable tr.depth-2 .param{padding-left:3.75em}table.apitable tr.depth-2 .param:before{left:2.5em}table.apitable tr.depth-2 .param:after{left:2.805em}table.apitable th{padding:1.5em;font-weight:700;letter-spacing:1px;text-transform:uppercase}table.apitable th.details-header{text-align:right;padding-right:0}table.apitable td{padding:1.25em;border-top:1px solid #ececed;border-bottom:1px solid #ececed;width:100%;white-space:wrap;vertical-align:middle}table.apitable td:first-of-type{border-left:1px solid #ececed}table.apitable td:last-of-type{border-right:1px solid #ececed}table.apitable td.details-caret{text-align:right}table.apitable td.details-caret:hover{cursor:pointer}table.apitable td.details-caret img{display:inline-block}table.apitable td.param{position:relative;left:1.25em}table.apitable td.param:before{content:'';position:absolute;margin-top:8px;left:0;width:.667em;height:.667em;border-radius:50%}table.apitable td.param.array,table.apitable td.param.status-200{color:#8ac24a}table.apitable td.param.array:before,table.apitable td.param.status-200:before{background:#8ac24a}table.apitable td.param.object,table.apitable td.param.status-500{color:#7b1fa2}table.apitable td.param.object:before,table.apitable td.param.status-500:before{background:#7b1fa2}table.apitable td.param.string{color:#00bcd4}table.apitable td.param.string:before{background:#00bcd4}table.apitable td.param.bool{color:#dea7e8}table.apitable td.param.bool:before{background:#dea7e8}table.apitable td.param.int,table.apitable td.param.status-400{color:#f90}table.apitable td.param.int:before,table.apitable td.param.status-400:before{background:#f90}table.apitable td.param.number{color:#2196f3}table.apitable td.param.number:before{background:#2196f3}@font-face{font-family:'icomoon';src:url('../fonts/icomoon.eot?-dsxx10');src:url('../fonts/icomoon.eot?#iefix-dsxx10') format('embedded-opentype'),url('../fonts/icomoon.woff?-dsxx10') format('woff'),url('../fonts/icomoon.ttf?-dsxx10') format('truetype'),url('../fonts/icomoon.svg?-dsxx10#icomoon') format('svg');font-weight:normal;font-style:normal}[class^=\"icon-\"],[class*=\" icon-\"]{font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-emailactivity:before{content:\"\\e600\"}.icon-askcommunity:before{content:\"\\e601\"}.icon-vidgrid:before{content:\"\\e602\"}.icon-readblog:before{content:\"\\e603\"}.icon-askcommunity2:before{content:\"\\e604\"}.icon-roadmap:before{content:\"\\e605\"}.icon-home:before{content:\"\\e606\"}.icon-webapi:before{content:\"\\e607\"}.icon-codeexamples:before{content:\"\\e608\"}.icon-whitelabel:before{content:\"\\e609\"}.icon-apiworkshop_v2:before{content:\"\\e60a\"}.icon-close:before{content:\"\\e60d\"}.icon-eventnotification:before{content:\"\\e60e\"}.icon-fullscreen:before{content:\"\\e60f\"}.icon-overview:before{content:\"\\e610\"}.icon-marketingemail:before{content:\"\\e611\"}.icon-smtpapi:before{content:\"\\e612\"}.icon-webhooks:before{content:\"\\e613\"}.icon-subuser:before{content:\"\\e614\"}.icon-subuserwhitelable:before{content:\"\\e615\"}.icon-resellerapi:before{content:\"\\e616\"}.icon-integrate:before{content:\"\\e617\"}.icon-apple:before{content:\"\\e618\"}.icon-java:before{content:\"\\e619\"}.icon-nodejs:before{content:\"\\e61a\"}.icon-perl:before{content:\"\\e61b\"}.icon-php:before{content:\"\\e61c\"}.icon-python:before{content:\"\\e61d\"}.icon-ruby:before{content:\"\\e61e\"}.icon-net:before{content:\"\\e61f\"}.icon-cakephp:before{content:\"\\e620\"}.icon-codeigniter:before{content:\"\\e621\"}.icon-django:before{content:\"\\e622\"}.icon-rubyonrails:before{content:\"\\e623\"}.icon-symfony:before{content:\"\\e624\"}.icon-zendphp:before{content:\"\\e625\"}.icon-outlook:before{content:\"\\e626\"}.icon-thunderbird:before{content:\"\\e627\"}.icon-exim:before{content:\"\\e628\"}.icon-ssmtp:before{content:\"\\e629\"}.icon-postfix:before{content:\"\\e62a\"}.icon-microsoft:before{content:\"\\e62b\"}.icon-sendmail:before{content:\"\\e62c\"}.icon-phpBB:before{content:\"\\e62d\"}.icon-qmail:before{content:\"\\e62e\"}.icon-drupal:before{content:\"\\e62f\"}.icon-joomla:before{content:\"\\e630\"}.icon-magento:before{content:\"\\e631\"}.icon-wordpress:before{content:\"\\e632\"}.icon-open:before{content:\"\\e60c\"}.icon-search:before{content:\"\\e634\"}.icon-copy:before{content:\"\\e633\"}.icon-edit:before{content:\"\\e635\"}.icon-link:before{content:\"\\e638\"}.icon-template:before{content:\"\\e60b\"}.icon-list:before{content:\"\\e636\"}.icon-arrow-down:before{content:\"\\e637\"}#logo{background:url('https://sendgrid.com/brand/sg-logo.png') no-repeat;background-size:contain}.callout-github{background:url(../images/GitHub-Mark-64px.png?embed=true) 100% no-repeat no-repeat;background-size:64px}.step-active{background:url(../images/counter-icons.png) no-repeat scroll 0 -80px transparent}.step-inactive{background:url(../images/counter-icons.png) no-repeat scroll 0 -128px transparent}.icon-counter-active{background:url(../images/counter-icons.png?embed=true) no-repeat 0 -80px}.icon-counter-inactive{background:url(../images/counter-icons.png?embed=true) no-repeat 0 -128px}.bar-indicator{background:url(../images/bar-indicator.gif)}.circle-indicator{background:url(../images/circle-indicator.gif)}"
  },
  {
    "path": "static/config.json",
    "content": "\n{\n  \"IndexDocument\": {\n      \"Suffix\": \"index.html\"\n  },\n  \"ErrorDocument\": {\n      \"Key\": \"404.html\"\n  },\n  \"RoutingRules\": [\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Customer_Subuser_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API/Customer_Subuser_API/multi_cred.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/teammates.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/categories.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/lists.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/newsletters.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/newsletters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/recipients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/recipients.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/schedule.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/schedule.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/sender_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/sender_address.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Marketing_Emails_API/variations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/variations.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/apps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-filters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/authenticate_a_subuser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/authenticate_a_subuser.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/ip_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/ip_management.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/monitor_records.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/monitor_records.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/subuser_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/subuser_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/subuser_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/subuser_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/subuser_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/subusers.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Customer_Subuser_API/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Customer_Subuser_API/whitelabel.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/account_overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/account_overview.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/apps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-filters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/authenticate_a_customer_subuser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/authenticate_a_customer_subuser.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/authenticate_a_customer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/authenticate_a_customer.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/billing_retrieving_as_you_go_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/billing_retrieving_end_users_invoices_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_management.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_apps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_apps_filters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_monitor_outgoing_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_timezone.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_subuser_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_timezone.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_timezone.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/customer_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/customer_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/invoice_retrieval.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/invoice_retrieval.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/ip_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/ip_management.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/monitor_records.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/monitor_records.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/multiple_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/multiple_credentials.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/pending_account_changes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/pending_account_changes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_apps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_apps.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/Reseller_Customer_Subuser_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/account_overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/account_overview.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/apps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-filters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/authenticate_a_customer_subuser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer_subuser.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/authenticate_a_customer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/billing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_management.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_account_limits.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_account_limits.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_apps_filters.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_apps_filters.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_bounces.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_statistics.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/customer_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/event_notification_url.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/event_notification_url.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/invoice_retrieval.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/invoice_retrieval.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/ip_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/ip_management.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/monitor_records.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/monitor_records.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/parse_settings.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/pending_account_changes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/pending_account_changes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/view_available_packages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/view_available_packages.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v1_(deprecated)/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/whitelabel.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/v2_(deprecated)/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/view_available_packages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/view_available_packages.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_API/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/whitelabel.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_Haiku_API/customer_change.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_Haiku_API/customer_change.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_Haiku_API/customer_deprovision.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_Haiku_API/customer_deprovision.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_Haiku_API/customer_provision.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_Haiku_API/customer_provision.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_Haiku_API/customer_sso.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_Haiku_API/customer_sso.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Reseller_Haiku_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_Haiku_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Template_Engine_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Transactional_Templates/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Template_Engine_API/templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Transactional_Templates/templates.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Template_Engine_API/versions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Transactional_Templates/versions.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Template_Engine_API/smtpapi.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Transactional_Templates/smtpapi.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API/Reseller_API/automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_automatic_login.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/cancel_scheduled_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/event_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Advanced_Suppression_Manager/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Advanced_Suppression_Manager/global_suppressions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/global_suppressions.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Advanced_Suppression_Manager/groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/groups.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Advanced_Suppression_Manager/suppressions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/suppressions.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated_ip_addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Mail/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/API_Reference/Web_API_v3/Mail/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API/parse_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Webhooks/parse.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Unsubscribe_Manager/global_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/global_unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Unsubscribe_Manager/groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/groups.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Unsubscribe_Manager/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Unsubscribe_Manager/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Suppression_Management/unsubscribes.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/parse.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Webhooks/inbound_email.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/SMTP_API/smtpapi_validator.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/SMTP_API/index.html\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/address_whitelisting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/bcc.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/bypass_list_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/click_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/domain_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/dkim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/email_templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/event_notification.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/footer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/forward_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/google_analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/gravatar.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/new_relic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/partners/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/open_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/return_path_seedlist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/sendwithus.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/partners/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/spam_checker.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Apps/template_engine.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-mail/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/csharp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/go/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/ios.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/java.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/java/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/nodejs/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/perl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/perl/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/php/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/python/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/ruby/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/go/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/nodejs/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/php/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/python/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/Webhook_Examples/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/Webhook_Examples/csharp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/go/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/nodejs/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/perl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/perl/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/php/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/python/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Code_Examples/SMTP_API_Header_Examples/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/ruby/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-csharp-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/java.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-java-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/perl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-perl-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-php-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-python-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-ruby-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/warming_up_ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/api_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Undeliverable_Email/how_sendgrid_handles_550_requested_action_not_taken_mailbox_unavailable_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_may_not_be_able_to_send_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"Classroom/Troubleshooting/Account_Administration/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_out_any_email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/two_factor_authentication_faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two_factor_authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/a_sendgrid_user_is_spamming_me.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"report-spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/does_sendgrid_support_end_to_end_tls.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/tls/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/email_flow.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-flow/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/everything_about_dmarc.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/link_shorteners.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/recommended_smtp_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/sendgrid_multiauth_multiple_account_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/sendgrid_oem_process.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/sending_practices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/smtp_ports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/ssl_vs_tls.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/ssl-vs-tls/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/tips_to_keep_your_list_organized.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/what_are_subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/what_are_the_sendgrid_apis_and_what_do_they_do.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/for-developers/sending-email/api-sending-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/what_is_smtp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/what_is_the_difference_between_marketing_and_transactional_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/where_can_i_enable_subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/analytics-and-reporting/subuscription-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/why_are_the_pro_plans_recommended_above_all_others.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"pricing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/your_reputation_what_is_it.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/what-is-a-domain-reputation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/setting_up_2_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated-ip-addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/creating_multiple_user_credentials_for_sub_users.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/im_a_multiple_credential_user_and_i_need_to_reset_my_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated-ip-addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/sendgrid_multiauth_multiple_account_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"policies/security/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migration_guide_part_1_migrating_your_recipient_lists_into_contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migration_guide_part_2_importing_your_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migration_guide_part_3_moving_your_content.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/where_can_i_enable_subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/#-Subscription-Tracking\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/marketing_campaigns_video_tutorials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/remove_bounced_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/account_sign_up_faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/how_do_i_reset_my_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/parsing-email/setting-up-the-inbound-parse-webhook/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/default_mc_tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/sending-email/global-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/global-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/engagement_stats.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Integrate/how_to_integrate_with_mailpoet.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/mailpoet/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Integrate/interspire_integration.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/interspire/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Integrate/sugarcrm_integration.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sugarcrm/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/support.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/support/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/sendgrid_oem_process.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/what_is_the_difference_between_marketing_and_transactional_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/transactional-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/a_sendgrid_user_is_spamming_me.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"report-spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Email_Infrastructure/email_flow.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-flow/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Email_Infrastructure/everything_about_dmarc.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/tls/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/cors.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/cors/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/does_sendgrid_offer_a_sandbox_or_test_environment.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sandbox/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/how_do_i_integrate_with_sendgrid.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-api/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/how_to_create_a_subuser_with_the_api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/how-to-create-a-subuser-with-the-api/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-api/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/what_is_my_api_key.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"index.html/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/a_b_testing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/adaptive_email_content.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/attachments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/attachments-with-digioh/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/brand_consistency_why_its_important.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/how-to-maintain-brand-standards-in-your-email-designs/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/can_i_use_substitution_tags_in_subject_lines.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/substitution-and-section-tags/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/content_delivery_networks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/content-delivery-networks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/embedding_videos_in_your_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/gmail_promotions_tab.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/i-fought-the-tabs-and-the-tabs-won/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/how_do_i_add_a_list_unsubscribe_header_to_my_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"docsClassroom/Build/html_formatting_issues.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/formatting-html/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/html_rendering__the_dos_and_donts_of_cross_platform_email_design.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/cross-platform-html-design/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/personalization_making_your_messages_count.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/plain_text_emails_converted_to_html.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/formatting-html/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/responsive_templates_and_design.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/cross-platform-html-design/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/substitution_and_section_tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/substitution-and-section-tags/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/whats_the_recommended_message_size_limit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Format_Content/responsive_templates_and_design.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/cross-platform-html-design/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Choose_Content/a_b_testing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/can_i_use_substitution_tags_in_subject_lines.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/change_email_content_after_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/content_delivery_networks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/content-delivery-networks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/custom_ssl_configurations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/custom-ssl-configurations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/substitution_and_section_tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/substitution-and-section-tags/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/embedding_videos_in_your_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/link_shorteners.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/universal_links.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/universal-links/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/whats_the_recommended_message_size_limit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Add_Content/attachments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/attachments-with-digioh/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Choose_Content/adaptive_email_content.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Choose_Content/brand_consistency_why_its_important.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/how-to-maintain-brand-standards-in-your-email-designs/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Choose_Content/gmail_promotions_tab.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/i-fought-the-tabs-and-the-tabs-won/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Choose_Content/personalization_making_your_messages_count.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/create-more-personalized-email-content-and-turn-engagement-into-revenue/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Format_Content/html_formatting_issues.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/formatting-html/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/cross-platform-html-design/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/Format_Content/plain_text_emails_converted_to_html.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/cross-platform-html-design/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Build/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/api_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/all_you_need_to_know_about_whitelabeling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/bacn_its_whats_for_dinner.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/email_deliverability_101.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/warming_up_ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/how_to_warm_up_your_ip_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/how_to_warm_up_your_ip_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/keep_in_touch_the_importance_of_engagement.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/sendgrids_recommended_sending_practices_and_methods.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/suppressions_vs_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/the_art_of_notifications.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/notifications/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/russian_data_localization_law.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/unsubscribes_explained.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/affiliate_lists_and_list_sharing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/let_old_addresses_sleep_in_peace.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/list_scrubbing_guide.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/list_scrubbing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/peer_initiated_email_invitation_requirements.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/preference_centers_giving_subscribers_control.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/role_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/tips_to_keep_your_list_organized.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/where_did_you_get_my_address_permission_reminders.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/why_purchase_lists_when_you_can.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/why_purchased_email_lists_are_no_good.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/aol_dmarc_changes_refused_due_to_provided_dmarc_policy.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/aol-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/dkim_settings_for_whitelabel_pro100k_and_higher.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/dkim_settings_for_whitelabel_pro100k_and_higher.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/gmail_dmarc_changes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/gmail-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/internet_standards_spf_and_dkim_and_deliverability.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-dkim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/spf_dont_exceed_ten_dns_lookups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-dkim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/spf_records_explained.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-records/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/the_importance_of_a_physical_mailing_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/yahoo-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/google_feedback_loop_spam_complaints.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/ui_my_emails_arent_being_delivered.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/how_can_i_guarantee_my_emails_arrive_in_my_recipients_inbox.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/how_do_i_keep_emails_from_dropping.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/how_sendgrid_handles_550_requested_action_not_taken_mailbox_unavailable_bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/my_emails_are_being_blocked.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/my_emails_are_being_dropped.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/my_emails_are_going_to_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/spam_trapped.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/what_do_i_do_if_im_blacklisted.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/enabling_custom_dkim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-dkim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/sendgrids_recommended_sending_practices_and_methods.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Undeliverable_Email/how_can_i_guarantee_my_emails_arrive_in_my_recipients_inbox.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Undeliverable_Email/my_emails_are_being_blocked.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/why_purchase_lists_when_you_can.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/buying-email-lists-3-reasons-why-you-shouldnt/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/bacn_its_whats_for_dinner.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/IP_reputation_montoring.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated-ip-addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/email_deliverability_101.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"resource/general-data-protection-regulation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/suppressions_vs_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/global-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/the_art_of_notifications.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/notifications/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/global-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/shared_ip_throttling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/gmail-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/aol_dmarc_changes_refused_due_to_provided_dmarc_policy.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/aol-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/microsoft-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/yahoo-dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/spf_records_explained.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-records/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-limitations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/the_importance_of_a_physical_mailing_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/spf-dkim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/help_my_emails_arent_being_delivered.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/how_do_i_keep_emails_from_dropping.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/my_emails_are_being_dropped.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/my_emails_are_going_to_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/my_emails_are_going_to_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/what_do_i_do_if_im_blacklisted.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/blacklists/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/spam_trapped.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/spam-traps/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/google_feedback_loop_spam_complaints.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/why_is_sendgrid_net_greylisted.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/sendgrid.net-greylisted/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/how_can_i_schedule_emails_to_send_at_specific_times.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/scheduling-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/seeing_a_delay_with_your_first_few_sends.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_stop_a_send_in_progress.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/stopping-an-in-progress-send/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/api_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_send_from_multiple_domains.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_send_from_multiple_from_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/email_to_sms.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-to-sms/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/how_do_i_send_mail_through_subuser_accounts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/sendmail_relay_all_local_mail_through_sendgrid.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/sendmail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/sending.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_resend_messages_that_were_dropped.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/drops/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_send_adult_content_in_my_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/can-i-send-adult-content-in-my-emails/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/can_i_send_to_purchased_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/buying-email-lists-3-reasons-why-you-shouldnt/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/welcome_emails_making_a_good_first_impression.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/how-to-send-the-perfect-welcome-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/resubscription_of_users.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/segmenting_traffic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/segmenting-your-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/resubscription_of_users.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/can_i_send_from_multiple_domains.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/can_i_send_from_multiple_from_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/email_to_sms.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-to-sms/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/sendmail_relay_all_local_mail_through_sendgrid.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/sendmail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/unauthenticated_sender.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/v3_Mail_Send/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"https://sendgrid.api-docs.io/v3.0/mail-send\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/migrating-from-v2-to-v3-mail-send/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/v3_Mail_Send/personalizations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/personalizations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/v3_Mail_Send/sandbox_mode.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sandbox-mode/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/v3_Mail_Send/v3_mail_send_faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/v3-mail-send-faq/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/What_You_Can_Send/can_i_send_adult_content_in_my_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/can-i-send-adult-content-in-my-emails/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/What_You_Can_Send/welcome_emails_making_a_good_first_impression.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/how-to-send-the-perfect-welcome-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/stopping-a-scheduled-send/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/stopping-an-in-progress-send/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/scheduling-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/what_do_all_these_delivery_statistics_mean.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/discrepancies_between_requests_and_deliveries.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-activity-feed \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/can_i_download_a_list_of_click_and_or_open_events.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/email-activity-feed \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/how_can_i_tell_if_an_email_was_actually_delivered.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/google_analytics_demystified_ga_statistics_vs_sg_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/google-analytics \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/sendwithus.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"https://support.sendwithus.com/esp_accounts/connect_sendgrid/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/new_relic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/tracking-stats-using-new-relic \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/is_there_a_way_to_see_the_content_of_transactional_emails_i_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/bounce_forwarding_and_gmail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/bounce_reports_how_can_i_be_notified.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/common_smtp_server_bounce_responses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/delete_from_bounce_list_option_in_email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/implementing_bounce_notification_for_multiple_from_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/click_tracking_html_best_practices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking-html-best-practices/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/clicktracking_ssl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/clicktracking-ssl \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/delivery_rate_drops_rate.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/drops/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/drop_reason_unsubscribed_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/drops/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/#-Bounce-Notifications\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/how_to_set_up_bounce_forwarding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/#-Bounce-Notifications\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/click_tracking_links_have_stopped_working.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/drop_reason_bounced_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-filters/#bypass_list_management\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/how_do_i_unsubscribe_a_user.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/unsubscribe_via_subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/subscription-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Introduction/what_do_all_these_delivery_statistics_mean.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/sendwithus.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"https://support.sendwithus.com/esp_accounts/connect_sendgrid/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/unsubscribe_via_the_subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/subscription-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/a_guide_for_tracking_data_with_keen_io.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/tracking-data-with-keen-io/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/google_analytics_demystified_ga_statistics_vs_sg_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/google-analytics/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/is_there_a_way_to_see_the_content_of_transactional_emails_i_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/new_relic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/tracking-stats-using-new-relic/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Clicks/click_tracking_links_with_substitution_tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Clicks/click_tracking_html_best_practices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking-html-best-practices/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Clicks/click_tracking_links_have_stopped_working.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Clicks/clicktracking_ssl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking-ssl/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Unsubscribes/how_do_i_unsubscribe_a_user.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Unsubscribes/list_unsubscribe.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubcribe-groups \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/subscription-tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_can_i_turn_off_2_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_any_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/account_under_review_suspended.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account-under-review/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/cant_access_the_email_address_on_file_for_your_sendgrid_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/accessing-email-account-associated-with-sendgrid/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/cant_log_in_to_your_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/log-in-issues/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/dont_know_your_user_name.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/help_i_cant_find_my_smtp_username_and_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/help_my_account_has_been_compromised.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account-compromised/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/heroku_users_find_your_sendgrid_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/heroku-credentials \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_can_i_turn_off_2_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_to_change_password_when_integrated_via_appdirect.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-appdirect/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_account_via_softlayer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-softlayer/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-azure/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_openshift.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-openshift/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_to_change_the_password_for_your_sendgrid_add_on_via_the_ibm_cloud_marketplace.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-ibm-cloud-marketplace/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/i_didnt_receive_the_password_reset_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/my_provision_was_declined_what_should_i_do.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/you_cannot_change_your_package_at_this_time_because_your_account_is_not_active.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_may_not_be_able_to_send_out_any_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/your_account_is_still_being_provisioned_you_will_not_be_able_to_send_out_any_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/your_sendgrid_account_is_at_risk_for_suspension_what_should_i_do.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account-under-review/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/email_was_deferred_due_to_the_following_reasons_ip_deferrals_messages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/emails_are_being_sent_multiple_times.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/my_client_is_complaining_that_they_have_not_received_an_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/testing_your_connectivity_to_sendgrids_smtp_relay_usinng_telnet.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/troubleshooting_delays_and_latency.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/safely-test-your-sending-speed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/a_custom_field_did_not_substitute_during_a_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/certificate_verification_failed.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/dns_records_and_underscores.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/how_do_i_check_the_headers_raw_source_of_an_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/checking-email-source/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/troubleshooting-sender-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/invalid_smtp_api_header.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/list_upload_troubleshooting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/formatting-a-csv/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/upgrading_your_whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/you_have_used_a_reserved_field_name_for_your_custom_field.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/email_was_deferred_due_to_the_following_reasons_ip_deferrals_messages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account-under-review/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/accessing-email-associated-with-sendgrid/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/log-in-issues/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account-compromised/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/heroku-credentials/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_password_when_integrated_via_appdirect.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-appdirect/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_account_via_softlayer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-softlayer/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-azure/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_password_when_integrated_via_appdirect.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-appdirect/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_openshift.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-openshift/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/heroku-credentials/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_the_ibm_cloud_marketplace.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-ibm-cloud-marketplace/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/ip-access-management/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/my_provision_was_declined_what_should_i_do.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/you_cannot_change_your_package_at_this_time_because_your_account_is_not_active.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/checking-email-source/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/safely_test_your_sending_speed.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/safely-test-your-sending-speed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/troubleshooting-delays-and-latency \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/advanced_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/alerts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/categories/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/email_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/Email_Types/peer_invitations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/peer-invitations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/ip_whitelabeling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/bulk_sender_notification.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/index \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/provisioning.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/marketing_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-marketing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_error_messages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/sender_reputation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"blog/what-is-a-domain-reputation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/triggering_events.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/automated-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/outlook_2010.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/outlook-2013/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Tutorials/EngineYard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/engineyard/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Tutorials/OpenShift.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-openshift/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Tutorials/WindowsAzure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/microsoft-azure/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/segment/sendgrid_source.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/wordpress.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-faq/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/libraries.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/libraries/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/analytics_with_keen_io.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/analytics-with-keen-io/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/BriteVerify.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/brite-verify/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Formio.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/formio/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/CloudRail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/cloud-rail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/OpenShift.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/password-reset-openshift/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WindowsAzure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/azure/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/event_kit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event-kit/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Segment/sendgrid_source.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/segment-sendgrid-source/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-faq/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/wordpress_integration_faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-faq/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/sendgrid_wordpress_plugin.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-plugin/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/subscription_widget.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-subscription-widget/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/subscription_widget.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-subscription-widget/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/WordPress/subscription_widget.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/wordpress-subscription-widget/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_for_gravity_forms_submissions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-for-gravity-forms-submissions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_for_new_webhook_data.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-for-new-webhook-data/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-for-postgre-sql-row-matches/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_from_google_sheet_rows.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-from-google-sheet-rows/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_to_tagged_infusionsoft_contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-to-tagged-infusionsoft-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zapier-sending-when-new-firebase-child-records-added/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/applemail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/applemail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/outlook_2013.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/outlook-2013/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/outlook.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/outlook/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/thunderbird.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/thunderbird/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Clients/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/applemail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Amazon_Marketplace.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/amazon-marketplace/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Google.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/google/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/magento.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/magento/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/magento/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Partners/Microsoft_Azure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/microsoft-azure/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Other/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/interspire/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Other/interspire.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/interspire/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Other/sugarcrm.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sugarcrm/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/magento.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/partners/magento/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/modex.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/modex/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/joomla.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/joomla/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/joomla/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/drupal.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/drupal/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Open_Source_Apps/phpbb.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/phpbb/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/exchange_2010.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/exchange-2010/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/exim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/exim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/iis75.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/iis75/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/postfix.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/postfix/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/qmail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/qmail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/sendmail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sendmail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/ssmtp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/ssmtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Mail_Servers/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/exim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/cakephp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/cakephp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/codeigniter.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/codeigniter/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/django.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/django/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/laravel/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/laravel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/laravel/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/rubyonrails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/rubyonrails/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/symfony.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/symfony/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Frameworks/zend.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/zend/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/csharp-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/php-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/python-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/Webhook_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking_events/nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-perl-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-php-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-python-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/smtp-ruby-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-csharp-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/java.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-java-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-ruby-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/perl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-perl-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-php-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-python-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-ruby-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v2_Mail/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v2-nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/csharp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-csharp-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/go.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-go-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/java.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-java-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/nodejs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-nodejs-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/php.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-php-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/python.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-python-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/ruby.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-ruby-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/v3_Mail/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/v3-java-code-example/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Integrate/Code_Examples/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"sending-email/libraries/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/Email_Marketing_Campaigns/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/create_manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/Email_Marketing_Campaigns/peer_invitations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/peer-invitations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/Email_Marketing_Campaigns/reconfirmation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reconfirmation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/recipients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Marketing_Emails/sender_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Transactional_Email/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Transactional_Email/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Transactional_Email/Template_Engine/setup_guide.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/about.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/api_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/global_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/multiple_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/profile_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/Account_Settings/two_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/billing_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/billing_history.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/billing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Account/alert_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/advanced_suppression_manager.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/address_whitelisting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/bcc.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/#-BCC\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/bypass_list_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-filters #bypass_list_management\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/click_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking #-Click-tracking\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/dkim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/domain_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-set-up-domain-whitelabel \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/email_templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/event_notification.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/#-Event-Notification\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/footer.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/#-Footer\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/forward_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/#-Forward-Spam\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/google_analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/new_relic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/partners #-SendGrid-For-New-Relic\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/open_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking #-Open-Tracking\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/sendwithus.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/partners #-sendwithus\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/spam_checker.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/#-Spam-Checker\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/subscription_tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking #-Subscription-Tracking\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Apps/template_engine.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/attachments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/attachments-with-digioh \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/billing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/clicktracking_ssl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/content-delivery-networks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/advanced_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/alerts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/email_error_messages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/email_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/attachments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/attachments-with-digioh \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/categories/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/list_scrubbing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Delivery_Metrics/metrics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/scheduling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/scheduling-parameters/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/sender_reputation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/sender-reputation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/advanced_suppression_manager.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/defining_asm_groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/recipient_subscription_preferences.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Subscription_Tracking/using_suppression_groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/advanced_suppression_manager.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/defining_asm_groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/recipient_subscription_preferences.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/resubscription_of_users.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/suppressions_vs_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Suppression_Tracking/using_suppression_groups.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Undelivered_Email/bounce_forwarding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Undelivered_Email/drops.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/drops/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Undelivered_Email/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/undelivered-email \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Deliverability/Undelivered_Email/spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Email_Settings/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/categories/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/managing_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Marketing_Campaigns/contactdb/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/api_campaigns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"API_Reference/Web_API_v3/Marketing_Campaigns/campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"https://support.sendgrid.com/ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/create_manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/recipients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/sender_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Emails/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/multiple_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/peer_invitations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/peer-invitations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/reconfirmation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reconfirmation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/sending_practices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/rate-limiting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/multiple_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/clicktracking_ssl.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/click-tracking-ssl/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/content_delivery_networks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/content-delivery-networks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Segmenting_Your_Traffic/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/segmenting-your-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Segmenting_Your_Traffic/subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/smtp_ports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/warming_up_ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/warming_up.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Whitelabeling/dns_setup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Whitelabeling/spf.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spf/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Setting_Up_Your_Server/Whitelabeling/whitelabel_wizard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/alert_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/dkim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/domain_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/gravatar.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated-ip-addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/smtp_ports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/template_engine_setup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/throttling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/throttling/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/two_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Email/Template_Engine/setup_guide.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/warming_up.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/whitelabel_wizard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/multifactor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/multifactor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Campaigns/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Campaigns/a_b_testing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/design_editor.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/code_editor.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/beta_editors.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/create_manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/recipients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/sender_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Features/Marketing_Emails/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Utilities/event_kit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event-kit/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Utilities/deliverabilitycenter.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/deliverability/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Utilities/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Utilities/list_assist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Utilities/smtpapi_validator.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/sending-email-smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Template_Engine/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/API_Reference/Web_API_v3/Transactional_Templates/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Template_Engine/smtpapi.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/API_Reference/Web_API_v3/Transactional_Templates/smtpapi/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Template_Engine/templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/API_Reference/Web_API_v3/Transactional_Templates/templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Web_API_v3/Template_Engine/versions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/API_Reference/Web_API_v3/Transactional_Templates/versions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Templates/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Templates/create_edit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Templates/manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/advanced_suppression_manager.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Email_Activity/activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Event_Notification/configure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Event_Notification/eventkit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event-kit/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Event_Notification/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Tools/listassist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Analytics/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Analytics/marketing_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Analytics/unsubscribe_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Design/drag_and_drop.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Design/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Design/newsletter_basics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Design/subscription_widget.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Design/weblink.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/marketing_emails_setup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Recipients/exporting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"/ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Recipients/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Recipients/recipient_list.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Review_and_Schedule/scheduling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Review_and_Schedule/split_testing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Setup/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Subuser/create_subuser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Subuser/create_subuser_whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/template_engine.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Template_Engine/template_engine.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Tools/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"docs \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Whitelabel/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"VidGrid/Marketing_Emails/Review_and_Schedule/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/campaigns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/beta_editors.html#-Edit-HTML-Head\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/analytics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/create_manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/recipients.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/sender_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/tags.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/migration_checklist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_recipient_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_images.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/downloading_historical_statistics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/api_migration.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/Migrating_API.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/campaign_building.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/contact_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/statistics_reporting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/pricing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/api_comparison.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Side_by_Side_Comparisons/security_compliance.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_content.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/letter_from_our_CPO.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migrating_content.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migrating_images.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migrating_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/migrating_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/list_scrubbing_guide.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/where_did_you_get_my_address_permission_reminders.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/opt_in_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/preference_centers_giving_subscribers_control.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui//managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/security_checklist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/hippa-compliant/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/secure_upload_download_supression_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/hippa-compliant/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/keeping_your_registration_form_secure.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/hippa-compliant/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/is_sendgrid_pci_compliant.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/pci-compliant/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/is_sendgrid_hipaa_compliant.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/hippa-compliant/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Security/dont_share_your_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/marketing_campaigns_video_tutorials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/marketing_campaigns_video_tutorials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/dont_know_your_username.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/reset-username-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Delivery_Metrics/metrics.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Subusers/impersonation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Subusers/settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Subusers/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/what_are_subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/why_am_i_seeing_credential_resource_already_exists_when_i_am_creating_a_subuser_or_credential.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/How_Emails_Are_Sent/how_do_i_send_mail_through_subuser_accounts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/how_can_i_cancel_my_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/cancel-your-account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/SMTP_API/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/building-an-smtp-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/SMTP_API/using_the_smtp_api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/building-an-smtp-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/common_smtp_server_bounce_responses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/certificate_verification_failed.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/invalid_smtp_api_header.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/sending-email/smtp-errors-and-troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/drag_drop.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/recovering_your_username.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/reset-username-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/ip_warmup_schedule.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/warming_up_ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Misc/automated_ip_warmup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/how_to_read_your_invoice.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/reading-your-invoice/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/lite_account_minimum_charge.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/legacy_lite_plan.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/is_your_account_billing_warned.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/is_your_account_billing_frozen.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/i_would_like_to_request_a_refund.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/i_would_like_to_request_a_refund.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/how_does_overage_pricing_work.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/how_does_billing_work_for_legacy_newsletter.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/did_you_receive_a_billing_notification.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/billing_info_and_faqs.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/why_are_the_pro_plans_recommended_above_all_others.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"pricing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/sending_practices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/where_can_i_find_my_invoices.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/reading-your-invoice/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Billing/alternate_payment_methods.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/max_hourly_limit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/max_connection_limit.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Delivery_Issues/my_client_is_complaining_that_they_have_not_received_an_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Introduction/how_can_i_tell_if_an_email_was_actually_delivered.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Introduction/discrepancies_between_requests_and_deliveries.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Drops/resend_dropped_messages.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Drops/drop_reason_unsubscribed_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Drops/drop_reason_bounced_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Collecting_Data/can_i_download_a_list_of_click_and_or_open_events.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/bounce_reports_how_can_i_be_notified.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Track/Bounces/bounce_forwarding_and_gmail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Undeliverable_Email/why_did_my_message_show_as_delivered_first_then_as_bounced.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"search.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"docs\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/list_upload_troubleshooting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/formatting-a-csv/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/how_to_remove_unusable_contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Compliance/improving_contact_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/segmenting-your-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/Who_You_Can_Send_To/resubscription_of_users.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/segmenting-your-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Send/Who_You_Can_Send_To/can_i_send_to_purchased_lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/creating_teammates_for_subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/what_is_the_difference_between_subusers_and_multiple_credentials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/resetting_your_password_as_a_teammate.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Account_Administration/teammates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Account/teammates_faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/a_custom_field_value_did_not_substitute_during_a_send.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/contact_fields.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.html#\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Marketing_Campaigns/contact_fields.html#\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/format_CSV.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/formatting-a-csv/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/email_activity_beta.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/event.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/event_deprecated.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/debug.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event-webhook/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/Webhooks/inbound_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/parsing-email/inbound-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/API/why_event_api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"for-developers/tracking-events/event-webhook/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Release_Notes/release_notes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"release-notes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Templates/manage.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Templates/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"http://sendgrid.com/ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Templates/how_to_send_an_email_with_dynamic_transactional_templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Templates/using_handlebars.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/using-handlebars/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/ips.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/links.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-link-branding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/domains.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/overview.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_Authentication/how-to-set-up-domain-authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/upgrading_your_whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Troubleshooting/Authentication/dns_records_and_underscores.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/troubleshooting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/whitelabel_vs_whitelist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/whitelabel/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/subuser_whitelabels.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/setup_domain_whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/link_whitelabels_explained.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-link-branding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/providers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dns-providers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Whitelabel/faq.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/whitelabel/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_Authentication/How_to_set_up_reverse_DNS.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_Authentication/how-to-set-up-link-branding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-link-branding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Classroom/Basics/Whitelabel/setup_ip_whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/email_activity_feed.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/email-activity-feed/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/SendGrid_for_Mobile/dashboard.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/SendGrid_for_Mobile/email_activity.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/SendGrid_for_Mobile/suppression.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/SendGrid_for_Mobile/subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/SendGrid_for_Mobile/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Legacy_Newsletter/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/legacy-newsletter-sunset/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/getting_started.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/how-to-send-email-with-marketing-campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/notifications.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/notifications/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/editor.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/senders.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/custom_fields.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/a_b_testing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/a-b-testing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/campaign_stats.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/marketing-campaigns-stats/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Old_Editor_Sunset.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/editor/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/building-your-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/create-and-manage-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Managing_Contacts/formatting_a_CSV.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/formatting-a-csv/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/managing-contact-list/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/managing-contacts/segmenting-your-contacts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/stats-overview/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/browser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/browser/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/categories/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/device.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/device/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/geo.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/geographic/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/global.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/global/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/mailbox_provider.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/mailbox-provider/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/mailbox_provider_compare.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/mailbox-provider-comparison/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/parse.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"/for-developers/parsing-email/inbound-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/subuser.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/subuser/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Statistics/subuser_compare.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/subuser-comparison/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/index-suppressions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/advanced_suppression_manager.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/unsubscribe-groups/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/blocks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/blocks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/bounces/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/global_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/global-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/group_unsubscribes.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/group-unsubscribes/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/invalid_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/invalid-emails/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/recipient_subscription_preferences.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/recipient-subscription-preferences/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Suppressions/spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/analytics-and-reporting/spam-reports/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/create-and-edit-transactional-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/alerts.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/alerts/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/api_keys.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/api-keys/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/billing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/billing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/cancel_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/cancel-your-account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/dedicated_ip_addresses.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dedicated-ip-addresses/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/ip_access_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/ip-access-management/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/ip_warmup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/sending-email/warming-up-an-ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/mail.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/mail/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/parse.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/inbound-parse/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/partners.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/partners/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/reading_your_invoice.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/reading-your-invoice/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/reset_username_password.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/resetting-your-username-and-password/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/subusers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/subusers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/teammates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/tracking.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/tracking/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/two_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/two-factor-authentication/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/how-to-set-up-domain-authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/how-to-set-up-link-branding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-link-branding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/how-to-set-up-reverse-dns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/how-to-set-up-reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/Troubleshooting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/troubleshooting-sender-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"User_Guide/Settings/Sender_authentication/providers.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"ui/account-and-settings/dns-providers/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/index.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/index/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/7_bit_encoding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/7-bit-encoding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/a_record.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/a-record/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/automated_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/automated-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/autoresponder.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/autoresponder/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/bayesian_filter.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/bayesian-filter/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/black_hat_sender.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/black-hat-sender/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/blacklists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/blacklists/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/blocks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/blocks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/bounces.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/bounces/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/bulk_email_service.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/bulk-email-service/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/bulk_mail_folder.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/bulk-mail-folder/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/campaigns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/campaigns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/can_spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/can-spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/categories.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/categories/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/challenge_response.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/challenge-response/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/clicks.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/clicks/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/cname.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/cname/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/complaint.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/complaint/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/ctr.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/ctr/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/custom_fields.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/custom-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/deferrals.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/deferrals/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/deliveries.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/deliveries/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/dkim.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/dkim/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/dmarc.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/dmarc/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/dns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/domain.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/domain/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/domain_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/domain-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/drip_campaign.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/drip-campaign/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"glossary/drops/.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/drops/ \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_api_integration.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-api-integration/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_deliverability.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/deliverability/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_harvesting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-harvesting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_marketing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-marketing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/email_service_provider.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/email-service-provider \"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/event_webhook.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/event-webhook/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/expired.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/expired/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/feedback_loop.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/feedback-loop/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/header.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/header/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/imap.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/imap/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/invalid_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/invalid-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/ip_address.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/ip-address/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/ip_warmup.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/ip-warmup/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/link_branding.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/link-branding/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/lists.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/lists/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/mail_merge.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/mail-merge/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/mailbox_provider.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/mailbox-provider/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/message_id.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/message-id/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/mta.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/mta/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/mx_record.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/mx-record/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/open_rate.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/open-rate/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/openrelay.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/openrelay/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/peer_invitations.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/peer-invitations/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/preheader.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/preheader/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/rate_limiting.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/rate-limiting/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/reconfirmation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reconfirmation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/reputation_monitoring.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reputation-monitoring/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/request.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/request/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/reseller_email_account.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reseller-email-account/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/reserved_fields.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reserved-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/reverse_dns.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/reverse-dns/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/scheduled_emails.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/scheduled-emails/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/segments.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/segments/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/segmentation.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/segmentation/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/senders.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/senders/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/sender_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/sender-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp_api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp-api/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp_provider.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp-provider/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp_relay.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp-relay/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp_server.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp-server/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/smtp_service.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/smtp-service/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spam.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spam/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spam_filter.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spam-filter/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spam_reports.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spam-reports/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spam_traps.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spam-traps/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spf.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spf/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/spoofing.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/spoofing/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/subjects.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/subjects/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/subscriber_list_management.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/subscriber-list-management/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/system_fields.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/system-fields/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/teammates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/teammates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/throttling.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/throttling/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/timezone.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/timezone/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/tls.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/tls/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/transactional_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/transactional-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/transactional_email_templates.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/transactional-email-templates/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/triggered_actions.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/triggered-actions/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/triggered_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/triggered-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/two_factor_authentication.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/two-factor-authentication/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/undelivered_email.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/undelivered-email/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/unknown_user.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/unknown-user/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/web_api.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/web-api/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/white_hat_sender.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/white-hat-sender/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/whitelabel.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/whitelabel/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/whitelist.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/whitelist/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"Glossary/x_message_id.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"glossary/x-message-id/\"\n      }\n    },\n    {\n      \"Condition\": {\n        \"KeyPrefixEquals\": \"API_Reference/api_v3.html\"\n      },\n      \"Redirect\": {\n        \"HostName\": \"sendgrid.com\",\n        \"HttpRedirectCode\": \"301\",\n        \"Protocol\": \"https\",\n        \"ReplaceKeyPrefixWith\": \"api-reference/\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "static/images/RT_1.0.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>SendGrid | Log into Support</title>\n  <link rel=\"stylesheet\" media=\"all\" href=\"/support/sso/assets/application-bbcd2d0fcb2631ecea45a10b20befe00.css\" data-turbolinks-track=\"true\" />\n  <script src=\"/support/sso/assets/application-153dc589412185c947a0fada84c1277c.js\" data-turbolinks-track=\"true\"></script>\n  <meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"btME/3yWZyPJOgjASrtsS1UJcMTjRsp/PAJGS7GxtO+yWJc+n/xbBktT0oLNz1E5atrlPx3JjSPtVut7JpLYxw==\" />\n</head>\n<body>\n\n<!DOCTYPE html>\n<html>\n\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <title>SendGrid | Log into Support</title>\n        <meta name=\"description\" content=\"Log into support page\">\n        <link href=\"//assets1.sendgrid.com/mkt/assets/favicon-c9e8b9e502d4a85f669c7cf4843616b6.png\" rel=\"Shortcut Icon\">\n    </head>\n    <body>\n        <header id=\"header\">\n            <div class=\"container\">\n                <a href=\"https://sendgrid.com\"><img id=\"header-sendgrid-logo\" src=\"/support/sso/assets/sendgrid_logo-41c45902673c5acf2e98ac76b27b5e68.png\" alt=\"SendGrid logo\" /></a>\n            </div>\n        </header>\n        <div id=\"login\">\n            <div id=\"login-header\" style=\"display: table;\">\n                <div style=\"display: table-row; width:100%;\">\n                    <div style=\"display: table-cell;\">\n                    <img id=\"sendgrid-icon\" src=\"/support/sso/assets/SG_logo-ed59078694ac3a11d4c1e0f9e0102e33.svg\" alt=\"Sg logo\" />\n                    </div>\n                    <div style=\"display: table-cell; width:100%;\">\n                    <h1>Log Into Support</h1>\n                    </div>\n                </div>\n            </div>\n                <div class=\"login\">\n                <form action=\"/support/sso/login\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"WFSZq/h9hYHJ3NnW7O89mUjD6x+zWaxhriXGvNLB5iCE3wpqGxe5pEu1A5RrmwDrdxB+5E3W6z1/cWuMReKKCA==\" />\n\n                 <fieldset>\n                <label class=\"label\">User Name</label>\n                <input type=\"text\" name=\"username\" id=\"username\" value=\"\" required=\"required\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                <label class=\"label\">Password</label>\n                <input type=\"password\" name=\"password\" id=\"password\" value=\"\" required=\"required\" autocomplete=\"off\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                    <input id=\"check\" type=\"checkbox\" name=\"remember\">\n                    <label id=\"rmb\" for=\"check\">Remember me</label>\n                </fieldset>\n\n                <input type=\"hidden\" name=\"return_to\" id=\"return_to\" value=\"https://support.sendgrid.com/hc/article_attachments/200701928/RT_1.0.html\" />\n\n                <input type=\"submit\" name=\"commit\" value=\"Sign In\" id=\"btn-login\" />\n</form>            <p>Don't have a SendGrid Account?<a href=\"https://sendgrid.com/transactional-email/pricing\"> Sign Up</a></p>\n            <p>Forgot Password?<a href=\"https://sendgrid.com/user/forgotPassword\"> Click Here</a></p>\n            <div id=\"docs\">\n                <img id=\"docs-icon\" src=\"/support/sso/assets/docs_icon-0e5bb41ee48ece300c27f69676de3527.png\" alt=\"Docs icon\" />Are you looking for our <a href=\"https://sendgrid.com/docs/\">Documentation</a>?\n            </div>\n        </div>\n        <footer id=\"footer\">\n            <div class=\"container\">\n                <ul>\n                  <li>© 2015 SendGrid</li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/tos\" id=\"footer-tos\">Terms of Service</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/email_policy\" id=\"footer-email-policy\">Email Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/privacy\" id=\"footer-privacy-policy\">Privacy Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/security\" id=\"footer-security\">Security</a></li>\n                </ul>\n            </div>\n        </footer>\n    </body>\n</html>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/images/RT_2.0.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>SendGrid | Log into Support</title>\n  <link rel=\"stylesheet\" media=\"all\" href=\"/support/sso/assets/application-bbcd2d0fcb2631ecea45a10b20befe00.css\" data-turbolinks-track=\"true\" />\n  <script src=\"/support/sso/assets/application-153dc589412185c947a0fada84c1277c.js\" data-turbolinks-track=\"true\"></script>\n  <meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"5MjWSqJwYbYfCTP7R8umhuqHvrmNtaglahDlXLOZ7bpUWwElH72hlXJHR+cubX64mhQn/c9e51DexMSwaSQfgA==\" />\n</head>\n<body>\n\n<!DOCTYPE html>\n<html>\n\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <title>SendGrid | Log into Support</title>\n        <meta name=\"description\" content=\"Log into support page\">\n        <link href=\"//assets1.sendgrid.com/mkt/assets/favicon-c9e8b9e502d4a85f669c7cf4843616b6.png\" rel=\"Shortcut Icon\">\n    </head>\n    <body>\n        <header id=\"header\">\n            <div class=\"container\">\n                <a href=\"https://sendgrid.com\"><img id=\"header-sendgrid-logo\" src=\"/support/sso/assets/sendgrid_logo-41c45902673c5acf2e98ac76b27b5e68.png\" alt=\"SendGrid logo\" /></a>\n            </div>\n        </header>\n        <div id=\"login\">\n            <div id=\"login-header\" style=\"display: table;\">\n                <div style=\"display: table-row; width:100%;\">\n                    <div style=\"display: table-cell;\">\n                    <img id=\"sendgrid-icon\" src=\"/support/sso/assets/SG_logo-ed59078694ac3a11d4c1e0f9e0102e33.svg\" alt=\"Sg logo\" />\n                    </div>\n                    <div style=\"display: table-cell; width:100%;\">\n                    <h1>Log Into Support</h1>\n                    </div>\n                </div>\n            </div>\n                <div class=\"login\">\n                <form action=\"/support/sso/login\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"cSwEFJuxGxRLoJrHOXUZj9oOBLjfEDDaRfraCaRjqjbBv9N7JnzbNybu7ttQ08Gxqp2d/J37f6/xLvvlft5YDA==\" />\n\n                 <fieldset>\n                <label class=\"label\">User Name</label>\n                <input type=\"text\" name=\"username\" id=\"username\" value=\"\" required=\"required\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                <label class=\"label\">Password</label>\n                <input type=\"password\" name=\"password\" id=\"password\" value=\"\" required=\"required\" autocomplete=\"off\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                    <input id=\"check\" type=\"checkbox\" name=\"remember\">\n                    <label id=\"rmb\" for=\"check\">Remember me</label>\n                </fieldset>\n\n                <input type=\"hidden\" name=\"return_to\" id=\"return_to\" value=\"https://support.sendgrid.com/hc/article_attachments/200745933/RT_2.0.html\" />\n\n                <input type=\"submit\" name=\"commit\" value=\"Sign In\" id=\"btn-login\" />\n</form>            <p>Don't have a SendGrid Account?<a href=\"https://sendgrid.com/transactional-email/pricing\"> Sign Up</a></p>\n            <p>Forgot Password?<a href=\"https://sendgrid.com/user/forgotPassword\"> Click Here</a></p>\n            <div id=\"docs\">\n                <img id=\"docs-icon\" src=\"/support/sso/assets/docs_icon-0e5bb41ee48ece300c27f69676de3527.png\" alt=\"Docs icon\" />Are you looking for our <a href=\"https://sendgrid.com/docs/\">Documentation</a>?\n            </div>\n        </div>\n        <footer id=\"footer\">\n            <div class=\"container\">\n                <ul>\n                  <li>© 2015 SendGrid</li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/tos\" id=\"footer-tos\">Terms of Service</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/email_policy\" id=\"footer-email-policy\">Email Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/privacy\" id=\"footer-privacy-policy\">Privacy Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/security\" id=\"footer-security\">Security</a></li>\n                </ul>\n            </div>\n        </footer>\n    </body>\n</html>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/images/RT_3.0.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>SendGrid | Log into Support</title>\n  <link rel=\"stylesheet\" media=\"all\" href=\"/support/sso/assets/application-bbcd2d0fcb2631ecea45a10b20befe00.css\" data-turbolinks-track=\"true\" />\n  <script src=\"/support/sso/assets/application-153dc589412185c947a0fada84c1277c.js\" data-turbolinks-track=\"true\"></script>\n  <meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"OiQqV/fi0NMsedEBR9zDiDebONs6QQZjyIoP2WowFnmhC0ZhWM0MvlOqXDeUPbR+j9kqlz5vkZItdmNGLXiNEg==\" />\n</head>\n<body>\n\n<!DOCTYPE html>\n<html>\n\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <title>SendGrid | Log into Support</title>\n        <meta name=\"description\" content=\"Log into support page\">\n        <link href=\"//assets1.sendgrid.com/mkt/assets/favicon-c9e8b9e502d4a85f669c7cf4843616b6.png\" rel=\"Shortcut Icon\">\n    </head>\n    <body>\n        <header id=\"header\">\n            <div class=\"container\">\n                <a href=\"https://sendgrid.com\"><img id=\"header-sendgrid-logo\" src=\"/support/sso/assets/sendgrid_logo-41c45902673c5acf2e98ac76b27b5e68.png\" alt=\"SendGrid logo\" /></a>\n            </div>\n        </header>\n        <div id=\"login\">\n            <div id=\"login-header\" style=\"display: table;\">\n                <div style=\"display: table-row; width:100%;\">\n                    <div style=\"display: table-cell;\">\n                    <img id=\"sendgrid-icon\" src=\"/support/sso/assets/SG_logo-ed59078694ac3a11d4c1e0f9e0102e33.svg\" alt=\"Sg logo\" />\n                    </div>\n                    <div style=\"display: table-cell; width:100%;\">\n                    <h1>Log Into Support</h1>\n                    </div>\n                </div>\n            </div>\n                <div class=\"login\">\n                <form action=\"/support/sso/login\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"20LKMuX8ve3SBQ8L/Ybe3yOtSjD6c+hFY2lcZfnbnrFAbaYEStNhgK3Wgj0uZ6kpm+9YfP5df7SGlTD6vpMF2g==\" />\n\n                 <fieldset>\n                <label class=\"label\">User Name</label>\n                <input type=\"text\" name=\"username\" id=\"username\" value=\"\" required=\"required\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                <label class=\"label\">Password</label>\n                <input type=\"password\" name=\"password\" id=\"password\" value=\"\" required=\"required\" autocomplete=\"off\" class=\"ipt\" />\n                </fieldset>\n\n                <fieldset>\n                    <input id=\"check\" type=\"checkbox\" name=\"remember\">\n                    <label id=\"rmb\" for=\"check\">Remember me</label>\n                </fieldset>\n\n                <input type=\"hidden\" name=\"return_to\" id=\"return_to\" value=\"https://support.sendgrid.com/hc/article_attachments/200769827/RT_3.0.html\" />\n\n                <input type=\"submit\" name=\"commit\" value=\"Sign In\" id=\"btn-login\" />\n</form>            <p>Don't have a SendGrid Account?<a href=\"https://sendgrid.com/transactional-email/pricing\"> Sign Up</a></p>\n            <p>Forgot Password?<a href=\"https://sendgrid.com/user/forgotPassword\"> Click Here</a></p>\n            <div id=\"docs\">\n                <img id=\"docs-icon\" src=\"/support/sso/assets/docs_icon-0e5bb41ee48ece300c27f69676de3527.png\" alt=\"Docs icon\" />Are you looking for our <a href=\"https://sendgrid.com/docs/\">Documentation</a>?\n            </div>\n        </div>\n        <footer id=\"footer\">\n            <div class=\"container\">\n                <ul>\n                  <li>© 2015 SendGrid</li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/tos\" id=\"footer-tos\">Terms of Service</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/email_policy\" id=\"footer-email-policy\">Email Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/privacy\" id=\"footer-privacy-policy\">Privacy Policy</a></li>\n                  <li>/</li>\n                  <li><a href=\"https://sendgrid.com/security\" id=\"footer-security\">Security</a></li>\n                </ul>\n            </div>\n        </footer>\n    </body>\n</html>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/images/code.txt",
    "content": "<link rel=\"apple-touch-icon-precomposed\" sizes=\"57x57\" href=\"apple-touch-icon-57x57.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"apple-touch-icon-114x114.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"apple-touch-icon-72x72.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"apple-touch-icon-144x144.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"60x60\" href=\"apple-touch-icon-60x60.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"120x120\" href=\"apple-touch-icon-120x120.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"76x76\" href=\"apple-touch-icon-76x76.png\" />\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"apple-touch-icon-152x152.png\" />\n<link rel=\"icon\" type=\"image/png\" href=\"favicon-196x196.png\" sizes=\"196x196\" />\n<link rel=\"icon\" type=\"image/png\" href=\"favicon-96x96.png\" sizes=\"96x96\" />\n<link rel=\"icon\" type=\"image/png\" href=\"favicon-32x32.png\" sizes=\"32x32\" />\n<link rel=\"icon\" type=\"image/png\" href=\"favicon-16x16.png\" sizes=\"16x16\" />\n<link rel=\"icon\" type=\"image/png\" href=\"favicon-128.png\" sizes=\"128x128\" />\n<meta name=\"application-name\" content=\"&nbsp;\"/>\n<meta name=\"msapplication-TileColor\" content=\"#FFFFFF\" />\n<meta name=\"msapplication-TileImage\" content=\"mstile-144x144.png\" />\n<meta name=\"msapplication-square70x70logo\" content=\"mstile-70x70.png\" />\n<meta name=\"msapplication-square150x150logo\" content=\"mstile-150x150.png\" />\n<meta name=\"msapplication-wide310x150logo\" content=\"mstile-310x150.png\" />\n<meta name=\"msapplication-square310x310logo\" content=\"mstile-310x310.png\" />\n"
  },
  {
    "path": "styleguide.md",
    "content": "Hello! Thank you for choosing to help contribute to the SendGrid documentation site! There are many ways you can contribute and help is always welcome. When writing documentation, we ask you to consider the following style guidelines.\n\n* [Style](#style)\n    * [Numbers](#numbers)\n    * [About additional resources](#about-additional-resources)\n    * [Cross references](#cross-references)\n    * [Head matter](#head-matter)\n* [Terminology](#terminology)\n* [Punctuation](#punctuation)\n* [Capitalization](#capitalization)\n* [Warning and info blocks](#warning-and-info-blocks)\n* [Screenshots](#screenshots)\n\n\n<a name=\"style\"></a>\n## Style\n\nWe strive to make our documentation concise, clear, organized, and scannable.\n\n* Use conversational language and industry-standard terms when possible.\n* Contractions are OK and preferred.\n* Use bulleted lists and numbered steps where applicable.\n* Use US English spelling.  \n\nWhen documenting a UI action, make it **bold**. Avoid using the word \"button\" in the step and simply refer to the name on the UI element.\n    For example, \"Enter your username and password, and then click **login**.\"\n\nWhere possible, write pages in a \"jobs to be done\" format. Jobs to be done style includes:\n\n* Table of contents at the beginning\n* \"Additional Resources\" section at the end\n* Include sections to achieve the goal, with steps for each task (numbered steps, clear directions, and correct UI workflow)\n\tFor an example, see [Sending a campaign](https://sendgrid.com/docs/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n\n**Avoid passive voice.** A good way to check if your sentence is in passive or not is to add \"by zombies\" to the end of it. If zombies end up doing the action, it's passive.\n\nExample: Any templates, campaigns, contacts, or API keys created by the teammate will not be deleted....by zombies(!)\n\n<a name=\"numbers\"></a>\n### Numbers\n\nUse numerals instead of spelling them out. However, if a number leads off the sentence, spell it out.\nYES: “SendGrid offers 10 templates in Marketing Campaigns.”\nYES: “Ten templates are included in Marketing Campaigns.”\n\n<a name=\"cross references\"></a>\n### Cross references\n\nWhen referring to other pages in the documentation, make sure your link text is descriptive.\n\nYES: For more information, see [Event Webhook] documentation.\nNO: For more information, click [here].\n\n<a name=\"head matter\"></a>\n### Head matter\n\nThe new head matter looks like this with the new Knowledge Center:\n```\n---\nlayout: page\nweight: 0\ngroup: \ntitle: \nseo:\n  title: \n  description: \n  keywords: \nnavigation:\n  show: true\n---\n```\n\n### Groups\n\nThe sections in **Bold** are the categories. The \"group\" field in the head matter pertains to the different headers article residing under a specific category. The group designation is after the colon of the \"group\" field.\n\n![Document architecture schematic.](https://github.com/sendgrid/docs/blob/develop/static/img/docs-architecture-group.png)\n \n#### UI\n\n**Sending Email**\n- Automation: automation\n- Building Email: building-email\n- Delivery & Optimization: delivery-optimization\n- Building Email with Marketing Campaigns: marketing-campaigns\n- Building Transactional Email: transactional-email\n- Tracking: tracking\n- Platform Partners: platform-partners\n\n**Managing Contacts**\n- Managing Contacts with Marketing Campaigns: managing-contacts\n\n**Analytics and Reporting**\n- Statistics: statistics\n- Click Tracking: click-tracking\n- Email Activity Feed: email-activity\n- SendGrid Partners: partners\n- Tracking: tracking\n\n**Account and Settings**\n- Account Management: account-management\n- Inbound Parse: inbound-parse\n- Sender Authentication: sender-authentication\n- IP Management: ip-management\n- Teammates & Subusers: teammates-subusers\n- Troubleshooting: troubleshooting\n- Security: security\n- Billing: billing\n\n#### For Developers\n\n**Sending Email**\n- SendGrid v2 API: api-v2\n- SendGrid v3 API: api-v3\n- Frameworks: frameworks\n- Mail Clients: mail-clients\n- Mail Servers: mail-servers\n- SendGrid Partners: partners\n- SendGrid Plugins: plugins\n- Send SMTP: smtp\n- X-SMTPAPI Header: x-smtpapi\n- Tracking: tracking\n- Open Source Apps: open-source\n\n**Parsing Email**\n- Inbound Parse: inbound-parse\n\n**Tracking Events**\n- Code Examples: code-examples\n- Getting Started: getting-started\n- SendGrid Partners: partners\n- Reference & Troubleshooting: reference-troubleshooting\n\n**Partners**\n- Migration: partner-migration\n- Platform Partners: platform-partners\n\n<a name=\"about-additional-resources\"></a>\n### About \"Additional resources\"\n\n\"Additional resources\" is an h2 section that contains 3 to 5 bullet points with links out to other closely related pages. These pages could be SendGrid blogs or docs pages with information about next steps, use cases, or other things a user should consider when they are completing the task on the page. Every page should have an additional resources page, so if it doesn't, feel free to add one!\n\nHere is an example \"Additional resources\" section: https://sendgrid.com/docs/ui/sending-email/editor/#additional-resources\n\nHere is example formatting:\n\n```\n## Additional resources\n\n* [Sending an email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)\n* [A/B testing]({{root_url}}/ui/sending-email/a-b-testing/)\n* [Campaign statistics]({{root_url}}/ui/analytics-and-reporting/marketing-campaigns-stats/)\n* [Marketing templates]({{root_url}}/ui/sending-email/working-with-marketing-templates/)\n```\n\n<a name=\"terminology\"></a>\n## Terminology\n\n* SaaS - note capitalization\n* Cloud-based - note hyphen\n* Warmup - one word with no hyphen\n* Mail stream - 2 words\n* Statistics - do not shorten to “stats”\n* Email - NOT e-mail\n* Deactivate - not inactivate\n* Recipients - The people that receive email from SendGrid Customers. Not “users” or “customers”.\n* “Log in” - verb\n* “login” - noun\n* “sign up” - verb\n* “sign-up” - noun\n* “username” - one word\n\nWhen referring to file types, like a PDF file, or a CSV file, refer to it as a CSV file, and not as a `.csv file`, unless it is an example file, like `my-file.csv`. When it's an example file, it should be in `code syntax`.\n\n<a name=\"punctuation\"></a>\n## Punctuation\n\n* Use Oxford commas.\n* Refrain from using exclamation points when possible.\n* Watch out for 2 spaces after periods--there can be only one.\n* Keep periods and punctuation marks inside the quotation marks.\n\n<a name=\"capitalization\"></a>\n## Capitalization\n\n* When in doubt...make it lowercase!\n* Use sentence case for headings unless it contains a feature name or UI element. (For example, Getting started with the Design Editor.)\n* Only capitalize exclusive feature names like “Event Webhook” and “Marketing Campaigns” not, “drag & drop editor” or “transactional templates\".\n\n<a name=\"warning and info blocks\"></a>\n## Warning and info blocks\n\nThese are great for quick information that you want to highlight to a user. Especially for “gotchas” or “neat tricks”. Please use the tags below to show these in your content.\n\n```\n<call-out type=\"warning\">\n\nYour text here\n\n</call-out>\n```\n\n```\n<call-out type=\"beta\">\n\nYour text here\n\n</call-out>\n```\n\n```\n<call-out>\n\nYour text here\n\n</call-out> \n```\n\n<a name=\"screenshots\"></a>\n## Screenshots\n\n\nNot every single page or step needs an accompanying screenshot. When in doubt, follow the guidelines below.\n\n### Needs a screenshot:\n\n* The layout of the main elements and areas of the interface with captions. For example, the toolbar, status bar, main menu, pop-up menu. This avoids needing to explain in words: “On the bar on the left, click on the second button from the top”.\n* Each action that significantly changes the state of the system, interface or data.\n* Pop-up (modal) windows.\n\n### Does NOT need a screenshot:\n\n* Install and uninstall wizards (unless there is something really unusual about a lot of the settings).\n* Login pages.\n* Standard dialog windows (open, save).\n* Endless drop-down lists (select language or country).\n* Individual buttons (use text).\n* Anything that is already described in detail or included on other screenshots – better to provide a link.\n* Screens containing details about the version, rights, etc. If a new version comes out, you may need to change numbers or letters on every single screenshot.\n* Pieces of code, configs, etc. Instead, insert these as formatted text – it looks better, and users can easily copy them.\n\n### File format and naming:\n\nPlease use PNG, GIF, or JPG files. Give the screenshots unique, meaningful names, obeying a specific format, such as general_settings_privacy. Avoid spaces, uppercase letters, and excessively long names.\n\n### Location:\n\nImages should be located in the following directory: \n\n`docs/static/img/`\n\n### Size and resolution:\n\nWhen possible, try to take screenshots at a size that is twice what it will need to be on the page.\n\n### Alt text:\n\nAs a best practice, all screenshots should have accompanying alt text.\n\nUse the following format when inserting an image into the docs:\n\n`![alt text here]({{root_url}}/img/<image_name>.png)`\n"
  },
  {
    "path": "travis/after_deploy.sh",
    "content": "#!/bin/bash\n\naws configure set preview.cloudfront true\n\nif [ \"$TRAVIS_BRANCH\" == \"main\" ]; then\n  DIST_ID=$CLOUDFRONT_DIST_ID_PROD\nelse\n  DIST_ID=$CLOUDFRONT_DIST_ID_STAGE\nfi\n\nAWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws cloudfront create-invalidation --distribution-id $DIST_ID --paths \"/*\""
  },
  {
    "path": "travis/build.sh",
    "content": "#!/bin/bash\n\nif [ \"$TRAVIS_BRANCH\" == \"develop\" ]; then\n  npm run build:pp\nelif [ \"$TRAVIS_BRANCH\" == \"main\" ]; then\n  GATSBY_ENV=production npm run build:pp\nfi"
  },
  {
    "path": "travis/deploy.sh",
    "content": "#!/bin/bash\n\n\nif [ \"$TRAVIS_BRANCH\" == \"main\" ]; then\n  S3_BUCKET=\"s3://sendgrid-knowledge-center-production\"\nelse\n  S3_BUCKET=\"s3://sendgrid-knowledge-center-staging\"\nfi\necho \"Deploying to $S3_BUCKET\"\n#AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws s3api put-bucket-website --bucket sendgrid-knowledge-center-staging --website-configuration file://static/config.json\nAWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws s3 sync --acl public-read --sse --delete public $S3_BUCKET\n"
  },
  {
    "path": "travis/deploy_open_source.sh",
    "content": "#!/bin/bash\n\n\ncd public\nmkdir docs\nmv * docs\ntouch index.html\ncd ../\n\necho \"Deploying to open source bucket\"\nAWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws s3 sync --acl public-read --sse --delete public s3://sendgrid-knowledge-center-open-source\n"
  }
]