CINXE.COM
Purchase - Pulsedive
<!DOCTYPE html> <html lang='en' data-theme='dark' data-uid='0' data-username='' data-email='' data-key='' data-role='0' data-pro='0' data-api='0' data-feed='0' data-enterprise='0' data-integrations='W10=' data-services='eyJhcGkiOnsicGxhbiI6InZpc2l0b3IiLCJkaXNwbGF5IjpudWxsLCJsaW1pdHMiOnsic29mdCI6ZmFsc2UsInJlcXVlc3RzIjp7InNlY29uZCI6MSwiZGF5IjoxMCwibW9udGgiOjEwMH0sImV4cGxvcmUiOjEwLCJhbmFseXplIjpmYWxzZSwibmV3cyI6ZmFsc2V9LCJjdXN0b21lciI6ZmFsc2V9LCJmZWVkIjp7InBsYW4iOiJmcmVlIiwiZGlzcGxheSI6IlNhbXBsZSBPbmx5IiwibGltaXRzIjp7InNhbXBsZSI6dHJ1ZX0sImN1c3RvbWVyIjpmYWxzZX19' data-crawler='0' data-throttle='0' data-customer='0' data-maintenance='0' > <head> <!-- charset --> <meta charset='utf-8'> <!-- fetch all resources from here by default --> <base href='https://pulsedive.com'> <!-- page title --> <title>Purchase - Pulsedive</title> <!-- canonical URL --> <link rel='canonical' href='https://pulsedive.com/purchase/'> <!-- favicon --> <link rel='shortcut icon' href='https://pulsedive.com/img/favicon.png'> <link rel='icon' type='image/x-icon' href='https://pulsedive.com/img/favicon.png'> <!-- OpenSearch --> <link rel='search' type='application/opensearchdescription+xml' title='Pulsedive' href='https://pulsedive.com/opensearch.php?v=6.3.09'> <!-- version --> <meta name='version' content='6.3.09'> <!-- assets URL --> <meta name='assets' content='https://pulsedive.com'> <!-- viewport --> <meta name='viewport' content='width=device-width, initial-scale=1'> <!-- SEO --> <meta name='author' content='Pulsedive'> <meta name='description' content="Pulsedive is a free threat intelligence platform. Search, scan, and enrich IPs, URLs, domains and other IOCs from OSINT feeds or submit your own."> <meta name='keywords' content="threat intelligence,feed,ioc"> <!-- Twitter card --> <meta name='twitter:card' content='summary_large_image'> <meta name='twitter:site' content='@pulsedive'> <meta name='twitter:creator' content='@pulsedive'> <meta name='twitter:title' content='Purchase - Pulsedive'> <meta name='twitter:description' content='Pulsedive is a free threat intelligence platform. Search, scan, and enrich IPs, URLs, domains and other IOCs from OSINT feeds or submit your own.'> <meta name='twitter:image' content='https://pulsedive.com/img/opengraph/community.jpg'> <!-- Open Graph card --> <meta property='og:url' content='https://pulsedive.com/purchase/'> <meta property='og:title' content='Purchase - Pulsedive'> <meta property='og:description' content='Pulsedive is a free threat intelligence platform. Search, scan, and enrich IPs, URLs, domains and other IOCs from OSINT feeds or submit your own.'> <meta property='og:image' content='https://pulsedive.com/img/opengraph/community.jpg'> <!-- fonts --> <link rel='preload' href='https://pulsedive.com/fonts/fontawesome.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/fonts/fontawesome.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/fonts/montserrat.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/fonts/montserrat.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/fonts/varelaround.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/fonts/varelaround.css?v=6.3.09'> <!-- CSS --> <link rel='preload' href='https://pulsedive.com/css/page.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/css/page.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/css/layout.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/css/layout.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/css/cards.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/css/cards.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/css/elem.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/css/elem.css?v=6.3.09'><link rel='preload' href='https://pulsedive.com/css/dark.css?v=6.3.09' as='style'><link rel='stylesheet' href='https://pulsedive.com/css/dark.css?v=6.3.09'> </head> <body data-schema='eyJpbmRpY2F0b3JzIjp7ImFydGlmYWN0Ijp7ImRpc3BsYXkiOiJBcnRpZmFjdCIsImF0dHJpYnV0ZXMiOlsiZmlsZW5hbWUiLCJmaWxldHlwZSIsInlhcmEiLCJ0YWN0aWMiLCJ0ZWNobmlxdWUiXX0sImlwIjp7ImRpc3BsYXkiOiJJUCIsImF0dHJpYnV0ZXMiOlsicHJvdG9jb2wiLCJwb3J0IiwiaG9zdHR5cGUiLCJ0ZWNobm9sb2d5IiwidGFjdGljIiwidGVjaG5pcXVlIl19LCJ1cmwiOnsiZGlzcGxheSI6IlVSTCIsImF0dHJpYnV0ZXMiOlsicHJvdG9jb2wiLCJwb3J0IiwidGVjaG5vbG9neSIsInRhY3RpYyIsInRlY2huaXF1ZSJdfSwiZG9tYWluIjp7ImRpc3BsYXkiOiJEb21haW4iLCJhdHRyaWJ1dGVzIjpbInByb3RvY29sIiwicG9ydCIsImhvc3R0eXBlIiwidGVjaG5vbG9neSIsInRhY3RpYyIsInRlY2huaXF1ZSJdfSwiaXB2NiI6eyJkaXNwbGF5IjoiSVB2NiIsImF0dHJpYnV0ZXMiOlsicHJvdG9jb2wiLCJwb3J0IiwiaG9zdHR5cGUiLCJ0ZWNobm9sb2d5IiwidGFjdGljIiwidGVjaG5pcXVlIl19fSwidGhyZWF0cyI6eyJhdHRyaWJ1dGVzIjpbInRhY3RpYyIsInRlY2huaXF1ZSIsInRlY2hub2xvZ3kiLCJpbmR1c3RyeSIsImNvdW50cnljb2RlIl0sImNhdGVnb3JpZXMiOnsiYXR0YWNrIjoiQXR0YWNrIiwidGVycm9yaXNtIjoiVGVycm9yaXNtIiwic3BhbSI6IlNwYW0iLCJleHBsb2l0a2l0IjoiRXhwbG9pdCBLaXQiLCJyYW5zb213YXJlIjoiUmFuc29td2FyZSIsInJhdCI6IlJBVCIsImJvdG5ldCI6IkJvdG5ldCIsInBoaXNoaW5nIjoiUGhpc2hpbmciLCJnZW5lcmFsIjoiR2VuZXJhbCIsIm1hbHdhcmUiOiJNYWx3YXJlIiwiZnJhdWQiOiJGcmF1ZCIsInByb3h5IjoiUHJveHkiLCJncm91cCI6Ikdyb3VwIiwiZmFtaWx5IjoiTWFsd2FyZSBGYW1pbHkiLCJwdXAiOiJQVVAiLCJ0b29sIjoiVG9vbCIsImNyaW1lIjoiQ3JpbWUiLCJ2dWxuZXJhYmlsaXR5IjoiVnVsbmVyYWJpbGl0eSIsInJlY29ubmFpc3NhbmNlIjoiUmVjb25uYWlzc2FuY2UiLCJjYW1wYWlnbiI6IkNhbXBhaWduIiwiYWJ1c2UiOiJBYnVzZSIsInNweXdhcmUiOiJTcHl3YXJlIn19LCJhdHRyaWJ1dGVzIjp7InlhcmEiOiJZQVJBIFJ1bGUiLCJ0ZWNobm9sb2d5IjoiVGVjaG5vbG9neSIsImluZHVzdHJ5IjoiSW5kdXN0cnkiLCJwb3J0IjoiUG9ydCIsImhvc3R0eXBlIjoiSG9zdCBUeXBlIiwicHJvdG9jb2wiOiJQcm90b2NvbCIsImZpbGV0eXBlIjoiRmlsZSBUeXBlIiwiY291bnRyeWNvZGUiOiJDb3VudHJ5IENvZGUiLCJmaWxlbmFtZSI6IkZpbGUgTmFtZSIsInRlY2huaXF1ZSI6IlRlY2huaXF1ZSIsInRhY3RpYyI6IlRhY3RpYyJ9LCJ2YWxpZGF0aW9uIjp7ImNvdW50cnljb2RlIjoiXC9eW0EtWl17Mn0kXC8ifX0='> <!--header--> <header data-hide="0"> <!-- logo --> <a class='logo' data-enterprise=0 href='https://pulsedive.com'> <img style='max-height:35px; max-width:10em;' class='logo bigscreen' src='https://pulsedive.com/img/logo_community_light.svg?v=6.3.09' alt="Pulsedive logo"> <img style='max-height:35px;' class='logo smallscreen midscreen' src='https://pulsedive.com/img/heart.svg?v=6.3.09' alt="Pulsedive logo"> </a> <a class='logo' data-enterprise=1 href='/dashboard/'> <img style='max-height:35px; max-width:10em;' class='logo bigscreen' src='https://pulsedive.com/img/logo_community_light.svg?v=6.3.09' alt="Pulsedive logo"> <img style='max-height:35px;' class='logo smallscreen midscreen' src='https://pulsedive.com/img/heart.svg?v=6.3.09' alt="Pulsedive logo"> </a> <!-- top nav --> <nav class='bigscreen'> <a href='/dashboard/'><i class='fas fa-stream'></i>Dashboard</a> <div class='dropdown'> <a href='/explore/'><i class='fas fa-explore'></i>Explore</a> <div> <a href='/explore/'><i class='fas fa-indicator'></i>Indicators</a> <a href='/explore/threats/'><i class='fas fa-threat'></i>Threats</a> <!--<a data-auth=1 href='/explore/?q=user%3D'><i class='fas fa-upload'></i>Your Submissions</a>--> <a href='/api/explore' class='sep-top'><i class='fas fa-product-api'></i>API</a> </div> </div> <a href='/analyze/'><i class='fas fa-code-branch'></i>Analyze</a> <div class='dropdown'> <a href='/api/'><i class='fas fa-product-api'></i>API</a> <div> <a href='/api/'><i class='fas fa-info-circle'></i>Overview</a> <a href='/api/indicators' class='sep-top'><i class='fas fa-indicator'></i>Indicators</a> <a href='/api/threats'><i class='fas fa-threat'></i>Threats</a> <a href='/api/explore'><i class='fas fa-explore'></i>Explore</a> <a data-enterprise=0 href='/about/api' class='sep-top'><i class='fas fa-clock'></i>Rate Limits</a> <a href='/api/taxii'><i class='fas fa-taxii'></i>STIX/TAXII 2.1</a> <a data-enterprise=0 href='/about/feed'><i class='fas fa-product-feed'></i>Bulk Export</a> </div> </div> <div data-enterprise=1 class='dropdown'> <a onclick="Form.feedDownload().modal(true);" data-enterprise=1 data-auth=1><i class='fas fa-product-feed'></i>Export</a> <div> <a onclick="Form.feedDownload().modal(true);" data-enterprise=1 data-auth=1><i class='fas fa-product-feed'></i>Configure CSV</a> <a href='/api/taxii'><i class='fas fa-taxii'></i>STIX/TAXII 2.1</a> </div> </div> <div data-enterprise=0 class='dropdown'> <a href='/about/'><i class='fas fa-info-circle'></i>About</a> <div> <a href='/about/'><i class='fas fa-info-circle'></i>Overview</a> <a href='/pro' class='sep-top' style='min-width:10em;'><i class='fas fa-product-pro'></i>Pro<span style='opacity:0.5; float:right;'>$29/mo</span></a> <a href='/about/api'><i class='fas fa-product-api'></i>API</a> <a href='/about/feed'><i class='fas fa-product-feed'></i>Feed</a> <a href='/enterprise'><i class='fas fa-product-enterprise'></i>Enterprise TIP</a> <a href='/addon' class='sep-top'><i class='fab fa-chrome'></i>Add-On</a> <a href='/integrations'><i class='fas fa-puzzle-piece'></i>Integrations</a> <a href='/company'><i class='fas fa-copyright'></i>Company</a> <a href='https://blog.pulsedive.com' target='_blank'><i class='fas fa-rss'></i>Blog</a> </div> </div> </nav> <nav class='midscreen'> <a href='/explore/' alt="Explore"><i class='fas fa-explore'></i></a> <a href='/analyze/' alt="Analyze"><i class='fas fa-code-branch'></i></a> <a href='/api/' alt="API"><i class='fas fa-product-api'></i></a> <a href='/about/pro' alt='Pro' data-enterprise=0 data-pro=0 data-admin=0><i class='fas fa-product-pro'></i></a> <a href='/about/feed' alt="Feed" data-enterprise=0 data-pro=1 data-admin=0><i class='fas fa-product-feed'></i></a> <a onclick="Form.feedDownload().modal(true);" alt="Feed" data-enterprise=1 data-auth=1><i class='fas fa-product-feed'></i></a> <a href='/configuration/' alt="Admin" data-admin=1><i class='fas fa-cogs'></i></a> <a href='/about/' data-enterprise=0 alt="About"><i class='fas fa-info-circle'></i></a> </nav> <aside> <!-- account menu --> <span class='bigscreen'> <div data-auth=0 data-enterprise=0 class='dropdown'> <a href='/register' class='success'><i class='fas fa-user-plus'></i>Sign Up</a> <div> <a data-action='login'><i class='fas fa-sign-in-alt'></i>Sign In</a> <a data-action='theme'><i class='fas fa-adjust'></i>Change Theme</a> <a data-action='contact'><i class='fas fa-envelope'></i>Contact Us</a> </div> </div> <div data-auth=1 class='dropdown'> <a href='/account/'><i class='fas fa-user-cog' data-pro=0 data-admin=0></i><i class='fas fa-user-shield' data-pro=1 data-admin=0></i><i class='fas fa-users-cog' data-admin=1></i><span style='display:inline-block; text-overflow:ellipsis; overflow:hidden; vertical-align:bottom; max-width:5em;'></span></a> <div> <a href='/account/'><i class='fas fa-user'></i>Account</a> <a data-enterprise=1 onclick="window.page.forms.keys.modal(true);"><i class='fas fa-puzzle-piece'></i>Third-Party API Keys</a> <a data-enterprise=0 data-pro=1 onclick="window.page.forms.keys.modal(true);"><i class='fas fa-product-pro'></i>Pro Integrations</a> <a data-action='theme'><i class='fas fa-adjust'></i>Change Theme</a> <a data-action='contact' data-enterprise=0 data-admin=0><i class='fas fa-envelope'></i>Contact Us</a> <a data-action='contact' data-enterprise=1><i class='fas fa-life-ring'></i>Support</a> <a data-enterprise=0 data-admin=0 data-pro=0 data-api=0 data-feed=0 href='/purchase' class='success'><i class='fa fa-plus-circle'></i>Upgrade</a> <a href='/pulsedive/data.php?get=indicators' target='_blank' class='sep-top'><i class='fas fa-upload'></i>Export Submissions</a> <a data-feed=1 data-enterprise=0 onclick="Form.feedDownload().modal(true);"><i class='fas fa-product-feed'></i>Download Feed</a> <a data-feed=0 data-enterprise=0 onclick="Form.feedDownload().modal(true);"><i class='fas fa-product-feed'></i>Feed Sample</a> <a onclick="window.page.forms.threat.modal(true);" data-contributor=1 data-enterprise=0 class='sep-top'><i class='fas fa-threat'></i>Add a threat</a> <a onclick="window.page.forms.threat.modal(true);" data-enterprise=1 class='sep-top'><i class='fas fa-threat'></i>Add a threat</a> <!--<a href='/configuration/feed.php' data-admin=1><i class='fas fa-feed'></i>Add a feed</a>--> <a href='/configuration/' data-admin=1><i class='fas fa-cogs'></i>Admin</a> <a data-action='logout' class='error sep-top'><i class='fas fa-sign-out-alt'></i>Sign Out</a> </div> </div> <a data-action='toolbox' alt="Toolbox"><i class='fas fa-hammer'></i></a> </span> <!-- top nav, right side --> <span class='midscreen'> <a data-action='login' data-auth=0 data-enterprise=0 class='success' alt="Sign In"><i class='fas fa-user-plus'></i></a> <a data-action='account' data-auth=1 href='/account/' alt="Account"><i class='fas fa-user-cog' data-pro=0 data-admin=0></i><i class='fas fa-user-shield' data-pro=1 data-admin=0></i><i class='fas fa-users-cog' data-admin=1></i></a> <a data-action='toolbox' alt="Toolbox"><i class='fas fa-hammer'></i></a> <a data-action='theme' alt="Toggle theme"><i class='fas fa-adjust'></i></a> <a data-action='contact' class='bigscreen' data-enterprise=0 alt="Contact"><i class='fas fa-envelope'></i></a> <a data-action='contact' data-enterprise=1 alt="Support"><i class='fas fa-life-ring'></i></a> </span> <!-- globalsearch --> <div class='text-wrapper'> <i class='fas fa-search' onclick="this.parentElement.querySelector('input[type=text]').focus();"></i><input name='search' type='text' autocomplete='none' aria-label='search'> </div> <!-- top hamburger menu for small screens --> <span class='smallscreen'> <a onclick="document.querySelector('header nav.mobile').style.display = 'block'; window.page.url('nav', { anchor:true });"><i class='fas fa-bars'></i></a> </span> </aside> <!-- mobile nav --> <nav class='mobile'> <a name='closeNav' onclick="this.parentElement.style.display = 'none'; window.page.url('', { anchor:true });"><i class='fas fa-times'></i></a> <a href='/dashboard/'><i class='fas fa-stream'></i>Dashboard</a> <a href='/explore/'><i class='fas fa-explore'></i>Explore</a> <a href='/analyze/'><i class='fas fa-code-branch'></i>Analyze</a> <a href='/api/' data-enterprise=1><i class='fas fa-product-api'></i>API</a> <a href='/about/api' data-enterprise=0 data-admin=0><i class='fas fa-product-api'></i>API</a> <a href='/about/pro' data-enterprise=0 data-admin=0><i class='fas fa-product-pro'></i>Pro</a> <a href='/about/feed' data-enterprise=0 data-admin=0><i class='fas fa-product-feed'></i>Feed</a> <a onclick="Form.feedDownload().modal(true);" data-enterprise=1 data-auth=1><i class='fas fa-product-feed'></i>Feed</a> <a href='/configuration/' data-admin=1><i class='fas fa-cogs'></i>Admin</a> <a class='sep-bottom' href='/about/' data-enterprise=0><i class='fas fa-info-circle'></i>About</a> <a data-action='register' data-auth=0 data-enterprise=0><i class='fas fa-user-plus'></i>Register</a> <a data-action='login' data-auth=0 data-enterprise=0><i class='fas fa-sign-in-alt'></i>Sign In</a> <a data-action='account' data-auth=1 href='/account/'><i class='fas fa-user-cog' data-pro=0 data-admin=0></i><i class='fas fa-user-shield' data-pro=1 data-admin=0></i><i class='fas fa-users-cog' data-admin=1></i>Account</a> <a data-action='logout' data-auth=1><i class='fas fa-sign-out-alt'></i>Sign Out</a> <a data-action='theme' onclick="this.parentElement.style.display = 'none';"><i class='fas fa-adjust'></i>Toggle Theme</a> <a data-action='contact' onclick="this.parentElement.style.display = 'none';"><i class='fas fa-envelope'></i>Contact</a> </nav> </header> <!-- scripts --> <script defer src='https://pulsedive.com/js/events.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/functions.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/page.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/docs.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/forms.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/preview.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/data.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/premium.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/integrations.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/suggestions.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/api.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/explore.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/indicator.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/threat.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/feed.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/action.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/submit.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/api/search.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/ui.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/card.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/autocomplete.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/stamp.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/taglist.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/table.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/grid.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/tree.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/cloner.js?v=6.3.09'></script><script defer src='https://pulsedive.com/js/ui/regex.js?v=6.3.09'></script> <!-- side menu --> <aside data-show=0 class=''> </aside> <!-- main content --> <main> <!-- Unsupported browser warning --> <div id='unsupported-browser-warning' class='sep-bottom error' style='padding:10px; display:none;'> <div class='inline' style='margin-left:5px;'> <i class='fas fa-exclamation-circle'></i> </div> <div class='inline' style='width:calc(100% - 40px);'> We detected an unsupported browser. Some features and functionality might not work properly. We strongly recommend you upgrade your browser. </div> </div> <section> <script> // active plan var active; // get all plan names and limits var services; // selected service var service; // selected period var period; // selected plans var selected = {}; window.addEventListener('load', function(event) { // anchor is set if (window.page.page.length <= 0 && window.page.anchor != '') { // convert to page window.page.url(window.page.anchor.trim().toLowerCase(), { replace:true, page:true }); // remove anchor window.page.url('', { replace:true, anchor:true }); } else { window.page.url(window.page.page.trim().toLowerCase(), { replace:true, page:true }); } // get active plans try { active = JSON.parse(window.page.user.services); } catch (err) { } // get service service = window.page.page; // service isn't supported if (['pro', 'api', 'feed'].indexOf(service) < 0) { // update URL if (window.page.page.length > 0) { window.page.url('', { replace:true, page:true }); } // add header window.page.header("Choose Product"); // show products outputProducts(); return; } /* // send event window.page.event('begin_checkout', { label:'begin_checkout', category:'ecommerce', nonInteraction:true }); */ // add header window.page.header('Select Plan'); // user is not logged in if (window.page.user.uid <= 0) { window.page.notice("You must create an account before purchasing.", { button:UI.button("Sign Up", function() { window.page.forms.login.tab('register').modal(true); }, { class:'calltoaction' }) }); // already a Pro subscriber } else if (service == 'pro' && window.page.user.pro > 0) { window.page.notice("You are already a Pro subscriber.", { button:UI.button("View Subscriptions", function() { window.location.href = '/account'; }, { class:'calltoaction' }) }); // already an API subscriber } else if (service == 'api' && window.page.user.api > 0) { window.page.notice("Changes will replace your current " + (active && active.api && active.api.display ? active.api.display : "API") + " subscription.", { button:UI.button("View Subscriptions", function() { window.location.href = '/account'; }, { class:'calltoaction' }) }); // already a Feed subscriber } else if (service == 'feed' && window.page.user.feed > 0 && active.feed && active.feed.plan && active.feed.plan != 'pro') { window.page.notice("Changes will replace your current " + (active && active.feed && active.feed.display ? active.feed.display : "Feed") + " subscription.", { button:UI.button("View Subscriptions", function() { window.location.href = '/account'; }, { class:'calltoaction' }) }); } // change product window.page.sections.main.appendChild(UI.div(null, { textAlign:'left', width:'calc(100% - 3em)', marginBottom:'1em' }).add(UI.a("Change product", '/purchase', { icon:'arrow-circle-left', style:{ textDecoration:'none' } }))); // fetch plan data and limits fetchPlans(); }); function fetchPlans() { // fetch plans and prices new Request('GET', '/pulsedive/', { action:'plans', prices:true }, function(status, response) { // update plans object services = response.services; // pre-select plan if (window.page.qs.select) { // plan exists var selectPlan = (window.page.qs.select || '').toLowerCase().trim(); if (selectPlan && Object.keys(services[service].plans).indexOf(selectPlan) >= 0) { // select plan selected[service] = selectPlan; } // remove query strings window.page.url('/purchase/' + service, { replace:true }); } // add period selector outputPeriod(); // show plans switch (service) { case 'pro': outputPro(); break; case 'api': outputAPI(); break; case 'feed': outputFeed(); break; } // add terms and pay button outputButtons(); }); } function outputProducts() { // Pro new Card({ name:'productpro' }).add(UI.div('flex', { alignItems:'center', minHeight:'6em', padding:'1em' }).add(UI.div(null, { marginLeft:'1em', minWidth:'10em' }).add(UI.heading([UI.icon('product-pro'), "Pro"], { level:3 })).add(UI.div('note').add("$29/month"))).add(UI.p("View historical screenshots, increase limits, and more.", { style:{ maxWidth:'25em' } }).add(UI.a("Learn More", '/pro', { icon:'external-link-alt', newTab:true, style:{ border:'none', marginLeft:'1em' } })).add(UI.button("Upgrade", function() { window.location.href = '/purchase/pro'; }, { class:'calltoaction', style:{ display:'block', border:'none', marginTop:'1em' } })))).append(); // API new Card({ name:'productapi' }).add(UI.div('flex', { alignItems:'center', minHeight:'6em', padding:'1em' }).add(UI.div(null, { marginLeft:'1em', minWidth:'10em' }).add(UI.heading([UI.icon('product-api'), "API"], { level:3 })).add(UI.div('note').add("Starting at $300/month"))).add(UI.p("Integrate Pulsedive into your workflows with flexibility.", { style:{ maxWidth:'25em' } }).add(UI.a("Learn More", '/about/api', { icon:'external-link-alt', newTab:true, style:{ border:'none', marginLeft:'1em' } })).add(UI.div(null, { marginTop:'1em' }).add(UI.button("Upgrade", function() { window.location.href = '/purchase/api'; }, { class:'calltoaction' }))))).append(); // Feed new Card({ name:'productfeed' }).add(UI.div('flex', { alignItems:'center', minHeight:'6em', padding:'1em' }).add(UI.div(null, { marginLeft:'1em', minWidth:'10em' }).add(UI.heading([UI.icon('product-feed'), "Feed"], { level:3 })).add(UI.div('note').add("Starting at $1,500/month"))).add(UI.p("Bulk export Pulsedive data in CSV format or using STIX/TAXII 2.1.", { style:{ maxWidth:'25em' } }).add(UI.a("Learn More", '/about/feed', { icon:'external-link-alt', newTab:true, style:{ border:'none', marginLeft:'1em' } })).add(UI.button("Upgrade", function() { window.location.href = '/purchase/feed'; }, { class:'calltoaction', style:{ display:'block', border:'none', marginTop:'1em' } })))).append(); // Enterprise new Card({ name:'productenterprise' }).add(UI.div('flex', { alignItems:'center', minHeight:'6em', padding:'1em' }).add(UI.div(null, { marginLeft:'1em', minWidth:'10em' }).add(UI.heading(UI.img('/img/logo_enterprise.svg', { dark:'/img/logo_enterprise_light.svg', style:{ maxWidth:'7em' } }), { level:3 })).add(UI.div('note').add("$80k/year"))).add(UI.p("A dedicated TIP with powerful data management capabilties.", { style:{ maxWidth:'25em' } }).add(UI.a("Learn More", '/enterprise', { icon:'external-link-alt', newTab:true, style:{ border:'none', marginLeft:'1em' } })).add(UI.button("Contact Sales", function() { window.page.forms.contact.ui.inputs.request.value = "I'm interested in Pulsedive Enterprise."; window.page.forms.contact.modal(true); }, { style:{ display:'block', border:'none', marginTop:'1em' } })))).append(); // adjust alignment window.page.sections.main.style.alignItems = 'stretch'; window.page.cards.productpro.card.style.flexBasis = '400px'; window.page.cards.productapi.card.style.flexBasis = '400px'; window.page.cards.productfeed.card.style.flexBasis = '400px'; window.page.cards.productenterprise.card.style.flexBasis = '400px'; // show testimonial outputTestimonials(); } function outputPeriod() { // default period period = 'month'; // different testimonials by product var testimonial; switch (service) { case 'api': testimonial = UI.div('', { padding:'1em', opacity:'0.8' }).add(UI.p('"Used in nearly every incident, Pulsedive is now one of the core services doIT recommends to clients."')).add(UI.img('/img/logos/doit.png', { class:'logo', dark:'/img/logos/doit_white.png', style:{ maxWidth:'10em', marginLeft:'1em' } })); break; case 'feed': testimonial = UI.div('', { padding:'1em', opacity:'0.8' }).add(UI.p('"Pulsedive provides essential, timely intelligence that drives our proactive abuse monitoring and mitigation efforts."')).add(UI.img('/img/logos/realtimeregister.png', { class:'logo', dark:'/img/logos/realtimeregister_white.png', style:{ maxWidth:'10em', marginLeft:'1em' } })); break; case 'pro': testimonial = UI.div('', { padding:'1em', opacity:'0.8' }).add(UI.p('"Our team actively uses Pro to collect valuable information when performing penetration tests and conducting threat intelligence research."')).add(UI.img('/img/logos/seccops.png', { class:'logo', dark:'/img/logos/seccops_white.png', style:{ maxWidth:'10em', marginLeft:'1em' } })); break; } // add period selector new Card({ name:'period', full:true, header:{ title:"Billing Schedule" } }).add(UI.div('flex', { alignItems:'center' }).add(UI.div('p', { padding:'20px 30px', maxWidth:'18em' }).add(UI.div().add(new Taglist({ radio:true, toggle:true, select:period, callback:function(tag) { // update period period = this.selection(); // update prices var prices = document.querySelectorAll('p.price'); for (var i = 0; i < prices.length; i++) { if (prices[i].classList.contains(period)) { prices[i].style.display = 'block'; prices[i].style.animation = 'flash 0.15s linear 2'; } else { prices[i].style.display = 'none'; prices[i].style.animation = 'none'; } } } }, [{ name:'month', display:"Monthly" }, { name:'year', display:"Annual" }]).taglist)).add(service == 'pro' ? null : UI.element('sup', "Annual discounts available.", { class:'note', icon:'star', style:{ display:'block', marginTop:'1em' } }))).add(testimonial)).append(); } function outputPro() { // select Pro by default selected.api = services.api.plans.pro_legacy ? 'pro_legacy' : 'pro'; selected.feed = null; // add Pro features var card = new Card({ name:'pro', full:true, header:{ title:"Pro", icon:'product-pro' } }); // add brief description card.add(UI.div('p').add(UI.p(["View historical screenshots, increase limits, and use select third-party integrations right in Pulsedive.\nVisit our ", UI.a("product page", '/pro'), " to learn more."], { class:'note' }))); // add plans section var flex = UI.div('flex', { flexWrap:'wrap', flexBasis:'30em', justifyContent:'space-evenly' }); window.page.cards.pro.add(flex); // get API and Feed limits var api = services.api.plans.pro_legacy || services.api.plans.pro; var feed = services.feed.plans.pro; // create div for each plan var div = UI.div('info inline', { maxWidth:'50em' }); flex.add(div); // monthly div.add(UI.p(["$", api.prices.month.toLocaleString('en-US'), "/mo", UI.element('span', window.page.user.pro > 0 ? " subscribed" : "", { class:'note', style:{ marginLeft:'1em', fontSize:'0.7em' } })], { class:'price api api-pro month standout center', style:{ display:period == 'month' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // annual div.add(UI.p([api.prices.year && api.prices.year < api.prices.month * 12 ? UI.element('s', ["$", (api.prices.month * 12).toLocaleString('en-US')], { class:'note', style:{ fontSize:'70%', marginRight:'6px' } }) : null, "$", (api.prices.year || api.prices.month * 12).toLocaleString('en-US'), "/yr", UI.element('span', window.page.user.pro > 0 ? " subscribed" : "", { class:'note', style:{ marginLeft:'1em', fontSize:'0.7em' } })], { class:'price api api-pro year standout center', style:{ display:period == 'year' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // features section var features = UI.div('flex'); div.add(features); // UI features features.add(UI.div(null, { flexBasis:'15em' }).add(UI.heading("UI", { level:3, icon:'heartbeat' })).add(UI.p("Third-party integrations", { icon:'product-pro' })).add(UI.p("Historical screenshots", { icon:'product-pro' }))); // API features var apidiv = UI.div(null, { flexBasis:'15em' }).add(UI.heading("API", { level:3, icon:'product-api' })); features.add(apidiv); // request limits apidiv.add(UI.p("API requests", { icon:'product-api', style:{ fontWeight:'bold' } })); if (api.limits.requests.second) { apidiv.add(UI.p(api.limits.requests.second.toLocaleString('en-US') + " /second"), { style:{ marginLeft:'1em' } }); } if (api.limits.requests.day) { apidiv.add(UI.p(api.limits.requests.day.toLocaleString('en-US') + " /day", { style:{ marginLeft:'1.5em' } })); } if (api.limits.requests.month) { apidiv.add(UI.p(api.limits.requests.month.toLocaleString('en-US') + " /month", { style:{ marginLeft:'1.5em' } })); } if (api.limits.soft) { apidiv.add(UI.p("Soft limits", { style:{ marginLeft:'1.5em' } })); } // Explore limits apidiv.add(UI.p("Explore limits", { icon:'explore', style:{ fontWeight:'bold', marginTop:'0.5em' } })); apidiv.add(UI.p(api.limits.explore.toLocaleString('en-US') + " results", { style:{ marginLeft:'1.5em' } })); // Analyze limits apidiv.add(UI.p("Analyze limits", { icon:'analyze', style:{ fontWeight:'bold', marginTop:'0.5em' } })); if (api.limits.bulk.day) { apidiv.add(UI.p(api.limits.bulk.day.toLocaleString('en-US') + " /day", { style:{ marginLeft:'1.5em' } })); } if (api.limits.bulk.month) { apidiv.add(UI.p(api.limits.bulk.month.toLocaleString('en-US') + " /month", { style:{ marginLeft:'1.5em' } })); } // Feed features var feeddiv = UI.div(null, { flexBasis:'15em' }).add(UI.heading("Feed", { level:3, icon:'product-feed' })); features.add(feeddiv); // indicator types feeddiv.add(UI.p(feed.limits.indicator.map(function(type) { return window.page.data.schema.indicators[type].display; }).join(', '), { icon:'indicator' })); // risk levels feeddiv.add(UI.p(feed.limits.risk.map(function(risk) { return UI.icon('risk-' + risk, { alt:ucFirst(risk) + ' risk', style:{ opacity:'0.8' } }); }), { icon:'indicator' })); // max time period var max = feed.limits.period[feed.limits.period.length - 1]; feeddiv.add(UI.p(max == 'all' ? "All time" : "Last " + max, { icon:'clock' })); // retired indicators if (feed.limits.retired == false) { feeddiv.add(UI.p("Active only", { icon:'hourglass-start' })); } else if (feed.limits.retired == true) { feeddiv.add(UI.p("Retired & active", { icon:'hourglass-end' })); } // TAXII 2.1 if (feed.limits.taxii != false) { feeddiv.add(UI.p("TAXII 2.1 access", { icon:'taxii' })); } card.append(); } function outputAPI() { // add API plans var card = new Card({ name:'api', full:true, header:{ title:"API Plans", icon:'product-api' } }); // add brief description card.add(UI.div('p').add(UI.p(["Integrate Pulsedive into your workflows with flexibility with the Pulsedive API.\nVisit our ", UI.a("product page", '/about/api'), " to learn more, or ", UI.a("view documentation", '/api'), "."], { class:'note' }))); // add plans section var flex = UI.div('flex', { flexWrap:'wrap', justifyContent:'space-evenly', paddingBottom:'4em' }); window.page.cards.api.add(flex); // iterate through plans for (var name in services.api.plans) { var plan = services.api.plans[name]; // skip Free and Pro if (['free', 'free_legacy', 'pro', 'pro_legacy'].indexOf(name) >= 0) { continue; } // create div for each plan var div = UI.div('info inline', { maxWidth:'15em', minWidth:'15em' }); flex.add(div); // free plan var free = ['free', 'free_legacy'].indexOf(name) >= 0; // Pro plan var pro = ['pro', 'pro_legacy'].indexOf(name) >= 0; // custom plan var custom = name == 'custom'; // user is already subscribed if (active.api && active.api.plan == name) { div.add(UI.p("Subscribed", { class:'note', icon:'check-circle', style:{ paddingTop:'2em', paddingBottom:'20px' } })); // custom plan } else if (custom) { div.style.paddingTop = '6em'; } else { // select first plan if (!selected.api) { selected.api = name; } // select button var select = new Taglist({ name:'selector', callback:function(tag) { // change text if (tag.classList.contains('selected')) { tag.textContent = 'Selected'; selected.api = tag.getAttribute('name'); // don't deselect } else { tag.click(); } // adjust other plans var selectors = flex.querySelectorAll('div[name=selector]'); for (var i = 0; i < selectors.length; i++) { if (selectors[i].selection() != selected.api) { selectors[i].deselect(); selectors[i].children[0].textContent = "Select"; } } } }, [{ name:name, class:'api api-' + name, display:"Select", style:{ fontWeight:'normal', marginLeft:'1em' } }]).taglist; div.add(UI.div(null, { paddingLeft:0, paddingTop:'2em' }).add(select)); // select plan if (selected.api == name) { select.children[0].click(); } } // plan name div.add(UI.heading(plan.display, { level:3, icon:pro ? 'product-pro' : 'product-api' })); // add both prices, hide one if (plan.prices && plan.prices.month) { // monthly div.add(UI.p(["$", plan.prices.month.toLocaleString('en-US'), "/mo"], { class:'price api api-' + name + ' month standout', style:{ display:period == 'month' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // annual div.add(UI.p([plan.prices.year && plan.prices.year < plan.prices.month * 12 ? UI.element('s', ["$", (plan.prices.month * 12).toLocaleString('en-US')], { class:'note', style:{ fontSize:'70%', marginRight:'6px' } }) : null, "$", (plan.prices.year || plan.prices.month * 12).toLocaleString('en-US'), "/yr"], { class:'price api api-' + name + ' year standout', style:{ display:period == 'year' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // custom plan } else if (custom) { div.add(UI.p("Custom pricing", { class:'note price api api-' + name + ' standout', style:{ display:'block', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // free } else { div.add(UI.p('Free', { class:'note', style:{ padding:'2px', paddingLeft:'2em', margin:'25px 0', fontSize:'120%' } })); } // custom plan details if (custom) { div.add(UI.p("Contact us with your API needs and we'll work with you to create a custom plan for your organization.")).add(UI.p(UI.a("Contact sales", '', { attribute:{ 'data-action':'contact', 'data-message':"I'm interested in a Custom API plan." } }), { style:{ marginTop:'1em' } })); continue; } // request limits div.add(UI.p("API requests", { icon:'product-api', style:{ fontWeight:'bold', marginTop:'1em' } })); if (plan.limits.requests.second) { div.add(UI.p(plan.limits.requests.second.toLocaleString('en-US') + " /second"), { style:{ marginLeft:'1em' } }); } if (plan.limits.requests.day) { div.add(UI.p(plan.limits.requests.day.toLocaleString('en-US') + " /day", { style:{ marginLeft:'1.5em' } })); } if (plan.limits.requests.month) { div.add(UI.p(plan.limits.requests.month.toLocaleString('en-US') + " /month", { style:{ marginLeft:'1.5em' } })); } if (plan.limits.soft) { div.add(UI.p("Soft limits", { style:{ marginLeft:'1.5em' } })); } // Explore limits div.add(UI.p("Explore limits", { icon:'explore', style:{ fontWeight:'bold', marginTop:'0.5em' } })); div.add(UI.p(plan.limits.explore.toLocaleString('en-US') + " results", { style:{ marginLeft:'1.5em' } })); // Analyze limits div.add(UI.p("Analyze limits", { icon:'analyze', style:{ fontWeight:'bold', marginTop:'0.5em' } })); if (plan.limits.bulk.day) { div.add(UI.p(plan.limits.bulk.day.toLocaleString('en-US') + " /day", { style:{ marginLeft:'1.5em' } })); } if (plan.limits.bulk.month) { div.add(UI.p(plan.limits.bulk.month.toLocaleString('en-US') + " /month", { style:{ marginLeft:'1.5em' } })); } // Pro features if (pro) { div.add(UI.p("Third-party integrations", { icon:'product-pro', style:{ marginTop:'0.5em' } })); div.add(UI.p("Historical screenshots", { icon:'product-pro' })); // Pro included } else if (!free) { div.add(UI.p("Pro included", { icon:'product-pro', style:{ marginTop:'0.5em' } })); } } card.append(); } function outputFeed() { // add Feed plans var card = new Card({ name:'feed', full:true, header:{ title:"Feed Plans", icon:'product-feed' } }); // add brief description card.add(UI.div('p').add(UI.p(["Bulk export Pulsedive data in CSV format or using STIX/TAXII 2.1 with Pulsedive Feed.\nVisit our ", UI.a("product page", '/about/feed'), " to learn more."], { class:'note' }))); // add plans section var flex = UI.div('flex', { flexWrap:'wrap', justifyContent:'space-evenly', paddingBottom:'4em' }); window.page.cards.feed.add(flex); // iterate through plans for (var name in services.feed.plans) { var plan = services.feed.plans[name]; // skip Free and Pro if (['free', 'pro'].indexOf(name) >= 0) { continue; } // create div for each plan var div = UI.div('info inline', { maxWidth:'15em' }); flex.add(div); // free plan var free = name == 'free'; // Pro plan var pro = name == 'pro'; // user is already subscribed if (active.feed && active.feed.plan == name) { div.add(UI.p("Subscribed", { class:'note', icon:'check-circle', style:{ paddingTop:'2em', paddingBottom:'20px' } })); } else { // select first plan if (!selected.feed) { selected.feed = name; } // Pro Feed included with Pro plan if (pro) { div.add(UI.p("Select API plan", { class:'center note', style:{ padding:'calc(1em + 10px)', paddingTop:'calc(2em + 3px)', fontSize:'14px' } })); } else { // select button var select = new Taglist({ name:'selector', callback:function(tag) { // change text if (tag.classList.contains('selected')) { tag.textContent = 'Selected'; selected.feed = tag.getAttribute('name'); // don't deselect } else { tag.click(); } // adjust other plans var selectors = flex.querySelectorAll('div[name=selector]'); for (var i = 0; i < selectors.length; i++) { if (selectors[i].selection() != selected.feed) { selectors[i].deselect(); selectors[i].children[0].textContent = "Select"; } } } }, [{ name:name, class:'feed feed-' + name, display:"Select", style:{ fontWeight:'normal', marginLeft:'1em' } }]).taglist; div.add(UI.div(null, { paddingLeft:0, paddingTop:'2em' }).add(select)); // select plan if (selected.feed == name) { select.children[0].click(); } } } // plan name div.add(UI.heading(plan.display, { level:3, icon:pro ? 'product-pro' : 'product-feed', style:name.length > 15 ? { fontSize:'16px' } : {} })); // add short use cases /*switch (name) { case 'pro': div.add(UI.p("For individuals.", { class:'note', style:{ fontStyle:'italic', padding:'10px' } })); break; case 'ips + domains': div.add(UI.p("For organizations.", { class:'note', style:{ fontStyle:'italic', padding:'10px' } })); break; case 'ips + domains + urls': div.add(UI.p("For organizations.", { class:'note', style:{ fontStyle:'italic', padding:'10px' } })); break; case 'heavy duty': div.add(UI.p("For organizations, integrations, and research.", { class:'note', style:{ fontStyle:'italic', padding:'10px' } })); break; } */ // add both prices, hide one if (plan.prices.month) { // monthly div.add(UI.p(["$", plan.prices.month.toLocaleString('en-US'), "/mo"], { class:'price feed feed-' + name + ' month standout', style:{ display:period == 'month' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // annual div.add(UI.p([plan.prices.year && plan.prices.year < plan.prices.month * 12 ? UI.element('s', ["$", (plan.prices.month * 12).toLocaleString('en-US')], { class:'note', style:{ fontSize:'70%', marginRight:'6px' } }) : null, "$", (plan.prices.year || plan.prices.month * 12).toLocaleString('en-US'), "/yr"], { class:'price api api-' + name + ' year standout', style:{ display:period == 'year' ? 'block' : 'none', padding:'2px', paddingLeft:'1em', margin:'25px 0', fontSize:'120%' } })); // free } else { div.add(UI.p('Free', { class:'note', style:{ padding:'2px', paddingLeft:'2em', margin:'25px 0', fontSize:'120%' } })); } // sample if (plan.limits.sample) { div.add(UI.p("Sample only", { icon:'ban', style:{ marginTop:'1em' } })); continue; } // indicator types div.add(UI.p(plan.limits.indicator.map(function(type) { return window.page.data.schema.indicators[type].display; }).join(', '), { icon:'indicator', style:{ marginTop:'1em' } })); // risk levels div.add(UI.p(plan.limits.risk.map(function(risk) { return UI.icon('risk-' + risk, { alt:ucFirst(risk == 'none' ? 'very low' : risk) + ' risk', style:{ opacity:'0.8' } }); }), { icon:'indicator' })); // max time period var max = plan.limits.period[plan.limits.period.length - 1]; div.add(UI.p(max == 'all' ? "All time" : "Last " + max, { icon:'clock' })); // retired indicators if (plan.limits.retired == false) { div.add(UI.p("Active only", { icon:'hourglass-start' })); } else if (plan.limits.retired == true) { div.add(UI.p("Retired & active", { icon:'hourglass-end' })); } // TAXII 2.1 if (plan.limits.taxii != false) { div.add(UI.p("TAXII 2.1 access", { icon:'taxii' })); } // Pro features if (pro) { div.add(UI.p("Pro features", { icon:'product-pro', style:{ marginTop:'0.5em' } })); } } card.append(); } function outputTestimonials() { window.page.sections.main.appendChild(UI.div('inline').add(UI.element('blockquote', [UI.div().add(UI.img('/img/logos/doit.png', { dark:'/img/logos/doit_white.png' })), UI.p(["Used in nearly every incident, Pulsedive is now one of the core services doIT recommends to clients.", UI.element('cite', "Konrad Zacharias, Technical Consultant")])]))); } function outputButtons() { // add payment confirmation new Card({ name:'checkout', full:true, result:true }).append(); // add terms window.page.cards.checkout.add(UI.div('note center', { marginTop:'2em', maxWidth:'800px' }).add(UI.p(["Your payments are processed by Stripe in accordance with Stripe's ", UI.a('Terms of Service', 'https://stripe.com/legal', { newTab:true }), " and ", UI.a('Privacy Policy', 'https://stripe.com/privacy', { newTab:true }), ". Pulsedive does not store credit/debit card information."])).add(UI.p(["By using your Pulsedive account, you accept our ", UI.a("Terms of Service", '/terms', { newTab:true }), " and ", UI.a("Privacy Policy", '/privacy', { newTab:true }), "."]))); // add checkout buttons window.page.cards.checkout.buttons({ result:true }, [{ name:'contact', text:'Contact Sales', class:'midscreen bigscreen', click:function(done) { done(); window.page.forms.contact.ui.inputs.request.value = ''; window.page.forms.contact.modal(true); } }, window.page.user.uid <= 0 ? { name:'register', text:"Sign Up", class:'calltoaction', click:function(done) { window.page.forms.login.tab('register').modal(true); done(); } } : service == 'pro' && window.page.user.pro > 0 ? { name:'pay', text:"Subscribed", class:'calltoaction', disabled:true } : { name:'pay', text:"Checkout", class:'calltoaction', click:function(done) { // already subscribed if (service == 'pro' && window.page.user.pro > 0) { window.page.cards.checkout.result("You are already a Pro subscriber.", 'success'); done(); return; } // paid plan not selected if (['free', 'free_legacy'].indexOf(selected.api) >= 0 && selected.feed == 'free') { window.page.cards.checkout.result("Must select a paid plan to continue checkout.", 'error'); done(); return; } // fetch plans and prices new Request('POST', '/pulsedive/', { action:'checkout', period:period, api:selected.api, feed:selected.feed }, function(status, response) { // success if (response && response.success) { window.page.cards.checkout.result("Redirecting to Stripe...", 'success'); window.location.href = response.url; return; } // error window.page.cards.checkout.result(response ? response.error : "Problem redirecting to Stripe, please contact support.", 'error'); done(); }); } }]); // not registered if (window.page.user.uid <= 0) { return; } // determine safety of upgrading plans for (var product in active) { // Pro can't double-upgrade if (service == 'pro' && window.page.user.pro > 0) { continue; } // user is on free plan if (['free', 'free_legacy'].indexOf(active[product].plan) >= 0) { continue; } // user is a customer if (active[product].customer) { continue; } // add problem details new Card({ name:'confirm', result:true, class:'mandatory' }).append().form({ }, [{ type:UI.p("Your plans are managed by the Pulsedive Team.", { class:'error standout', icon:'exclamation-triangle', style:{ fontWeight:'bold' } }), marginBottom:'1em' }, { type:UI.p("This occurs when Pulsedive invoices your billing department directly, a separate agreement is in place between Pulsedive and you or your organization, or billing is otherwise managed outside of your Pulsedive account.", { class:'note' }) }, { type:UI.p("By continuing with a purchase here, you may accidentally downgrade your plans or be billed multiple times.", { class:'note', style:{ fontWeight:'bold' } }) }, { type:UI.p([UI.element('b', "If you would like to upgrade your plan,"), " we recommend you contact your billing manager or the Pulsedive Team directly."], { class:'standout', icon:'info-circle' }), marginTop:'1em', marginBottom:'1em' }], [{ name:'proceed', text:"I understand, I still want to upgrade here.", class:'danger', click:function(done) { Card.hideOverlay(); } }, { name:'contact', text:'Contact Pulsedive', class:'calltoaction', click:function(done) { done(); window.page.forms.contact.ui.inputs.request.value = "I would like to upgrade my " + services[service].display + " plan."; window.page.forms.contact.modal(true); } }]).modal(true); } } </script> </section> <!-- footer --> <footer data-hide="0"> <a href='https://pulsedive.com' target='_blank'>©2025 Pulsedive LLC | v6.3.09 | January 6</a> <!-- links --> <aside> <a data-crawler=1 href='/recent' target='_blank'><i class='fas fa-history'></i>Recent</a> <a name='slack' href='https://join.slack.com/t/pulsedive/shared_invite/enQtMzI3NDQyMjEzMTY4LTBhNmE1NWIyMjdhNjVkYTc5OWMxZGExNWM3OWIxYzYyZGNlMGMwODBjNTZlNjc0M2RhOGQ3MjQwYjQ1Nzk3ZGE' target='_blank'><i class='fab fa-slack inline'></i></a> <a name='linkedin' href='https://linkedin.com/company/pulsedive' target='_blank'><i class='fab fa-linkedin inline'></i></a> <a name='blog' href='https://blog.pulsedive.com' target='_blank'><i class='fas fa-rss inline'></i></a> <span>|</span> <a name='company' href='https://pulsedive.com/about/company' target='_blank'><i class='fas fa-copyright'></i>Company</a> <a data-action='contact'><i class='fas fa-envelope'></i>Contact</a> <a href='/terms' target='_blank'><i class='fas fa-file'></i>Terms</a> <a data-enterprise=0 href='/privacy' target='_blank'><i class='fas fa-user-secret'></i>Privacy</a> <a data-enterprise=1 href='/enterprise-privacy' target='_blank'><i class='fas fa-user-secret'></i>Privacy</a> </aside> </footer> </main> </body> </html>