PageSourceSearch

https://www.john-sheehan.com/

html john-sheehan.com collected 2026-09-25 03:44:44 UTC 138,705 bytes, 2,081 lines download raw bytes

1<!doctype html>
2<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en-US" >
3
4<head>
5  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6  
7  <meta name="viewport" content="width=device-width,initial-scale=1">
8  
9  <!-- This is Squarespace. --><!-- johnsheehan -->
10<base href="">
11<meta charset="utf-8" />
12<title>John Sheehan</title>
13<link rel="shortcut icon" type="image/x-icon" href="https://assets.squarespace.com/universal/default-favicon.ico"/>
14<link rel="canonical" href="https://john-sheehan.com"/>
15<meta property="og:site_name" content="John Sheehan"/>
16<meta property="og:title" content="John Sheehan"/>
17<meta property="og:url" content="https://john-sheehan.com"/>
18<meta property="og:type" content="website"/>
19<meta property="og:description" content="Co-founder and CEO of Runscope - Everything is going to be 200 OK™"/>
20<meta itemprop="name" content="John Sheehan"/>
21<meta itemprop="url" content="https://john-sheehan.com"/>
22<meta itemprop="description" content="Co-founder and CEO of Runscope - Everything is going to be 200 OK™"/>
23<meta name="twitter:title" content="John Sheehan"/>
24<meta name="twitter:url" content="https://john-sheehan.com"/>
25<meta name="twitter:card" content="summary"/>
26<meta name="twitter:description" content="Co-founder and CEO of Runscope - Everything is going to be 200 OK™"/>
27<meta name="description" content="Co-founder and CEO of Runscope - Everything is going to be 200 OK™" />
28<link rel="preconnect" href="https://images.squarespace-cdn.com">
29<script type="text/javascript" src="//use.typekit.net/ik/2wKeey4uU-WdRY1AA8noHMdsj6a7JGJFmcrqcAQGz9JfeTw2fFHN4UJLFRbh52jhWD9kwQItjDwXZQsKw2w3F26oZe4RF2Mhjy74MPG0-cNGd1FGZAmGjAt0SaBujW48Sagyjh90jhNlOeTz-etlShy8ZAyydKoRdhXC-cNGd1FGZAmGjAt0SaBujW48Sagyjh90jhNlOeUzjhBC-eNDifUaiaS0-cNGdKuD-em8-eB0OcFzdPUaiaS0-cNGd1FGZAmGjAt0SaBujW48Sagyjh90jhNlJ6NcZKuX-WFyOWi8jKu3ScvKBhZcOA4ySh8ROAizieyTjkuaZAJlSY4zJ6TliWF8dkuDjAoDH6qJlPSbMg6IJMJ7fbR1JyMMeMS6MKG4f4G1IMMj2KMfH6qJKfbbMg6sJMJ7fbKfssMgeMw6MKG4fF3VIMJjIkMfH6qJX3vbMy6gJMJ7fbRm2UMfeMw6MKG4fFSVIMJjgPMfH6qJuMvbMy6OJMJ7fbRZ2UMfeMS6MKG4fFjVIMJj2PMfH6qJh3vbMy64JMJ7fbRj2UMfeMv6MKG4fFGVIMJjIPMfqMesETYLgb.js"></script>
vendor: 1 bytes, line 29
29
30<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
vendor: 1 bytes, line 30
30
31<script type="text/javascript" crossorigin="anonymous" nomodule="nomodule" src="//assets.squarespace.com/@sqs/polyfiller/1.2.2/legacy.js"></script>
vendor: 1 bytes, line 31
31
32<script type="text/javascript" crossorigin="anonymous" src="//assets.squarespace.com/@sqs/polyfiller/1.2.2/modern.js"></script>
vendor: 1 bytes, line 32
32
33<script type="text/javascript">SQUARESPACE_ROLLUPS = {};</script>
vendor: 1 bytes, line 33
33
34<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/extract-css-runtime-b22ee0b389f7aab669d13-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-extract_css_runtime');</script>
vendor: 1 bytes, line 34
34
35<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/extract-css-runtime-b22ee0b389f7aab669d13-min.en-US.js" ></script>
35<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/extract-css-moment-js-vendor-98bddc81dc37f44faa7b2-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-extract_css_moment_js_vendor');</script>
vendor: 1 bytes, line 35
35
36<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/extract-css-moment-js-vendor-98bddc81dc37f44faa7b2-min.en-US.js" ></script>
36<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/cldr-resource-pack-83b0e6eb9a2c7557ad4c0-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-cldr_resource_pack');</script>
vendor: 1 bytes, line 36
36
37<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/cldr-resource-pack-83b0e6eb9a2c7557ad4c0-min.en-US.js" ></script>
37<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-vendors-stable-9b2a74c45b27271fd111d-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common_vendors_stable');</script>
vendor: 1 bytes, line 37
37
38<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-vendors-stable-9b2a74c45b27271fd111d-min.en-US.js" ></script>
38<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-vendors-9a613768d6f25acba519f-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common_vendors');</script>
vendor: 1 bytes, line 38
38
39<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-vendors-9a613768d6f25acba519f-min.en-US.js" ></script>
39<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-7d2274e9405484b5bb8c6-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common');</script>
vendor: 1 bytes, line 39
39
40<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-7d2274e9405484b5bb8c6-min.en-US.js" ></script>
40<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/performance-8b6f08d427d358ad6b72c-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-performance');</script>
vendor: 1 bytes, line 40
40
41<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/performance-8b6f08d427d358ad6b72c-min.en-US.js" defer ></script>
41<script data-name="static-context">Static = window.Static || {}; Static.SQUARESPACE_CONTEXT = {"facebookAppId":"314192535267336","facebookApiVersion":"v6.0","rollups":{"squarespace-announcement-bar":{"js":"//assets.squarespace.com/universal/scripts-compressed/announcement-bar-58a6b009b4233b99452d8-min.en-US.js"},"squarespace-audio-player":{"css":"//assets.squarespace.com/universal/styles-compressed/audio-player-702bf18174efe0acaa8ce-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/audio-player-9a75241d2b6f78112fca9-min.en-US.js"},"squarespace-blog-collection-list":{"css":"//assets.squarespace.com/universal/styles-compressed/blog-collection-list-3d55c64c25996c7633fc2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/blog-collection-list-b44b4108e3cadfeb3bb28-min.en-US.js"},"squarespace-calendar-block-renderer":{"css":"//assets.squarespace.com/universal/styles-compressed/calendar-block-renderer-49c4a5f3dae67a728e3f4-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/calendar-block-renderer-063de1ad5ad80a214bc2d-min.en-US.js"},"squarespace-chartjs-helpers":{"css":"//assets.squarespace.com/universal/styles-compressed/chartjs-helpers-53c004ac7d4bde1c92e38-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/chartjs-helpers-63b813c7a9ec7be6db999-min.en-US.js"},"squarespace-comments":{"css":"//assets.squarespace.com/universal/styles-compressed/comments-91e23fb14e407e3111565-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/comments-3b45e5c309452ea741d5c-min.en-US.js"},"squarespace-dialog":{"css":"//assets.squarespace.com/universal/styles-compressed/dialog-89b254b5c87045b9e1360-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/dialog-c9a8abedf0af91ae92751-min.en-US.js"},"squarespace-events-collection":{"css":"//assets.squarespace.com/universal/styles-compressed/events-collection-49c4a5f3dae67a728e3f4-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/events-collection-ad209f2eea72403faa8f9-min.en-US.js"},"squarespace-form-rendering-utils":{"js":"//assets.squarespace.com/universal/scripts-compressed/form-rendering-utils-b1d5d65641788de3cf4de-min.en-US.js"},"squarespace-forms":{"css":"//assets.squarespace.com/universal/styles-compressed/forms-4a16a8a8c965386db2173-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/forms-97f84da9fc6455c0dce66-min.en-US.js"},"squarespace-gallery-collection-list":{"css":"//assets.squarespace.com/universal/styles-compressed/gallery-collection-list-3d55c64c25996c7633fc2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/gallery-collection-list-a275e058377feac127abb-min.en-US.js"},"squarespace-image-zoom":{"css":"//assets.squarespace.com/universal/styles-compressed/image-zoom-8804675084a3982b022e3-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/image-zoom-7817bbf3299a0b654acc4-min.en-US.js"},"squarespace-pinterest":{"css":"//assets.squarespace.com/universal/styles-compressed/pinterest-3d55c64c25996c7633fc2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/pinterest-ac1b1bff95d1613e7cea4-min.en-US.js"},"squarespace-popup-overlay":{"css":"//assets.squarespace.com/universal/styles-compressed/popup-overlay-948192219c3257f767ec5-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/popup-overlay-2dd5c78ce532525922243-min.en-US.js"},"squarespace-product-quick-view":{"css":"//assets.squarespace.com/universal/styles-compressed/product-quick-view-5d6c4f164c4ab5457107a-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/product-quick-view-4f2e85c5e0b34204bd50c-min.en-US.js"},"squarespace-products-collection-item-v2":{"css":"//assets.squarespace.com/universal/styles-compressed/products-collection-item-v2-8804675084a3982b022e3-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/products-collection-item-v2-042671796c87a5a02797e-min.en-US.js"},"squarespace-products-collection-list-v2":{"css":"//assets.squarespace.com/universal/styles-compressed/products-collection-list-v2-8804675084a3982b022e3-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/products-collection-list-v2-68e682b0629ed86541771-min.en-US.js"},"squarespace-search-page":{"css":"//assets.squarespace.com/universal/styles-compressed/search-page-9d0a55de1efafbb9218e1-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/search-page-68fa3c1135f9072191668-min.en-US.js"},"squarespace-search-preview":{"js":"//assets.squarespace.com/universal/scripts-compressed/search-preview-46e11810a59e11b7e4b49-min.en-US.js"},"squarespace-simple-liking":{"css":"//assets.squarespace.com/universal/styles-compressed/simple-liking-ef94529873378652e6e86-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/simple-liking-599ed48f406bb7fd00d1a-min.en-US.js"},"squarespace-social-buttons":{"css":"//assets.squarespace.com/universal/styles-compressed/social-buttons-1f18e025ea682ade6293a-m
41in.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/social-buttons-1bbb33b7960a74025a462-min.en-US.js"},"squarespace-tourdates":{"css":"//assets.squarespace.com/universal/styles-compressed/tourdates-3d55c64c25996c7633fc2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/tourdates-a0585d7b8dcd9b6fc9891-min.en-US.js"},"squarespace-website-overlays-manager":{"css":"//assets.squarespace.com/universal/styles-compressed/website-overlays-manager-7cecc648f858e6f692130-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/website-overlays-manager-ddf855989db2c1dd04fe9-min.en-US.js"}},"pageType":1,"website":{"id":"52118c34e4b030489dbc406b","identifier":"johnsheehan","websiteType":1,"contentModifiedOn":1612796156219,"cloneable":false,"hasBeenCloneable":false,"siteStatus":{},"language":"en-US","timeZone":"America/Chicago","machineTimeZoneOffset":-21600000,"timeZoneOffset":-21600000,"timeZoneAbbr":"CST","siteTitle":"John Sheehan","fullSiteTitle":"John Sheehan","siteTagLine":"","siteDescription":"<p><a href=\"https://www.runscope.com/t/johnblog\">Co-founder and CEO of Runscope - Everything is going to be 200 OK\u2122</a></p>","shareButtonOptions":{"3":true,"7":true,"2":true,"8":true,"1":true,"6":true,"4":true},"authenticUrl":"https://john-sheehan.com","internalUrl":"https://johnsheehan.squarespace.com","baseUrl":"https://john-sheehan.com","primaryDomain":"john-sheehan.com","sslSetting":3,"isHstsEnabled":true,"typekitId":"","statsMigrated":true,"imageMetadataProcessingEnabled":false,"screenshotId":"506563f2","captchaSettings":{"enabledForDonations":false},"showOwnerLogin":false},"websiteSettings":{"id":"52118c35e4b030489dbc406c","websiteId":"52118c34e4b030489dbc406b","subjects":[],"country":"US","state":"CA","simpleLikingEnabled":false,"mobileInfoBarSettings":{"isContactEmailEnabled":false,"isContactPhoneNumberEnabled":false,"isLocationEnabled":false,"isBusinessHoursEnabled":false},"commentLikesAllowed":true,"commentAnonAllowed":true,"commentThreaded":true,"commentApprovalRequired":false,"commentAvatarsOn":true,"commentSortType":2,"commentFlagThreshold":0,"commentFlagsAllowed":true,"commentEnableByDefault":true,"commentDisableAfterDaysDefault":30,"disqusShortname":"","commentsEnabled":true,"storeSettings":{"returnPolicy":null,"termsOfService":null,"privacyPolicy":null,"expressCheckout":false,"continueShoppingLinkUrl":"/","useLightCart":false,"showNoteField":false,"shippingCountryDefaultValue":"US","billToShippingDefaultValue":false,"showShippingPhoneNumber":true,"isShippingPhoneRequired":false,"showBillingPhoneNumber":true,"isBillingPhoneRequired":false,"currenciesSupported":["USD"],"defaultCurrency":"USD","selectedCurrency":"USD","measurementStandard":1,"orderConfirmationInjectCode":"","showCustomCheckoutForm":false,"checkoutPageMarketingOptInEnabled":false,"enableMailingListOptInByDefault":false,"sameAsRetailLocation":false,"merchandisingSettings":{"scarcityEnabledOnProductItems":false,"scarcityEnabledOnProductBlocks":false,"scarcityMessageType":"DEFAULT_SCARCITY_MESSAGE","scarcityThreshold":10,"multipleQuantityAllowedForServices":true,"restockNotificationsEnabled":false,"restockNotificationsMailingListSignUpEnabled":false,"relatedProductsEnabled":false,"relatedProductsOrdering":"random","soldOutVariantsDropdownDisabled":false,"productComposerOptedIn":false,"productComposerABTestOptedOut":false,"productReviewsEnabled":false,"displayImportedProductReviewsEnabled":false,"hasOptedToCollectNativeReviews":false},"isLive":false,"multipleQuantityAllowedForServices":true},"useEscapeKeyToLogin":false,"ssBadgeType":1,"ssBadgePosition":4,"ssBadgeVisibility":1,"ssBadgeDevices":1,"pinterestOverlayOptions":{"mode":"disabled"},"ampEnabled":false},"cookieSettings":{"isCookieBannerEnabled":false,"isRestrictiveCookiePolicyEnabled":false,"isRestrictiveCookiePolicyAbsolute":false,"cookieBannerText":"","cookieBannerTheme":"","cookieBannerVariant":"","cookieBannerPosition":"","cookieBannerCtaVariant":"","cookieBannerCtaText":"","cookieBannerAcceptType":"OPT_IN","cookieBannerOptOutCtaText":""},"websiteCloneable":false,"collection":{"title":"John Sheehan","id":"521190b7e4b0775e185c57f0","fullUrl":"/","type":1,"permissionType":1},"subscribed":false,"appDomain":"squarespace.com","templateTweakable":true,"tweakJSON":{"TGutter":"3%","TMaxWidth":"300","TPerRow":"4","gallery-auto-play":"false","galleryPlaySpeed":"3.0","hide-thumbnail-titles":"true","outerPadding":"70px","pagePadding":"50px","product-gallery-auto-crop":"true","product-image-auto-crop":"true","thumbnail-layout":"Basic Grid","topPadding":"10px","tweak-v1-related-products-title-spacing":"50px"},"templateId":"4fd11f32c4aad9b01c9e624c","templateVersion":"7","pageFeatures":[1,2,4],"gmRenderKey":"QUl6YVN5Q0JUUk9xNkx1dkZfSUUxcjQ2LVQ0QWVUU1YtMGQ3bXk4","templateScriptsRootUrl":"https://static1.squarespace.com/static/ta/4fd1028ee4b02be53c65dfb3/1359/scripts/","betaFeatureFlags":["campaigns_global_uc_ab","fluid_engine_block_resizing_indicator","product_composer_feedback_form_on_save","commerce_clearpay","viewer-role-contributor-invites","member_areas_spanish_interviews","block_annotations_revamp","marketing_landing_page","campaigns_new_image_layout_picker","fluid_engine","customer_account_creation_recaptcha","member_areas_schedule_interview","commerce_etsy_product_import","crm_retention_segment","commerce_restock_notifications","commerce_site_visitor_metrics","scheduling_block_schema_editor","campaigns_new_subscriber_search","background_art_onboarding","customer_accounts_email_verification","campaigns_thumbnail_layout","nested_categories_migration_enabled","campaigns_discount_section_in_blasts","fluid_engine_filtered_catalog_endpoints","campaigns_asset_picker","campaigns_content_editing_survey","fluid_engine_clean_up_grid_contextual_change","block_duplication","customer_account_creation_emails","asset_uploader_refactor","campaigns_show_featured_templates","crm_remove_subscriber","crm_default_newsletter_block_to_campaigns","commerce_etsy_shipping_import","send_local_pickup_ready_email"],"videoAssetsFeatureFlags":["hls-playback","mux-data-video-collection"],"impersonatedSession":false,"tzData":{"zones":[[-360,"US","C%sT",null]],"rules":{"US":[[1967,2006,null,"Oct","lastSun","2:00","0","S"],[1987,2006,null,"Apr","Sun>=1","2:00","1:00","D"],[2007,"max",null,"Mar","Sun>=8","2:00","1:00","D"],[2007,"max",null,"Nov","Sun>=1","2:00","0","S"]]}},"showAnnouncementBar":false,"recaptchaEnterpriseContext":{"recaptchaEnterpriseSiteKey":"6LeDzNAaAAAAAEkjrk4yKez3Zm1UQ_MANiUGTq7O"}};</script>
41<script>SquarespaceFonts.loadViaContext(); Squarespace.load(window);</script>
41
42<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="https://john-sheehan.com/blog?format=rss" />
43<script type="application/ld+json">{"url":"https://john-sheehan.com","name":"John Sheehan","description":"<p><a href=\"https://www.runscope.com/t/johnblog\">Co-founder and CEO of Runscope - Everything is going to be 200 OK\u2122</a></p>","@context":"http://schema.org","@type":"WebSite"}</script>
43<link rel="stylesheet" type="text/css" href="https://static1.squarespace.com/static/sitecss/52118c34e4b030489dbc406b/39/4fd11f32c4aad9b01c9e624c/52118c38e4b030489dbc4342/1359/site.css"/><link rel="openid.server" href="http://www.myopenid.com/server" />
44<link rel="openid.delegate" href="http://johnsheehan.myopenid.com/" />
45<meta http-equiv="X-XRDS-Location" content="http://johnsheehan.myopenid.com/xrds" />
46<meta property="twitter:account_id" content="11381522" />
46<script>Static.COOKIE_BANNER_CAPABLE = true;</script>
vendor: 1 bytes, line 46
46
47<script async src="https://www.googletagmanager.com/gtag/js?id=$GA_TRACKING_ID$"></script>
47<script>window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('set', 'developer_id.dZjQwMz', true);gtag('config', 'UA-8399155-3');</script>
47<!-- End of Squarespace Headers -->
48</head>
49
50<body class="blog-sidebar-display-auto index-thumb-title-position-below index-item-layout-auto thumbnail-layout-basic-grid thumbnails-on-open-page-show-all hide-thumbnail-titles  layout-style-left page-borders-thick underline-body-links gallery-page-controls-tiny-thumbnails  social-icon-style-round       event-thumbnails event-thumbnail-size-32-standard event-date-label event-date-label-time event-list-show-cats event-list-date event-list-time event-list-address   event-icalgcal-links  event-excerpts  event-item-back-link    product-list-titles-under product-list-alignment-center product-item-size-11-square product-image-auto-crop product-gallery-size-11-square product-gallery-auto-crop show-product-price  product-social-sharing tweak-v1-related-products-image-aspect-ratio-11-square tweak-v1-related-products-details-alignment-center newsletter-style-dark  opentable-style-light small-button-style-solid small-button-shape-square medium-button-style-solid medium-button-shape-square large-button-style-solid large-button-shape-square image-block-poster-text-alignment-center image-block-card-dynamic-font-sizing image-block-card-content-position-center image-block-card-text-alignment-left image-block-overlap-dynamic-font-sizing image-block-overlap-content-position-center image-block-overlap-text-alignment-left image-block-collage-dynamic-font-sizing image-block-collage-content-position-top image-block-collage-text-alignment-left image-block-stack-dynamic-font-sizing image-block-stack-text-alignment-left button-style-default button-corner-style-square tweak-product-quick-view-button-style-floating tweak-product-quick-view-button-position-bottom tweak-product-quick-view-lightbox-excerpt-display-truncate tweak-product-quick-view-lightbox-show-arrows tweak-product-quick-view-lightbox-show-close-button tweak-product-quick-view-lightbox-controls-weight-light native-currency-code-usd collection-type-blog collection-layout-default collection-521190b7e4b0775e185c57f0 homepage view-list mobile-style-available site-title" id="collection-521190b7e4b0775e185c57f0">
51
52  <div id="canvas">
53
54      
55
56
57    <header id="header">
58      <div id="logo" data-content-field="site-title">
59        
60        <h1 class="logo"><a href="/">John Sheehan</a></h1>
61        
62        
63      </div>
64      
64<script type="module">
65        Y.use('squarespace-ui-base', function(Y) {
66          Y.all("#header .logo, #header .logo-subtitle").each(function (text) {
67            text.plug(Y.Squarespace.TextShrink, {
68              parentEl: Y.one('#header'),
69              triggerWidth: 750
70            });
71          });
72        });
73
74        // Show spinner on page load if loading bookmarked url
75        if (window.location.hash && window.location.hash !== '#') {
76          document.querySelector('body').className += ' index-loading';
77        }
78      </script>
78
79      <div id="topNav" data-content-field="navigation">
80<nav class="main-nav">
81  <ul>
82  
83  </ul>
84</nav>
85</div>
86
87    </header>
88
89    <div class="page-divider"></div>
90
91    <div class="extra-wrapper page-header">
92      <div class="sqs-layout sqs-grid-12 columns-12 empty" data-layout-label="Header Content: John Sheehan" data-type="block-field" id="page-header-521190b7e4b0775e185c57f0"><div class="row sqs-row"><div class="col sqs-col-12 span-12"></div></div></div>
93    </div>
94
95    <section id="page" role="main" data-content-field="main-content">
96      <!-- CATEGORY NAV -->
97      
98      <div class="article-list hfeed">
99
100
101
102<article class="hentry author-john-sheehan post-type-text article-index-1" id="article-60215365c1c7150cc9e2ed35" data-item-id="60215365c1c7150cc9e2ed35">
103
104  <!--SPECIAL CONTENT-->
105
106  
107
108
109  <!--POST HEADER-->
110
111  <header>
112    <h1 class="entry-title">
113      
114        <a href="/blog/raising-money-when-you-have-no-idea-what-youre-doing" data-content-field="title">Raising Money When You Have No Idea What You’re Doing</a>
115      
116    </h1>
117    <div class="meta">
118      <span class="date"><time class="published" datetime="2018-05-22">May 22, 2018</time></span>
119    </div>
120  </header>
121
122  <!--POST BODY-->
123
124  
125    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1612796889601" id="item-60215365c1c7150cc9e2ed35"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-0f944439b88124a3b135"><div class="sqs-block-content">
126
127<p class="" style="white-space:pre-wrap;">People somewhat regularly ask me for advice on raising money, typically at very early stages (angel or seed rounds). I was lucky to be able to raise $7.1M in two rounds at Runscope, so I guess that gives me some level of credibility with the process. I don’t actually think I was very good at fundraising — my success rate was probably something less than 1% if you take into account how many pitches didn’t lead to an investment.</p><p class="" style="white-space:pre-wrap;">I went through seven&nbsp;major revisions of My Deck™ and about 50 meetings before we got a term sheet for the seed round. Each revision attempted to resolve the typical set of issues you hear from feedback of failed pitches:</p><ul data-rte-list="default"><li><p class="" style="white-space:pre-wrap;">Not enough market size data.</p></li><li><p class="" style="white-space:pre-wrap;">Not compelling enough problem statement.</p></li><li><p class="" style="white-space:pre-wrap;">Too focused on technical solutions over business viability.</p></li><li><p class="" style="white-space:pre-wrap;">Underspecified go-to-market strategy.</p></li><li><p class="" style="white-space:pre-wrap;">Poor competitive differentiation, etc.</p></li></ul><p class="" style="white-space:pre-wrap;">I eventually settled on creating a narrative instead of trying to convince investors with an avalanche of facts, logic and pie-in-the-sky projections.&nbsp;The deck became an accessory to the narrative, not vice-versa.</p><p class="" style="white-space:pre-wrap;">I’ve only sat on the other side of the table a few times, so I’m not sure how investors in general would feel about this, but I know from the dull pitches I have sat through, a compelling narrative would have gone a long way. Below is a framework for thinking about your pitch as a story that I’ve sent around to people when they ask for advice raising. It worked for us. If you’re struggling with your pitch, it may work for you too.</p>
128
129
130</div></div><div class="sqs-block horizontalrule-block sqs-block-horizontalrule" data-block-type="47" id="block-yui_3_17_2_1_1612795948117_86219"><div class="sqs-block-content"><hr /></div></div><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-yui_3_17_2_1_1612795948117_86288"><div class="sqs-block-content">
131
132<p class="" style="white-space:pre-wrap;">There is a timeline from when you first had your idea for a company to the eventual conclusion of your startup as a big company. This is the story to tell. Whenever you are pitching, you are at some point on that timeline. Your deck should reflect that position in time.</p><p class="" style="white-space:pre-wrap;">Start with quantifying the problem (in real terms! e.g.<em>“Companies are losing $X by [whatever solution you’ll replace for the problem they have]”</em>), how you recognized it, and why you’re the best team to solve it. Pick absolutely the most important points for each of those. Talk about traction only as a reinforcement of the previous points. Do not overwhelm with info. Investors will remember basically nothing specific.</p><p class="" style="white-space:pre-wrap;">Once you’ve established that, the next part is working forward in time. The further out you get, the more “blurry” it will need to be. But you need to pick milestones. If your next step after the seed round is an A round, describe the resources you need to achieve the business milestones that will set you up for the A round, THEN mention that it will take $X in funding to get there. Work backwards from the next milestone. Pick only the 1–3 most important things you’re going to accomplish.</p><p class="" style="white-space:pre-wrap;">When you structure a pitch like this here are the things you don’t have to beat over investors’ heads: market size, competition, business model. If you’ve made a compelling case at the beginning of the story, those will all be readily apparent. You should absolutely have answers for those questions, but you don’t need to focus on them.</p><p class="" style="white-space:pre-wrap;">Instead, focus on:</p><ul data-rte-list="default"><li><p class="" style="white-space:pre-wrap;">This is a big problem.</p></li><li><p class="" style="white-space:pre-wrap;">There’s nobody better to solve it.</p></li><li><p class="" style="white-space:pre-wrap;">You should get in now to help us continue on to the inevitable next milestone and ultimate success.</p></li></ul><p class="" style="white-space:pre-wrap;">Get them excited about the story, not any specific number.</p><p class="" style="white-space:pre-wrap;">Remember, investors will remember next to nothing&nbsp;(they get pitched A LOT) so pick your spots and make the few key things that need to be recalled over-emphasized. Repeat them at each stage and how it applies to the past, present and future. Imagine after your meeting they’re going to de
132scribe it to another investor in the hallway.&nbsp;What is the one thing you’d want them to say about you? Repeat that over and over again in your pitches.&nbsp;Have answers for everything, but keep the deck focused on the key points. In a way, the less info the better because there’s less chance you’ll get pulled off in random tangents.</p><p class="" style="white-space:pre-wrap;">Lastly, this is the single piece of advice that changed my approach to fundraising:&nbsp;<strong>Find true believers, not converts.</strong>&nbsp;Think of the process as eliminating anyone who does not believe in what you’re doing. When you find your first believers, you’ll wonder why you spent so much energy trying to convince people. The difference in behavior on their part is striking.</p>
133
134
135</div></div></div></div></div></div>
136    
137  
138
139
140  <!--POST FOOTER-->
141
142  <footer>
143    <div class="meta">
144
145      
146
147      
148
149      <div class="second meta-row">
150        
151        
152        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/60215365c1c7150cc9e2ed35/1612796889898/" data-record-type="1" data-full-url="/blog/raising-money-when-you-have-no-idea-what-youre-doing" data-title="Raising Money When You Have No Idea What You’re Doing"></span>
153      </div>
154
155    </div>
156  </footer>
157
158
159  </article>
160
161  <div class="post-divider"></div>
162
163
164<article class="hentry author-john-sheehan post-type-text article-index-2" id="article-59ca6f01197aeaecf476d2df" data-item-id="59ca6f01197aeaecf476d2df">
165
166  <!--SPECIAL CONTENT-->
167
168  
169
170
171  <!--POST HEADER-->
172
173  <header>
174    <h1 class="entry-title">
175      
176        <a href="/blog/thank-you" data-content-field="title">Thank You</a>
177      
178    </h1>
179    <div class="meta">
180      <span class="date"><time class="published" datetime="2017-09-28">September 28, 2017</time></span>
181    </div>
182  </header>
183
184  <!--POST BODY-->
185
186  
187    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1506438913709" id="item-59ca6f01197aeaecf476d2df"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-6a48a90e22d8ac47b39f"><div class="sqs-block-content">
188
189<p>Today we announced that <a href="https://blog.runscope.com/posts/301">Runscope has been acquired by CA Technologies</a>. This was made possible by the contributions of so many people. I'm eternally grateful for your support.</p><p><strong>To our customers:</strong> I can't overstate how obsessed we are with building a tool you can trust and rely on to solve real technology problems. Thank you for pushing us to always be better, and for being patient when we can't meet your needs exactly. We'll continue to use your feedback as the primary driver in setting our direction.</p><p><strong>To the API and developer community:&nbsp;</strong>So many people in the community have helped spread the word about Runscope that it would be impossible name everyone, but I want to give special thanks to Jeff Lindsay, &nbsp;Kin Lane, Kenneth Reitz, Jason Harmon, Cory Benfield, Marty Alchin, Matt Bernier, Hung Truong, Kristen Womack, Bruno Pedro, Keith Casey, Steve Willmott, Adam Duvander, James Higginbotham, Phil Sturgeon, Mehdi Medjaoui, Jeremiah Lee, and David Hayes.</p><p><strong>To our investors and advisors:&nbsp;</strong>Without your belief in our vision, Runscope wouldn't exist. In particular, I'd like to thank Nat Friedman, Jon Dahl, Steve Herrod, Ullas Naik, Tom Drummond, James Lindenbaum, Justin Mares, Greg Burkus, Robert Benner, David Cohen, Steve Schlafman, Taylor Greene, Frank Chen, Chris Dixon, Peter Werner, and Amanda Busch.</p><p><strong>To True Ventures:&nbsp;</strong>You set an example for how a VC should be. To say you are "founder friendly" would be a major understatement. You've been a true partner from the very beginning and have stood by Frank and me every step of the way. &nbsp;To Adam, Puneet, Phil, Christiaan, Jon and everyone else at True, thank you.</p><p><strong>To Runscopers past and present:</strong> People, product, profit. The people of Runscope have always been my favorite part of this venture. Working with and learning from you has been an honor and the highlight of my career.&nbsp;Thank you for taking a chance on us. I hope we are a worthy line on your resumé.</p><p><strong>To Frank:</strong>&nbsp;<em>There is no movement without the <a href="https://www.youtube.com/watch?v=fW8amMCVAJQ">first follower</a>.</em>&nbsp;Your steady hand was a calming force in the startup chaos. You remained dedicated through the highs and lows and consistently pushed me to be better.&nbsp;I couldn't ask for a better co-founder.</p><p><strong>To Emily:</strong>&nbsp;I couldn't have run this company without your support and counsel. Your unwavering support means the world to me. Thank y
189ou, I love you.</p>
190
191
192</div></div></div></div></div></div>
193    
194  
195
196
197  <!--POST FOOTER-->
198
199  <footer>
200    <div class="meta">
201
202      
203
204      
205
206      <div class="second meta-row">
207        
208        
209          <span class="comments">
210            
211              <a href="/blog/thank-you#comments-59ca6f01197aeaecf476d2df">
212                
213                  2 Comments
214                
215              </a>
216            
217          </span>
218        
219        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/59ca6f01197aeaecf476d2df/1506610336968/" data-record-type="1" data-full-url="/blog/thank-you" data-title="Thank You"></span>
220      </div>
221
222    </div>
223  </footer>
224
225
226  </article>
227
228  <div class="post-divider"></div>
229
230
231<article class="hentry author-john-sheehan post-type-text article-index-3" id="article-6021512bd96df944d8b4212e" data-item-id="6021512bd96df944d8b4212e">
232
233  <!--SPECIAL CONTENT-->
234
235  
236
237
238  <!--POST HEADER-->
239
240  <header>
241    <h1 class="entry-title">
242      
243        <a href="/blog/twilio-retrospective" data-content-field="title">Twilio: A Retrospective</a>
244      
245    </h1>
246    <div class="meta">
247      <span class="date"><time class="published" datetime="2016-06-22">June 22, 2016</time></span>
248    </div>
249  </header>
250
251  <!--POST BODY-->
252
253  
254    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1612796642569" id="item-6021512bd96df944d8b4212e"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-3df491a708a57b9b178f"><div class="sqs-block-content">
255
256<p class="" style="white-space:pre-wrap;">It’s been over 4 years since I left Twilio but no career experience outside of Runscope has had a bigger impact on me. With the impending Twilio IPO, I’m finding myself especially nostalgic about my time there. I was only there two years, but I learned so much.</p><h2 style="white-space:pre-wrap;">Discovering Twilio</h2><p class="" style="white-space:pre-wrap;">In 2008 I was a web developer in the Twin Cities. I&nbsp;ran a big softball league and when it would rain I needed to notify 600+ people that the games were canceled. I used my cell phone’s voicemail as a hotline for awhile but that rendered my phone useless on game days. I thought it was ridiculous that everyone had to ‘poll’ the hotline for updates. I wanted push notifications via phone.</p><p class="" style="white-space:pre-wrap;">My first attempt at this involved trying to set up Asterisk. Being a Windows user though I didn’t even get past getting a Linux distro set up (kids, learn *nix). I gave up pretty quickly.</p><p class="" style="white-space:pre-wrap;">One night during the off season I was reading TechCrunch when I came across&nbsp;<a href="http://techcrunch.com/2008/11/20/twilio-powerful-api-for-phone-services-that-can-recreate-grandcentral-in-15-lines-of-code/"><span style="text-decoration:underline">a post about Twilio</span></a>. It sounded like the perfect fit. I went to the site, read the docs and a few minutes later my phone was ringing. I don’t know how to describe the feeling I had. I recall running around the house. I think I scared my wife.</p><p class="" style="white-space:pre-wrap;">I was hooked. In just a few minutes a whole new set of capabilities opened up to me. I was consumed with ideas of telephony apps to build. My eyes were opened to the power of APIs. Stumbling on that TechCrunch post literally changed my life.</p><h2 style="white-space:pre-wrap;">From Fanboy to Employee</h2><p class="" style="white-space:pre-wrap;">I started&nbsp;<a href="https://web.archive.org/web/20090710162504/http://john-sheehan.com/blog/building-a-simple-voicemail-system-with-twilio-and-aspnet-mvc-part-1"><span style="text-decoration:underline">blogging about Twilio</span></a>, writing sample apps and&nbsp;<a href="https://web.archive.org/web/20100923191339/http://john-sheehan.com/blog/twilioapi-net-wrapper-for-the-twilio-rest-api-now-available/"><span style="text-decoration:underline">helper libraries</span></a>,&nbsp;<a href="https://web.archive.org/web/20100923170843/http://john-sheehan.com/blog/using-web-service-apis-in-your-apps-video/"><span style="text-decoration:underline">giving talks at user groups</span></a>&nbsp;and regularly participating in their weekly IRC office hours where I virtually got to know Danielle Morrill, Jeff Lawson, Evan Cooke and other members of the team. Not too long after,&nbsp;<a href="https://www.twilio.com/blog/2009/07/congrats-john-sheehan-you-won-a-netbook-with-simple-hotline.html"><span style="text-decoration:underline">I won the infamous Netbook contest</span></a>&nbsp;which&nbsp;<a href="https://web.archive.org/web/20101123140342/http://john-sheehan.com/blog/i-won-a-contest/"><span style="text-decoration:underline">I was ridiculously proud of</span></a>. Ironically, when I later took over running the contest I went to the master spreadsheet and found out there was only one other entry that week and it didn’t even work. I didn’t care; a win is a win.</p><p class="" style="white-space:pre-wrap;">In early 2010 I was in Las Vegas for a trade show for the company I was working for. I saw that Danielle was tweeting about being at a different show there and so we started planning to meet in person for the first time. I was able to leave my show early and go over to the conference center where Twilio was exhibiting. The security guard wouldn’t let me in without a badge. I hung out near the entrance hoping to catch them on the way out but I noticed an exit-only side door people were leaving the show through. When the guard wasn’t looking, I snuck through the door. Conveniently, the Twilio booth was just inside where I found Danielle and told her how I got in much to her amusement&nbsp;(if you know Danielle, you know this is her kind of thing).</p><p class="" style="white-space:pre-wrap;">We chatted a bit and then she mentioned she wanted to introduce me to Jeff Lawson. When we found him, she introduced me b
256y saying,&nbsp;“Jeff, this is John Sheehan, my first choice for our evangelist job opening.” This was news to me on two fronts: that such a job existed and that I was a candidate for it&nbsp;(I had only previously applied for a PHP developer job I was not qualified for).</p><p class="" style="white-space:pre-wrap;">Jeff and I chatted and he invited me to dinner with some Twilio customers, investors and other team members.&nbsp;It felt like a dry run of doing an evangelist’s job. After dinner they told me they wanted me to come out to SF for an interview. A few days later, without even visiting, I got an offer that I quickly accepted.&nbsp;<a href="https://web.archive.org/web/20100923194919/http://john-sheehan.com/blog/career-change/"><span style="text-decoration:underline">I started April 5th, 2010 as Twilio’s first full-time Developer Evangelist</span></a>&nbsp;and Twilio’s 10th employee.</p><h2 style="white-space:pre-wrap;">Being an Evangelist</h2><p class="" style="white-space:pre-wrap;">I didn’t really have a job description. I knew my job was to&nbsp;<a href="https://www.twilio.com/blog/2010/04/my-name-is-john-im-here-to-help-you-be-awesome.html"><span style="text-decoration:underline">help bring developers to Twilio</span></a>&nbsp;by doing the things I was already doing but I didn’t know what success looked like.&nbsp;We ended up mostly focusing on registered developers as our success metric but found&nbsp;the best way to drive that was not to evangelize (UGH STILL HATE THAT WORD) Twilio but to help developers be more successful.&nbsp;Period.&nbsp;Eventually those relationships would benefit the company when it benefited the developer.</p><p class="" style="white-space:pre-wrap;">I really loved doing the job. I met so many great people, many of which I still consider friends. I got way better at writing and presenting. We were blazing a trail for how small companies could do developer outreach (remember that prior to 2010 most Developer Evangelists were at companies like Microsoft and Sun). The sign ups were piling up and accelerating. It was exhausting and exhilarating. The team was growing and I eventually took it over. Shortly after, a new opportunity within the company emerged that I had to go after.</p><h2 style="white-space:pre-wrap;">Working for Danielle</h2><p class="" style="white-space:pre-wrap;">Danielle is the best manager I’ve ever had. No one has ever pushed me harder.&nbsp;She gave me a ton of autonomy and trusted me to do what I thought was best for the company and our community. She made sure I was recognized for my successes and took the fall for my failures.</p><p class="" style="white-space:pre-wrap;">She knew how competitive I was and used it to push me further. We had a 1–1 meeting once where she told me whoever got the most blog page views that month would win something. I found out the next month (after “winning”) she hadn’t included anyone else on the team in the contest. I was really happy with the results and too impressed with being hoodwinked to be upset.</p><p class="" style="white-space:pre-wrap;">Danielle is a polarizing figure but is one of the sharpest people I know and someone I will never, ever bet against.</p><h2 style="white-space:pre-wrap;">The API Debate</h2><p class="" style="white-space:pre-wrap;">Shortly after I moved to SF to take over the evangelism team we were gearing up for a new product launch. Earlier on in the development the team was having trouble coming up with a friendly API (JavaScript in this case). I made a proposal that got adopted. Having that level of impact on product design from outside the product team on a big new product was a big personal win.</p><p class="" style="white-space:pre-wrap;">Closer to launch, there were still some details to be worked out on the design. Under the pressure of shipping many people became involved in a debate on a final issue. PMs, devs, support, and even Jeff were trying to work it out. I felt very invested in the outcome considering my earlier contribution and having just moved to SF literally to be more involved in moments like this. It got a little heated and I ultimately ‘lost’. I was pretty devastated. My reaction didn’t sit well with a few people. I stewed a little bit but calmed down and got on with the launch. There was too much to do. Unfortunately this would come up again later.</p><h2 style="white-space:pre-wrap;">Becoming a Product Manager</h2><p class="" style="white-space:pre-wrap;">As the product line grew it became difficult for every team to focus on developer experience. The developer console, docs, helper libraries, etc. were starting&nbsp;to suffer a bit from a lack of attention.&nbsp;A new position opened up on the product team to be the Product Manager for developer experience. It felt like a perfect and obvious next step for me given the amount of direct customer feedback I had been exposed to the previous 18 months.</p><p class="" style="white-space:pre-wrap;">I don’t know what was going on behind the scenes, but it took a long time (around 3 months) to go from expressing interest to getting the job (earlier design debate incident perhaps?). I’m sure it was complicated but it was really frustrating. I didn’t really feel like I had a lot of momentum once the switch was official. My team was small, the projects were unsexy (the ones we wanted to do wouldn’t drive the business) and I was new at being a PM. It didn’t go particularly well.</p><h2 style="white-space:pre-wrap;">The Breakdown</h2><p class="" style="white-space:pre-wrap;">While I was failing at being a PM, some new initiatives in the company were being explored that I felt like undermined our developer-friendly ethos. I understood the potential upside but&nbsp;
256it felt like the company was going through its biggest change yet (change was not uncommon, things felt very different at 10, 20, 50 and 100 people).</p><p class="" style="white-space:pre-wrap;">As a PM with a backlog a mile long, it was difficult to watch resources get diverted to things I didn’t believe in. I was also a bit burned out from the intensity of the previous 18 months. This all culminated in a meeting with Jeff (my manager at the time) where I broke down and cried over where things were going. I’ve never been more embarrassed in my career. I left the meeting with a sense that my time at Twilio was coming to an end soon.</p><p class="" style="white-space:pre-wrap;">I don’t blame Jeff or others in the company for pursuing those opportunities. I probably would have done the same in their position. While those projects were ultimately scuttled, I think the company learned a lot. I was really excited the first time I saw the “Ask Your Developer” billboard years later.&nbsp;It felt like a return to the Twilio I loved.</p><h2 style="white-space:pre-wrap;">Leaving</h2><p class="" style="white-space:pre-wrap;">I left in March of 2012. The company had gone from 10 to over 100 employees. Our registered developers had gone from single-digit thousands to over 100,000. The evangelism team was around 10 people strong and becoming a machine (Rob and crew have done an amazing job since taking it to over 1M developers).</p><p class="" style="white-space:pre-wrap;">On my 2nd to last day I accidentally spilled coffee on my laptop and destroyed it.</p><p class="" style="white-space:pre-wrap;">Quitting was a mixed bag of emotions. I missed the people. I missed the sense of urgency. I missed the prestige that came with being a part of a startup that was making it. But I was also relieved to not be so stressed all the time.</p><p class="" style="white-space:pre-wrap;">Do I wish I had stayed? The short answer is “no” but I’m definitely experiencing a bit of FOMO right now. I went to Twilio because I truly believed it had a chance to become a successful company. There was always a really strong sense of mission and endless opportunity. It was palpable sometimes. I would have loved to have seen that play out directly, but leaving was still the right choice. In the 4 years since, I’ve been incredibly fortunate. I owe my entire career since to having been at Twilio. I will probably be banking on that for years to come.</p><p class="" style="white-space:pre-wrap;">I have only one regret: I should have negotiated for more options.</p><h2 style="white-space:pre-wrap;">Other Random Memories</h2><p class="" style="white-space:pre-wrap;">Opening the first red track jacket, Jeff waiting on Andrew, missing every company photo, the Montana trip (and subsequent Owl reward), Super Startup Weekend,&nbsp;Epic Sax on a string, the Chicago demo fail, johnsheehanneedsajacket.com, Andre Bempton,&nbsp;Mark’s laugh, Frank taking a stand on ‘presents’, the fake Twitter feedback, 95% Taylor Swift, Bad Romance jam session,&nbsp;4am Whattaburger, London tube singing guy &amp; Hawksmoor,&nbsp;Twilio’s first “acquisition” via expense report.</p>
257
258
259</div></div></div></div></div></div>
260    
261  
262
263
264  <!--POST FOOTER-->
265
266  <footer>
267    <div class="meta">
268
269      
270
271      
272
273      <div class="second meta-row">
274        
275        
276        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/6021512bd96df944d8b4212e/1612796642758/" data-record-type="1" data-full-url="/blog/twilio-retrospective" data-title="Twilio: A Retrospective"></span>
277      </div>
278
279    </div>
280  </footer>
281
282
283  </article>
284
285  <div class="post-divider"></div>
286
287
288<article class="hentry author-john-sheehan post-type-text article-index-4" id="article-53fe16b0e4b093defe90ce21" data-item-id="53fe16b0e4b093defe90ce21">
289
290  <!--SPECIAL CONTENT-->
291
292  
293
294
295  <!--POST HEADER-->
296
297  <header>
298    <h1 class="entry-title">
299      
300        <a href="/blog/ultimate-api-webhook-backend-service-debugging-testing-monitoring-and-discovery-tools-list" data-content-field="title">60+ Tools and Services for API and Webhook Logging, Debugging, Testing, Monitoring, Documentation and Discovery</a>
301      
302    </h1>
303    <div class="meta">
304      <span class="date"><time class="published" datetime="2014-08-28">August 28, 2014</time></span>
305    </div>
306  </header>
307
308  <!--POST BODY-->
309
310  
311    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1409165890823" id="item-53fe16b0e4b093defe90ce21"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block image-block sqs-block-image" data-block-type="5" id="block-yui_3_17_2_1_1409250767751_13763"><div class="sqs-block-content">
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326 
327
328  
329  
330    <div
331        class="
332          image-block-outer-wrapper
333          layout-caption-hidden
334          design-layout-inline
335          
336          
337          
338        "
339        data-test="image-block-inline-outer-wrapper"
340    >
341
342      
343
344      
345        <figure
346            class="
347              sqs-block-image-figure
348              intrinsic
349            "
350            style="max-width:800px;"
351        >
352          
353        
354        
355
356        
357          
358            
359          <div
360              
361              
362              class="image-block-wrapper"
363              data-animation-role="image"
364              
365  data-animation-override
366
367          >
368            <div class="sqs-image-shape-container-element
369              
370          
371        
372              has-aspect-ratio
373            " style="
374                position: relative;
375                
376                  padding-bottom:53.375%;
377                
378                overflow: hidden;
379              "
380              >
381              <noscript><img src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1409251072607-GBTKB6BDW90GNIRZJHW8/image-asset.jpeg" alt="" /></noscript><img class="thumb-image" data-src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1409251072607-GBTKB6BDW90GNIRZJHW8/image-asset.jpeg" data-image="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1409251072607-GBTKB6BDW90GNIRZJHW8/image-asset.jpeg" data-image-dimensions="800x427" data-image-focal-point="0.5,0.5" alt="" data-load="false" data-image-id="53ff7700e4b09024f2c1264c" data-type="image" />
382            </div>
383          </div>
384        
385          
386        
387
388        
389      
390        </figure>
391      
392
393    </div>
394  
395
396
397
398</div></div><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-11569e8915be1b323202"><div class="sqs-block-content">
399
400<p>Pretty much every day someone asks me if there's a tool for solving a specific API problem. While <a href="https://www.runscope.com">Runscope</a> solves many API problems (particularly debugging, testing and monitoring) for app developers, there are many things we don't do. My goal with this post is to list out all the API tools that I know of and frequently recommend to people. Some even compete with us, but the more the merrier.</p><p>I've left out code libraries and frameworks since that would make the post too long.</p><h3>Webhook Debugging</h3><ul><li><strong><a href="http://requestb.in/">RequestBin</a></strong> - The original POST catcher, formerly postbin.org. Inspect HTTP requests. (Free)</li><li><strong><a href="http://webhookinbox.com/">Webhook Inbox</a></strong> - Receives HTTP requests and captures the data for later inspection. (Free)</li><li><strong><a href="http://respondto.it/">RespondTo.it</a></strong> -&nbsp;Debug web hooks like a pro. Supports custom responses. (Free)&nbsp;</li><li><strong><a href="http://inspectb.in/">InspectBin</a></strong> - Similar to RequestBin with live updates (Free)</li><li><strong><a href="https://www.runscope.com/docs/request-capture">Runscope Request Captures</a></strong> - HTTP request inspection with sharing, live updates, SSL, persistent URLs, search, comparisons and more. (Free + Paid)</li></ul><h3>Webhook Utilities</h3><ul><li><strong><a href="http://hookify.io/">Hookify</a></strong> - Filter, manipulate, combine and forward webhook events. (Private Beta)</li><li><strong><a href="http://webhooks.io/">Webhooks.io</a></strong> - Fast, reliable, scalable webhook delivery platform. (Private Beta)</li><li><strong><a href="https://www.webscript.io/">Webscript</a></strong>
400 - Webhook receiver and scripting engine using Lua. (Free + Paid)</li><li><strong><a href="https://torpio.com/">Torpio</a></strong> -&nbsp;JavaScript micro scripting platform for joining up &amp; extending cloud apps. (Free + Paid)</li></ul><h3>Local Tunneling</h3><ul><li><strong><a href="http://ngrok.com">ngrok</a></strong> -&nbsp;Introspected tunnels to localhost (Free + Donations)</li><li><strong><a href="https://www.runscope.com/docs/passageway">Runscope Passageway</a></strong>&nbsp;- A version of ngrok tightly integrated with other Runscope tools. (Free + Paid)</li><li>For the rest, <a href="http://john-sheehan.com/blog/a-survey-of-the-localhost-proxying-landscape">see: A Survey of the Localhost Proxying Landscape</a>.</li></ul><h3>API Monitoring</h3><ul><li><strong><a href="https://www.runscope.com/docs/radar">Runscope Radar</a></strong>&nbsp;- Global API monitoring and testing with flexible assertions, chained requests and OAuth support. Integrates with PagerDuty, New Relic, HipChat, Slack, Keen IO and more. (Free + Paid)</li><li><strong><a href="http://apimetrics.io/">APImetrics</a></strong>&nbsp;-&nbsp;Real-time API tests &amp; performance analysis. (Free + Paid)</li></ul><h3>Response Mocking</h3><ul><li><strong><a href="http://jsonstub.com/">JsonStub</a></strong> -&nbsp;Fake the backend while you develop the front end. (Free, Beta)</li><li><strong><a href="http://www.mockable.io/">Mockable</a></strong> -&nbsp;Create REST and SOAP services which mimic your external providers. (Free, Preview)</li><li><strong><a href="http://www.mocky.io/">mocky.io</a></strong> -&nbsp;Mock your HTTP responses to test your REST API. (Free)</li><li><strong><a href="http://httpbin.org/">httpbin.org</a></strong> -&nbsp;HTTP responses for common scenarios like status codes, delays, streaming, etc. (Free)</li><li><strong><a href="http://pathod.net/">pathod</a></strong> -&nbsp;A pathological web daemon. (Free)</li></ul><h3>JSON Utilities</h3><ul><li><strong><a href="http://jsonformatter.curiousconcept.com/">JSON formatter and validator</a></strong>&nbsp;- Paste in raw JSON, get a formatted, validated version back. (Free + Donations)</li><li><strong><a href="http://jsonformat.com/">JSON format</a></strong>&nbsp;- Paste or load JSON from a URL to format it. (Free)</li><li><strong><a href="http://jsonschemalint.com/">JSON Schema Lint</a></strong>&nbsp;-&nbsp;JSON schema validator to assist you in the writing and testing of JSON Schemas that conform with the Draft 03 specification. (Free)</li><li><strong><a href="http://www.json-generator.com/">JSON Generator</a></strong> - Generate sample JSON data with a comprehensive templating system. (Free)</li><li><strong><a href="http://www.jsoneditoronline.org/">JSON editor online</a></strong> - Edit JSON via a GUI. (Free)</li></ul><h3>OAuth Utilities</h3><ul><li><strong><a href="https://foauth.org/">foauth.org</a></strong> - Simplifies access to your data for services that use OAuth. (Free)</li><li><strong><a href="https://oauth.io/">OAuth.io</a></strong> -&nbsp;The fastest way to integrate OAuth (Free + Paid)</li><li><strong><a href="https://www.runscope.com/oauth_tool">Runscope OAuth 2 Token Generator</a></strong> - Generate OAuth 2 access tokens without having to set up a server. (Free)</li><li><strong><a href="https://www.runscope.com/oauth1_tool">Runscope OAuth 1.0a Token Generator</a></strong>&nbsp;- Generate OAuth 1.0a access tokens without having to set up a server. (Free)</li></ul><h3>API Directories</h3><ul><li><strong><a href="https://www.mashape.com/explore">Mashape</a></strong></li><li><strong><a href="http://apis.io/">APIs.io</a></strong></li><li><strong><a href="http://www.programmableweb.com/apis/directory">ProgrammableWeb</a></strong></li></ul><h3>API Documentation</h3><ul><li><strong><a href="http://apiary.io/">Apiary</a></strong> -&nbsp;Collaborative design, instant API mock, generated documentation, integrated code samples, debugging and automated testing. (Free + Paid)</li><li><strong><a href="http://apiblueprint.org/">API Blueprint</a></strong> - API documentation format used by Apiary and other tools. (Free)</li><li><strong><a href="http://raml.org/">RAML</a></strong> -&nbsp;RESTful API Modeling Language. (Free)</li><li><strong><a href="https://helloreverb.com/developers/swagger">Swagger</a></strong> -&nbsp;Specification and complete framework implementation for describing, producing, consuming, and visualizing RESTful web services. (Free)</li><li><strong><a href="http://www.mashery.com/product/io-docs">I/O Docs</a></strong> -&nbsp;Fast, powerful API documentation &amp; test calls. (Free)</li><li><strong><a href="https://www.embedcurl.com/">Embedcurl.com</a></strong> - Embeddable curl commands for your web site, blog or API documentation. (Free)</li></ul><h3>API Testing</h3><ul><li><strong><a href="https://www.runscope.com/docs/radar">Runscope Radar</a></strong> - HTTP/RESTful API testing in the cloud. Run your tests on every commit, build or deploy with email and webhook notifications for failures. (Free + Paid)</li><li><strong><a href="http://www.soapui.org/">SoapUI</a></strong> -&nbsp;SoapUI is a free and open source cross-platform Functional Testing solution. (Free + Paid)</li><li><strong><a href="http://stoplight.io/">StopLight</a></strong> - A powerful HTTP testing tool. (Free, Beta)</li><li><strong><a href="http://pathod.net/docs/pathoc">pathoc</a></strong>
400 - A perverse HTTP client. (Free)</li></ul><h3>Cloud-based Debugging Proxies</h3><ul><li><strong><a href="https://www.runscope.com/docs/debugging">Runscope Traffic Inspector</a></strong> - Log and inspect HTTP API calls from any language or framework to any API. Share, search, retry, compare requests and more. (Free + Paid)</li><li><strong><a href="https://www.apitools.com/">API Tools</a></strong> -&nbsp;Track, transform and analyze the traffic between your app and the APIs you use. (Free)</li></ul><h3>Desktop Debugging Proxies</h3><ul><li><strong><a href="http://www.charlesproxy.com/">Charles</a></strong> -&nbsp;Charles is an HTTP proxy / HTTP monitor / Reverse Proxy that enables a developer to view all of the HTTP and SSL / HTTPS traffic between their machine and the Internet. Supports OS X, Linux and Windows. (Paid)</li><li><strong><a href="http://www.telerik.com/fiddler">Fiddler</a></strong> -&nbsp;The free web debugging proxy for any browser, system or platform. (Free)</li><li><strong><a href="http://mitmproxy.org/">mitmproxy</a></strong> -&nbsp;Intercept, modify, replay and save HTTP/S traffic. (Free)</li><li><strong><a href="http://portswigger.net/burp/">Burp Suite</a></strong> - Integrated platform for performing security testing of web applications. (Paid)</li><li><strong><a href="http://www.tuffcode.com/">HTTP Scoop</a></strong> -&nbsp;The HTTP sniffer for Mac OS X. (Paid)</li></ul><h3>API Gateway (Self-Hosted)</h3><ul><li><strong><a href="http://tyk.io/">Tyk</a></strong> -&nbsp;An open source, lightweight, fast and scalable API Gateway. (Free + Paid)</li><li><strong><a href="http://apiaxle.com/">ApiAxle</a></strong> -&nbsp;A proxy that sits on your network, in front of your API(s) and manages things that you shouldn't have to, like rate limiting, authentication and analytics. (Free)</li><li><strong><a href="https://support.3scale.net/get-started/quickstarts/hello-world-nginx">3scale</a></strong>&nbsp;- "3scale provides a hybrid (API traffic management on-premise, API administration, traffic reports and developer portal cloud based) full featured API Management solution that is highly scalable, secure and flexible to match the most demanding requirements." (Free + Paid)</li></ul><h3>Load Testing</h3><ul><li><strong><a href="https://loader.io/">Loader.io</a></strong> - Stress test your web apps/APIs with thousands of concurrent connections. (Free + Paid)</li><li><strong><a href="https://www.blitz.io/">Blitz.io</a></strong> -&nbsp;Performance testing for websites, web apps and REST APIs. (Paid)</li><li><strong><a href="http://blazemeter.com/">BlazeMeter</a></strong> - JMeter load testing.&nbsp;Test the performance of any mobile app, website or API. (Free + Paid)</li><li><strong><a href="http://www.loadui.org/">LoadUI</a></strong> -&nbsp;API load testing solution. (Paid)</li></ul><h3>Command Line Tools</h3><ul><li><strong><a href="https://github.com/jakubroztocil/httpie">HTTPie</a></strong> -&nbsp;HTTPie is a command line HTTP client, a user-friendly cURL replacement. (Free)</li><li><strong><a href="http://stedolan.github.io/jq/">jq</a></strong> -&nbsp;Lightweight and flexible command-line JSON processor. (Free)</li></ul><h3>GUI HTTP Clients</h3><ul><li><strong><a href="http://www.hurl.it/">Hurl.it</a></strong> - Make HTTP requests. (Free)</li><li><strong><a href="https://www.getpostman.com/">Postman for Chrome</a></strong>&nbsp;- There are many Chrome apps for making HTTP requests, this one is the best. (Free + Paid)</li><li><strong><a href="http://luckymarmot.com/paw">Paw 2</a></strong>
400 - OS X HTTP client. (Paid)</li><li><strong><a href="http://echoapp.net/">Echo</a></strong> - Another OS X HTTP client. (Paid)</li></ul><h2>Did I miss something?</h2><p>I almost certainly did. Let me know in the comments!</p>
401
402
403</div></div></div></div></div></div>
404    
405  
406
407
408  <!--POST FOOTER-->
409
410  <footer>
411    <div class="meta">
412
413      
414
415      
416
417      <div class="second meta-row">
418        
419        
420          <span class="comments">
421            
422              <a href="/blog/ultimate-api-webhook-backend-service-debugging-testing-monitoring-and-discovery-tools-list#comments-53fe16b0e4b093defe90ce21">
423                
424                  4 Comments
425                
426              </a>
427            
428          </span>
429        
430        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/53fe16b0e4b093defe90ce21/1458683332668/" data-record-type="1" data-full-url="/blog/ultimate-api-webhook-backend-service-debugging-testing-monitoring-and-discovery-tools-list" data-title="60+ Tools and Services for API and Webhook Logging, Debugging, Testing, Monitoring, Documentation and Discovery"></span>
431      </div>
432
433    </div>
434  </footer>
435
436
437  </article>
438
439  <div class="post-divider"></div>
440
441
442<article class="hentry author-john-sheehan post-type-text article-index-5" id="article-528947f0e4b0020f1bc8bc3c" data-item-id="528947f0e4b0020f1bc8bc3c">
443
444  <!--SPECIAL CONTENT-->
445
446  
447
448
449  <!--POST HEADER-->
450
451  <header>
452    <h1 class="entry-title">
453      
454        <a href="/blog/everything-is-a-remix-making-the-best-use-of-existing-conventions-to-build-runscope" data-content-field="title">Everything is a remix; making the best use of conventions to build Runscope.</a>
455      
456    </h1>
457    <div class="meta">
458      <span class="date"><time class="published" datetime="2013-11-18">November 18, 2013</time></span>
459    </div>
460  </header>
461
462  <!--POST BODY-->
463
464  
465    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-528947f0e4b0020f1bc8bc3c"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block image-block sqs-block-image sqs-col-6 span-6 float float-right" data-block-type="5" id="block-64d311782646962c937f"><div class="sqs-block-content">
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480 
481
482  
483  
484    <div
485        class="
486          image-block-outer-wrapper
487          layout-caption-hidden
488          design-layout-inline
489          
490          
491          
492        "
493        data-test="image-block-inline-outer-wrapper"
494    >
495
496      
497
498      
499        <figure
500            class="
501              sqs-block-image-figure
502              intrinsic
503            "
504            style="max-width:450px;"
505        >
506          
507        
508        
509
510        
511          
512            
513          <div
514              
515              
516              class="image-block-wrapper"
517              data-animation-role="image"
518              
519  data-animation-override
520
521          >
522            <div class="sqs-image-shape-container-element
523              
524          
525        
526              
527            " style="
528                position: relative;
529                
530                  padding-bottom:104%;
531                
532                overflow: hidden;
533              "
534              >
535              <noscript><img src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1384735522963-05VSDWJY0Z8QJQUJXTJT/dont-make-me-think-cover.jpg" alt="dont-make-me-think-cover.jpg" /></noscript><img class="thumb-image" data-src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1384735522963-05VSDWJY0Z8QJQUJXTJT/dont-make-me-think-cover.jpg" data-image="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1384735522963-05VSDWJY0Z8QJQUJXTJT/dont-make-me-think-cover.jpg" data-image-dimensions="450x468" data-image-focal-point="0.5,0.5" alt="dont-make-me-think-cover.jpg" data-load="false" data-image-id="52896322e4b09b1867fcd2e8" data-type="image" />
536            </div>
537          </div>
538        
539          
540        
541
542        
543      
544        </figure>
545      
546
547    </div>
548  
549
550
551
552</div></div><div class="sqs-block markdown-block sqs-block-markdown" data-block-type="44" id="block-a4c982c3432ba4261997"><div class="sqs-block-content"><p>One of the most influential books of my software career is Steve Krug's <em><a href="http://www.sensible.com/dmmt.html">Don't Make Me Think</a></em>. While the book is a little dated now, it contains a plethora of software design gems. <strong>The one that stuck with me the most over the years is "Conventions are your friends"</strong> in Chapter 3.</p>
553
554<p>Short of copying and pasting the whole section, here are my three favorite excerpts, starting with how an idea becomes a convention:</p>
555
556<blockquote>
557  <p>All conventions start life as somebody’s bright idea. If the idea works well enough, other sites imitate it and eventually enough people have seen it in enough places that it needs no explanation.</p>
558</blockquote>
559
560<p>Why conventions are useful (emphasis mine):</p>
561
562<blockquote>
563  <p>As a rule, conventions only become conventions if they work. Well-applied conventions make it easier for users to go from site to site without expending a lot of effort figuring out how things work. (...) <strong>There’s a reassuring sense of familiarity</strong>...</p>
564</blockquote>
565
566<p>Krug's ultimate recommendation:</p>
567
568<blockquote>
569  <p>Innovate when you know you have a better idea (and everyone you show it to says “Wow!”), but take advantage of conventions when you don’t.</p>
570</blockquote>
571
572<h2 id="reducereuserecycle">Reduce, Reuse, Recycle</h2>
573
574<p>About a year ago I started on the initial product design that would become Runscope. Knowing we were building something completely new I wanted to introduce as few new concepts as possible. With Krug's voice in my head I was determined to make the best use of existing conventions.</p>
575
576<p>I thought it would be fun to look back at the concepts we borrowed from other services with the benefit of hindsight. Which ones worked out? Which do we regret? Let's find out.</p>
577
578<h3 id="buckets">Buckets</h3>
579
580<p>Buckets are the term we use for organizing your requests by project, app, customer or whatever else works for you. The name was borrowed from S3 but my intial idea for how they would work was more like Gmail's filters and labels. Using a well-known name from another developer tool with the behavior from another tool ended up being pretty confusing. Some early external feedback drove this point home and in the end buckets ended up much closer to their S3 brethren. <strong>Verdict: right decision after an adjustment</strong>.</p>
581
582<h3 id="stars">Stars</h3>
583
584<p>In a fast moving stream of API calls, we were looking for a way to single out requests to save and easily reference later. Gmail's stars seemed like a good model for this. That ended up to not be the case. It forced people to use buckets for lighter-weight organization and those weren't a good fit for a variety of reasons. We needed a middle ground: a simple organization method within a bucket. <strong>Verdict: Not a useful convention for us.</strong></p>
585
586<h3 id="collections">Collections</h3>
587
588<p>We replaced Stars with Collections. They're conceptually similar to Gmail's labels: lightweight, user-defined and optionally one-to-many. With starred requests you had to attribute your own meaning to what starring meant. For collections, you define the meaning in the name you give them. It's much more flexible. <strong>Verdict: Right decision.</strong></p>
589
590<h3 id="sharinglinks">Sharing Links</h3>
591
592<p>In need of a way to share API calls across account boundaries (e.g. to send to an API's support team) I immediately thought of Dropbox's shareable links. We implemented it just like Dropbox, with an explicit click to make a request public and create a public, shareable URL. Public links can be revoked at any time. Revoking and resharing creates a new, unique URL.</p>
593
594<p>A funny thing happened. When asking people to share requests with us, people would click the link to go to the share preview page and then send us the URL for that page, even after clicking the 'Create Share Link' button and being presented with the public URL. Even making the button and resulting URL much more prominent didn't fix it. It took a little bit of <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history"><code>history.replaceState()</code></a> cleverness to mitigate the confusion.</p>
595
596<p>If I could go back, I'd simplify the feature. Every request would have a single non-guessable URL with a simple public/private visibility toggle (like Sentry). We may still do this, though revokability is an issue. <strong>Verdict: Right idea, but a little over-engineered.</strong></p>
597
598<h3 id="teamsorganizations">Teams/Organizations</h3>
599
600<p>The first version of our identity database had tables <code>Accounts</code> and <code>Users</code> with every user belonging to a single account. <a href="https://twitter.com/FrankRStratton">Frank</a> wisely deleted that as soon as he saw it. People very rarely have a single organizational association. We ended up using the GitHub model of users and organizations (we call them Teams). This has given us and our customers a lot of flexibility. <strong>Verdict: one of the best early decisions...thanks Frank!</strong></p>
601
602<h2 id="manymore">Many More</h2>
603
604<p>These examples are just from our initial Traffic Inspector product. In <a href="https://www.runscope.com/t/johnblog?next=docs/radar">Runscope Radar</a> (our new product for automated testing) we've also re-used concepts like integration testing assertions and variables with a Mustache-like template syntax.</p>
605
606<p>Next time you're designing a new feature, listen to your inner Steve Krug:</p>
607
608<blockquote>
609  <p>Sometimes time spent reinventing the wheel results in a revolutionary new rolling device. But sometimes it just amounts to time spent reinventing the wheel.</p>
610</blockquote>
611</div></div></div></div></div></div>
612    
613  
614
615
616  <!--POST FOOTER-->
617
618  <footer>
619    <div class="meta">
620
621      
622
623      
624
625      <div class="second meta-row">
626        
627        
628        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/528947f0e4b0020f1bc8bc3c/1384735843908/" data-record-type="1" data-full-url="/blog/everything-is-a-remix-making-the-best-use-of-existing-conventions-to-build-runscope" data-title="Everything is a remix; making the best use of conventions to build Runscope."></span>
629      </div>
630
631    </div>
632  </footer>
633
634
635  </article>
636
637  <div class="post-divider"></div>
638
639
640<article class="hentry author-john-sheehan post-type-text article-index-6" id="article-521190b7e4b0775e185c57f3" data-item-id="521190b7e4b0775e185c57f3">
641
642  <!--SPECIAL CONTENT-->
643
644  
645
646
647  <!--POST HEADER-->
648
649  <header>
650    <h1 class="entry-title">
651      
652        <a href="/blog/how-runscope-raised-a-1-1m-seed-round-without" data-content-field="title">How Runscope raised a $1.1M seed round without customers, revenue or even a product.</a>
653      
654    </h1>
655    <div class="meta">
656      <span class="date"><time class="published" datetime="2013-08-16">August 16, 2013</time></span>
657    </div>
658  </header>
659
660  <!--POST BODY-->
661
662  
663    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1400468699788" id="item-521190b7e4b0775e185c57f3"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b7e4b0775e185c57f4"><div class="sqs-block-content">
664
665<p>I&#8217;ve been seeing a lot of posts lately on how to raise money from venture capitalists for your startup. I used to gobble that stuff up, reading any and every post I could to try to glean any insight I could into the process. Now that I&#8217;ve been through the process and have the benefit of hindsight I&#8217;ve concluded there&#8217;s no universally-applicable advice other than this: your mileage may vary.</p>
666
667<p>Fundraising is a crazy experience, and every founder who&#8217;s tried will love to tell you just how crazy it was for them. Your story always feels like the worst possible case until you hear someone else&#8217;s. For instance, another founder I knew was raising around the same time we were. They had a product, revenue and had just graduated from an accelerator. I felt like we had no chance compared to where they were at. They didn&#8217;t get funded and the company is gone. We did, and we&#8217;re here.</p>
668
669<p>I&#8217;ve been asked a lot, &#8220;How did you pull it off?&#8221; We had three things working for us: the right people, a ripe market and a good &#8220;story.&#8221; My approach to pitching was to hone in on those three things and ignore everything else.</p>
670
671<h3>The Right People</h3>
672
673<p>When I left Twilio, I really wanted to get into consumer web stuff. IFTTT was the perfect hybrid between dev tools and consumer services. Except I repeatedly found myself drawn back to building dev tools. My co-founder Frank is the same way. Everywhere we go, we build tools because it&#8217;s what we love to do.</p>
674
675<p>Between the two cofounders, we also had the right talent mix. My background as a developer, product manager and evangelist and Frank as a Lead Engineer on a popular API. We had the skills and track record. Selling the team was always the easiest part of pitching.</p>
676
677<h3>A Ripe Market</h3>
678
679<p>APIs are blowing up. App developers (especially mobile) are building and relying on more APIs (even if they don&#8217;t call them that) than ever. The trend is clear. Existing API tools are all focused on API providers. App developers need tools too.</p>
680
681<p>The most common question I got was &#8220;How big a market is it?&#8221; How many apps can you imagine <em>not</em> talking to a remote web service in the future? That&#8217;s how big it is. This was also easy to pitch.</p>
682
683<h3>A Good Story</h3>
684
685<p>Investors hear from good teams, with good ideas in good markets all the time. That was the minimum bar for getting in the door (being relatively well-connected also accelerated the process). But I think what made the biggest difference was the story we told about getting from where we are now to becoming a huge business.</p>
686
687<p>I tried to paint as vivid a picture as possible. Like any good story it had a beginning, middle and end.  I explained how product development and marketing would progress and dovetail with each other over time. What the target audience was for each phase. How each phase set the stage for the next one. What we learned from working at a company that went through the process already. After the first few meetings I proactively addressed concerns before they were asked.</p>
688
689<p>Knowing our story inside and out gave me a lot of confidence. The more people I told, the more confident I got that we were on to something. Paul Graham covers this in &#8216;<a href="http://paulgraham.com/convince.html">How to Convince Investors</a>&#8217;:</p>
690
691<blockquote>
692  <p>Investors are not always that good at judging technology, but they&#8217;re good at judging confidence. If you try to act like something you&#8217;re not, you&#8217;ll just end up in an uncanny valley. You&#8217;ll depart from sincere, but never arrive at convincing.</p>
693</blockquote>
694
695<hr><p>Raising money was not fun. It was stressful and time-consuming. I feel incredibly fortunate to have had it work out. We ended up with great investors and never felt like we had to &#8220;sell out.&#8221;</p>
696
697<p>It&#8217;s still early for Runscope. We are finding our way and we&#8217;re a long way from successful. So far I&#8217;m happy with how it&#8217;s going. We&#8217;re on track to meet our goals, we have a great team (what I&#8217;m the most proud of) and we&#8217;re having a lot of fun.</p>
698
699
700</div></div></div></div></div></div>
701    
702  
703
704
705  <!--POST FOOTER-->
706
707  <footer>
708    <div class="meta">
709
710      
711
712      
713
714      <div class="second meta-row">
715        
716        
717          <span class="comments">
718            
719              <a href="/blog/how-runscope-raised-a-1-1m-seed-round-without#comments-521190b7e4b0775e185c57f3">
720                
721                  Comment
722                
723              </a>
724            
725          </span>
726        
727        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b7e4b0775e185c57f3/1376691640000/" data-record-type="1" data-full-url="/blog/how-runscope-raised-a-1-1m-seed-round-without" data-title="How Runscope raised a $1.1M seed round without customers, revenue or even a product."></span>
728      </div>
729
730    </div>
731  </footer>
732
733
734  </article>
735
736  <div class="post-divider"></div>
737
738
739<article class="hentry author-john-sheehan post-type-text article-index-7" id="article-521190b7e4b0775e185c57fd" data-item-id="521190b7e4b0775e185c57fd">
740
741  <!--SPECIAL CONTENT-->
742
743  
744
745
746  <!--POST HEADER-->
747
748  <header>
749    <h1 class="entry-title">
750      
751        <a href="/blog/a-survey-of-the-localhost-proxying-landscape" data-content-field="title">A Survey of the Localhost Proxying Landscape</a>
752      
753    </h1>
754    <div class="meta">
755      <span class="date"><time class="published" datetime="2013-08-05">August  5, 2013</time></span>
756    </div>
757  </header>
758
759  <!--POST BODY-->
760
761  
762    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" data-updated-on="1400442997950" id="item-521190b7e4b0775e185c57fd"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block code-block sqs-block-code" data-block-type="23" id="block-733b1fc9ea4a54e63679"><div class="sqs-block-content"><img src="http://media.tumblr.com/469e5c536db6815b8dc2a09635b53053/tumblr_inline_mr2wxdvL0D1qz4rgp.jpg" title="" alt=""/></div></div><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-4a852e950e3c15b98e11"><div class="sqs-block-content">
763
764<p>In late 2009, soon after coining the term ‘webhooks’ and starting to evangelize them to the world, <a href="http://progrium.com/">Jeff Lindsay</a> ran into a problem.</p><blockquote><p>I had another idea while thinking about webhooks. It would be great if I could expose a local web server to the Internet with a friendly URL. It should just be a simple command. There would have to be a server, but there could just be a public server that you didn’t even have to think about.</p></blockquote><p>Jeff’s idea grew into <a href="http://progrium.com/localtunnel">localtunnel</a>, a friendly wrapper around an SSH reverse tunnel that makes your localhost available via a public URL. The first time I used it, it felt like magic. It completely changed the nature of working with webhooks. I was, well, hooked.</p><p>What was novel at the time has grown into a little bit of a cottage industry amongst API tool makers. Many similar services have cropped up, specializing in different versions of the same problem. Here’s an overview of all the services I know of.</p><h3><a href="http://progrium.com/localtunnel/">localtunnel</a></h3><p>The original. The initial SSH-based version with the Ruby client eventually <a href="http://progrium.com/blog/2013/01/01/where-did-localtunnel-come-from/">ran into some issues</a>. Ruby and SSH are also a bit precocious on Windows. <a href="http://progrium.com/blog/2012/12/25/localtunnel-v2-available-in-beta/">Jeff later released a beta of a version 2 with a Python client and a new wire format</a>. Localtunnel has been discontinued in favor ngrok (see below).</p><h3>localtunnel.me</h3><p>A Node.js copy of the original localtunnel that <a href="https://news.ycombinator.com/item?id=7585056">couldn't come up with an original name</a>.</p><h3><a href="https://forwardhq.com/">Forward</a> (formerly Showoff)</h3><p>Forward was another early entrant, focusing more on allowing developers to show off web sites they were working on from their local machine. In early 2011 they rebranded from <a href="https://forwardhq.com/showoff-transition">Showoff to Forward</a>. They offer <a href="https://forwardhq.com/plans">a few different pricing plans</a> for various needs.</p><h3><a href="http://proxylocal.com/">ProxyLocal</a></h3><p>Another Ruby based solution, ProxyLocal was started in late 2010 and was last updated a year ago, though the web service seems to be operating still. It distinguishes itself from localtunnel by letting you choose the subdomain for your public URL. The service is free.</p><h3><a href="https://pagekite.net/">PageKite</a></h3><p>PageKite is another commercial service started around the same time independently of the others (<a href="https://news.ycombinator.com/item?id=6083000">this comment</a> suggests localtunnel predated it by only a few months). PageKite is Python-based, <a href="https://pagekite.net/wiki/OpenSource/">open source</a>
764, offers end-to-end encryption and can tunnel protocols other than HTTP. <a href="http://pagekite.net/2011-04-20/PageKite_meets_Showoff">Here’s a post comparing it to Showoff</a>. <a href="https://pagekite.net/signup/">They offer subscriptions, pay-what-you-want and a free plan for OSS devs</a>.</p><h3><a href="http://www.ultrahook.com/">Ultrahook</a></h3><p>Ultrahook is a new entrant to the scene, focusing on webhook debugging. Created by <a href="https://twitter.com/veesahni">Vinay Sahni</a> from SupportFu, Ultrahook consists of a client distributed via Ruby gem. The service is free, but the source is not available. By signing up for a free account you’ll receive an API key that “gives you a exclusive namespace. All endpoints you create will be subdomains under your own namespace. This ensures that you can always reconnect to the same endpoints at some point in the future.” Ultrahook does not proxy responses back and only supports POST requests.</p><h3><a href="https://meetfinch.com/">Finch</a></h3><p>Another Node.js client/server, currently in beta as of May 2014. Paid plans will be offered when it officially launches. As it is in beta at the time of this update, the full feature set is unknown.<
764/p><h3><a href="http://www.vagrantup.com/blog/feature-preview-vagrant-1-5-share.html">Vagrant Share</a></h3><p>Vagrant Share is a solution for sharing web servers (or any other TCP/UDP connection like SSH)&nbsp;running inside your Vagrant environments. Uses TLS end-to-end. Requires a Vagrant Cloud account.</p><h3><a href="https://ngrok.com/">ngrok</a></h3><p>The current king of localhost proxying is <a href="https://ngrok.com/">ngrok</a> from Alan Shreve (formerly of Twilio). ngrok is written in Go (both client and server) and has, by far, the easiest client installation options with single-file executables for Windows, OS X and Linux. No more fighting with Ruby gems Windows users! In addition, ngrok adds an introspection layer so you can see the traffic that was passed back and forth over the tunnel and even retry requests. ngrok supports SSL, password-protected tunnels, reserved subdomains and support for TCP/UDP tunneling. It’s free and the source is on GitHub.</p><h3><a href="https://www.runscope.com/docs/passageway">Runscope Passageway</a></h3><p>My company <a href="https://www.runscope.com/">Runscope</a> also offers a version of ngrok called <a href="https://www.runscope.com/docs/passageway">Passageway</a>. We’ve added tight integration with the Runscope API Traffic Inspector and some other enhancements to create a more seamless experience with our other products.</p><h2>My Recommendation</h2><p>If you’re just getting started, I recommend <a href="https://ngrok.com/">ngrok</a>. Client set up is the easiest and it offers the most features of any of the options and its completely free.</p><p><strong>Did I miss any? If so, let me know in the comments.</strong></p><p><em>Update 5/18/2014: Added Finch, localtunnel.me, Vagrant Share and updated details about Runscope Passageway using ngrok instead of localtunnel.</em></p><p><em>Photo courtesy of <a href="http://www.flickr.com/photos/carlsonarts/">Tina Carlson</a></em></p>
765
766
767</div></div></div></div></div></div>
768    
769  
770
771
772  <!--POST FOOTER-->
773
774  <footer>
775    <div class="meta">
776
777      
778
779      
780
781      <div class="second meta-row">
782        
783        
784        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b7e4b0775e185c57fd/1375741718000/" data-record-type="1" data-full-url="/blog/a-survey-of-the-localhost-proxying-landscape" data-title="A Survey of the Localhost Proxying Landscape"></span>
785      </div>
786
787    </div>
788  </footer>
789
790
791  </article>
792
793  <div class="post-divider"></div>
794
795
796<article class="hentry author-john-sheehan post-type-text article-index-8" id="article-521190b7e4b0775e185c5800" data-item-id="521190b7e4b0775e185c5800">
797
798  <!--SPECIAL CONTENT-->
799
800  
801
802
803  <!--POST HEADER-->
804
805  <header>
806    <h1 class="entry-title">
807      
808        <a href="http://blog.epanastasi.com/post/56919440376/oauth-is-awesome-oauth-is-horrible">I, Revolution: OAuth is awesome, OAuth is horrible. <span>&rarr;</span></a>
809      
810    </h1>
811    <div class="meta">
812      <span class="date"><time class="published" datetime="2013-07-31">July 31, 2013</time></span>
813    </div>
814  </header>
815
816  <!--POST BODY-->
817
818  
819    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b7e4b0775e185c5800"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b7e4b0775e185c5801"><div class="sqs-block-content">
820
821<p><a href="http://blog.epanastasi.com/post/56919440376/oauth-is-awesome-oauth-is-horrible" class="tumblr_blog">From my co-founder Frank Stratton</a>:</p>
822
823<blockquote>
824<p><img src="http://media.tumblr.com/7898f8f22a32d44ff49f5e57b0b44e8b/tumblr_inline_mq5gzjFA0i1qz4rgp.jpg" alt=""/></p> <p>Photo: <a href="http://www.flickr.com/photos/38748740@N05/5480153734/">Micro Ecosystem by Pierre Pocs</a></p> <h1>Introduction</h1> <p>After writing the <a href="https://www.runscope.com/docs/api">Runscope API</a>, and several OAuth API clients to other services. I’ve finally had some time to figure out how I feel about OAuth 2.0… OAuth is awesome, OAuth is horrible.</p> <p>My co-founder John has already <a href="http://john-sheehan.com/post/41653656681/the-good-and-the-bad-of-oauth-2-0-authorization">written a lot&#8230;</a></p></blockquote>
825
826
827</div></div></div></div></div></div>
828    
829  
830
831
832  <!--POST FOOTER-->
833
834  <footer>
835    <div class="meta">
836
837      
838
839      
840
841      <div class="second meta-row">
842        
843        
844          <span class="comments">
845            
846              <a href="/blog/i-revolution-oauth-is-awesome-oauth-is-horrible#comments-521190b7e4b0775e185c5800">
847                
848                  Comment
849                
850              </a>
851            
852          </span>
853        
854        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882954463-GTRU7CL3HHLTI75DP88D" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b7e4b0775e185c5800/1375293992000/" data-record-type="1" data-full-url="/blog/i-revolution-oauth-is-awesome-oauth-is-horrible" data-title="I, Revolution: OAuth is awesome, OAuth is horrible."></span>
855      </div>
856
857    </div>
858  </footer>
859
860
861  </article>
862
863  <div class="post-divider"></div>
864
865
866<article class="hentry author-john-sheehan post-type-text article-index-9" id="article-521190b8e4b0775e185c5808" data-item-id="521190b8e4b0775e185c5808">
867
868  <!--SPECIAL CONTENT-->
869
870  
871
872
873  <!--POST HEADER-->
874
875  <header>
876    <h1 class="entry-title">
877      
878        <a href="https://www.apichangelog.com/">API Changelog: API Documentation Change Notifications <span>&rarr;</span></a>
879      
880    </h1>
881    <div class="meta">
882      <span class="date"><time class="published" datetime="2013-07-14">July 14, 2013</time></span>
883    </div>
884  </header>
885
886  <!--POST BODY-->
887
888  
889    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5808"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5809"><div class="sqs-block-content">
890
891<p>My company Runscope just launched this free service for tracking and sending notifications for changes to the docs for 23 popular APIs including Facebook, Twitter, Stripe, Twilio, Dropbox and more. Follow the APIs you depend on and receive a daily email summary if anything changes.</p>
892
893
894</div></div></div></div></div></div>
895    
896  
897
898
899  <!--POST FOOTER-->
900
901  <footer>
902    <div class="meta">
903
904      
905
906      
907
908      <div class="second meta-row">
909        
910        
911          <span class="comments">
912            
913              <a href="/blog/api-changelog-api-documentation-change-notifications#comments-521190b8e4b0775e185c5808">
914                
915                  Comment
916                
917              </a>
918            
919          </span>
920        
921        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882959531-7Z0YHU9A3QRB8O9PEJRY" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5808/1373861440000/" data-record-type="1" data-full-url="/blog/api-changelog-api-documentation-change-notifications" data-title="API Changelog: API Documentation Change Notifications"></span>
922      </div>
923
924    </div>
925  </footer>
926
927
928  </article>
929
930  <div class="post-divider"></div>
931
932
933<article class="hentry author-john-sheehan post-type-text article-index-10" id="article-521190b8e4b0775e185c580b" data-item-id="521190b8e4b0775e185c580b">
934
935  <!--SPECIAL CONTENT-->
936
937  
938
939
940  <!--POST HEADER-->
941
942  <header>
943    <h1 class="entry-title">
944      
945        <a href="/blog/launched" data-content-field="title">Launched</a>
946      
947    </h1>
948    <div class="meta">
949      <span class="date"><time class="published" datetime="2013-05-22">May 22, 2013</time></span>
950    </div>
951  </header>
952
953  <!--POST BODY-->
954
955  
956    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c580b"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c580c"><div class="sqs-block-content">
957
958<p>Today we opened the doors on <a href="https://www.runscope.com">Runscope</a>, our new set of tools for debugging, testing and inspecting your API integrations. In addition to that, we announced that <a href="(http://techcrunch.com/2013/05/22/runscope-lands-1-1m-from-true-ventures-and-andreessen-horowitz-for-tools-that-address-the-broken-api-plague/)">we&#8217;ve received a seed round investment</a> of $1.1M from True Ventures, Lerer Ventures, David Cohen, Andreessen Horowitz, Nat Friedman, Jon Dahl and Ullas Naik.</p>
959
960<p>While launching to the public is a lot of fun and the culmination of a lot of hard work, it&#8217;s just the starting line for the next stage of what we&#8217;re trying to accomplish. Even so, getting here required a lot of help and support from a great many people and I&#8217;d like to thank those that were instrumental in helping us get this far.</p>
961
962<p>First off, my wife Emily. When I told her I wanted to quit my job to start a company she didn&#8217;t even flinch. When fundraising hit rough patches she was unwaveringly supportive. Thank y
962ou honey.</p>
963
964<p>Next up, my co-founder Frank and the rest of the team that has joined us in the past few months: you&#8217;ve done amazing work in a short period of time and you&#8217;re a blast to work with. Honored to be working with you.</p>
965
966<p>To Nat Friedman, Jon Dahl, Ullas Naik, Adam D&#8217;Augelli and the True crew, David Cohen, Ari Newman, Max Stoller, Steve Schlafman, Chris Dixon, and Frank Chen: I couldn&#8217;t ask for a better set of investors. Thank you all for your support.</p>
967
968<p>And lastly to everyone else who helped with intros, reference calls, testing out the preview, advice, lawyering, finding office space, candidate referrals, etc: thanks for playing a small part in helping us get this far.</p>
969
970<p>Now, the hard part.</p>
971
972
973</div></div></div></div></div></div>
974    
975  
976
977
978  <!--POST FOOTER-->
979
980  <footer>
981    <div class="meta">
982
983      
984
985      
986
987      <div class="second meta-row">
988        
989        
990          <span class="comments">
991            
992              <a href="/blog/launched#comments-521190b8e4b0775e185c580b">
993                
994                  Comment
995                
996              </a>
997            
998          </span>
999        
1000        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c580b/1369258402000/" data-record-type="1" data-full-url="/blog/launched" data-title="Launched"></span>
1001      </div>
1002
1003    </div>
1004  </footer>
1005
1006
1007  </article>
1008
1009  <div class="post-divider"></div>
1010
1011
1012<article class="hentry author-john-sheehan post-type-text article-index-11" id="article-521190b8e4b0775e185c580e" data-item-id="521190b8e4b0775e185c580e">
1013
1014  <!--SPECIAL CONTENT-->
1015
1016  
1017
1018
1019  <!--POST HEADER-->
1020
1021  <header>
1022    <h1 class="entry-title">
1023      
1024        <a href="http://apidigest.com/posts/2013/5/12/api-digest-20">API Digest 2.0 <span>&rarr;</span></a>
1025      
1026    </h1>
1027    <div class="meta">
1028      <span class="date"><time class="published" datetime="2013-05-13">May 13, 2013</time></span>
1029    </div>
1030  </header>
1031
1032  <!--POST BODY-->
1033
1034  
1035    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c580e"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c580f"><div class="sqs-block-content">
1036
1037<p>Today I&#8217;m happy to release a brand new <a href="http://apidigest.com">API Diges</a>t. Previously the digest was email-only. Starting today all links will be available via apidigest.com and @APIDigest on <a href="http://twitter.com/apidigest">Twitter</a> and <a href="http://alpha.app.net/apidigest">App.net</a>. You can also subscribe to the <a href="http://apidigest.com/rss">RSS feed</a>. Lastly, be sure to check out the new &#8216;<a href="http://apidigest.com/events">Events</a>' list.</p>
1038
1039
1040</div></div></div></div></div></div>
1041    
1042  
1043
1044
1045  <!--POST FOOTER-->
1046
1047  <footer>
1048    <div class="meta">
1049
1050      
1051
1052      
1053
1054      <div class="second meta-row">
1055        
1056        
1057          <span class="comments">
1058            
1059              <a href="/blog/api-digest-2-0#comments-521190b8e4b0775e185c580e">
1060                
1061                  Comment
1062                
1063              </a>
1064            
1065          </span>
1066        
1067        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882956397-1LX065AQZHT8UCGJ5AET" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c580e/1368460848000/" data-record-type="1" data-full-url="/blog/api-digest-2-0" data-title="API Digest 2.0"></span>
1068      </div>
1069
1070    </div>
1071  </footer>
1072
1073
1074  </article>
1075
1076  <div class="post-divider"></div>
1077
1078
1079<article class="hentry tag-apis author-john-sheehan post-type-text article-index-12" id="article-521190b8e4b0775e185c5811" data-item-id="521190b8e4b0775e185c5811">
1080
1081  <!--SPECIAL CONTENT-->
1082
1083  
1084
1085
1086  <!--POST HEADER-->
1087
1088  <header>
1089    <h1 class="entry-title">
1090      
1091        <a href="/blog/designing-apis-for-humans" data-content-field="title">Designing APIs for Humans</a>
1092      
1093    </h1>
1094    <div class="meta">
1095      <span class="date"><time class="published" datetime="2013-04-25">April 25, 2013</time></span>
1096    </div>
1097  </header>
1098
1099  <!--POST BODY-->
1100
1101  
1102    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5811"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5812"><div class="sqs-block-content">
1103
1104<iframe src="http://player.vimeo.com/video/64659021?title=0&amp;byline=0&amp;portrait=0&amp;color=f3b940" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
1105
1106<p>Earlier this month I gave a talk at <a href="http://devslovebacon.com/">Devs Love Bacon</a> on an API design philosophy I picked up while working at <a href="http://ifttt.com">IFTTT</a> I&#8217;ve been calling &#8216;APIs for Humans&#8217;. Sadly, it&#8217;s not about this:</p>
1107
1108<blockquote class="twitter-tweet"><p>OH at @<a href="https://twitter.com/devslovebacon">devslovebacon</a> &#8220;I thought the &#8220;APIs for humans&#8221; talk was about controlling humans&#8221; <a href="https://twitter.com/search/%23devslovebacon">#devslovebacon</a></p>— Julian Cheal (@juliancheal) <a href="https://twitter.com/juliancheal/status/322685410335678464">April 12, 2013</a></blockquote>
1109
1110<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
1110<p>At IFTTT I identified three major areas for how non-developers end up consuming API data in significant numbers. In this talk I cover what those areas are and how you can tailor your API designs to encourage developers to build human-friendly integrations.</p>
1111
1112<p>Since I had extra time I threw in a few points on developer experience too. After all, developers are humans too.</p>
1113
1114
1115</div></div></div></div></div></div>
1116    
1117  
1118
1119
1120  <!--POST FOOTER-->
1121
1122  <footer>
1123    <div class="meta">
1124
1125      
1126
1127      
1128      <div class="first meta-row">
1129        
1130        <span class="tags"><span class="tags-title">Tags</span> <a href="/blog/tag/apis" rel="tag">apis</a></span>
1131      </div>
1132      
1133
1134      <div class="second meta-row">
1135        
1136        
1137          <span class="comments">
1138            
1139              <a href="/blog/designing-apis-for-humans#comments-521190b8e4b0775e185c5811">
1140                
1141                  Comment
1142                
1143              </a>
1144            
1145          </span>
1146        
1147        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5811/1366911843000/" data-record-type="1" data-full-url="/blog/designing-apis-for-humans" data-title="Designing APIs for Humans"></span>
1148      </div>
1149
1150    </div>
1151  </footer>
1152
1153
1154  </article>
1155
1156  <div class="post-divider"></div>
1157
1158
1159<article class="hentry author-john-sheehan post-type-text article-index-13" id="article-521190b8e4b0775e185c581e" data-item-id="521190b8e4b0775e185c581e">
1160
1161  <!--SPECIAL CONTENT-->
1162
1163  
1164
1165
1166  <!--POST HEADER-->
1167
1168  <header>
1169    <h1 class="entry-title">
1170      
1171        <a href="http://apiux.com/2013/03/21/authentication-dont-be-clever/">Authentication: Don’t be Clever <span>&rarr;</span></a>
1172      
1173    </h1>
1174    <div class="meta">
1175      <span class="date"><time class="published" datetime="2013-03-22">March 22, 2013</time></span>
1176    </div>
1177  </header>
1178
1179  <!--POST BODY-->
1180
1181  
1182    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c581e"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c581f"><div class="sqs-block-content">
1183
1184<p>My contribution to the new <a href="http://www.apiux.com">API UX</a> blog:</p>
1185
1186<blockquote>
1187  <p>By using standardized, common authentication schemes you can reduce the cognitive overhead for the developer consuming your API and avoid getting into unfamiliar, untested security situations. Authentication is the first thing any developer using your API will have to deal with and it’s those first few moments that are crucial to their success using your API to solve their problem. Take care to make the first impression a good one.</p>
1188</blockquote>
1189
1190
1191</div></div></div></div></div></div>
1192    
1193  
1194
1195
1196  <!--POST FOOTER-->
1197
1198  <footer>
1199    <div class="meta">
1200
1201      
1202
1203      
1204
1205      <div class="second meta-row">
1206        
1207        
1208          <span class="comments">
1209            
1210              <a href="/blog/authentication-dont-be-clever#comments-521190b8e4b0775e185c581e">
1211                
1212                  Comment
1213                
1214              </a>
1215            
1216          </span>
1217        
1218        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882955705-ER6TFKAHXM9YDM1MK7CZ" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c581e/1363975901000/" data-record-type="1" data-full-url="/blog/authentication-dont-be-clever" data-title="Authentication: Don’t be Clever"></span>
1219      </div>
1220
1221    </div>
1222  </footer>
1223
1224
1225  </article>
1226
1227  <div class="post-divider"></div>
1228
1229
1230<article class="hentry author-john-sheehan post-type-text article-index-14" id="article-521190b8e4b0775e185c5821" data-item-id="521190b8e4b0775e185c5821">
1231
1232  <!--SPECIAL CONTENT-->
1233
1234  
1235
1236
1237  <!--POST HEADER-->
1238
1239  <header>
1240    <h1 class="entry-title">
1241      
1242        <a href="/blog/the-good-and-the-bad-of-oauth-2-0-authorization" data-content-field="title">The Good and the Bad of OAuth 2.0 Authorization Implementations</a>
1243      
1244    </h1>
1245    <div class="meta">
1246      <span class="date"><time class="published" datetime="2013-01-27">January 27, 2013</time></span>
1247    </div>
1248  </header>
1249
1250  <!--POST BODY-->
1251
1252  
1253    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5821"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5822"><div class="sqs-block-content">
1254
1255<p>While testing out a new tool I&#8217;m working on that uses a variety of OAuth2 providers and thought I&#8217;d catalog some of the quirks I came across. This is just for the authorization flow, not for actually making requests once you&#8217;ve secured a token.</p>
1256
1257<p>Now that the <a href="http://tools.ietf.org/html/rfc6749">OAuth2 spec</a> is solidified we should start seeing less and less of these issues.</p>
1258
1259<h3>Google</h3>
1260
1261<p><strong>Good:</strong> The <a href="https://code.google.com/apis/console#access">APIs Console</a> is one of the best out there. My favorite feature: allowing you to specify multiple callback URLs for a single app. This makes testing different environments way easier because you don&#8217;t need to go back and constantly edit the callback URL value.</p>
1262
1263<p><strong>Good:</strong> The <a href="https://developers.google.com/oauthplayground/">OAuth 2.0 Playground</a> is <em>fantastic</em>. It will show you all the HTTP requests that are made for a standard auth flow. This makes it really easy to debug issues on your end by comparing the requests. I used it to diagnose the following problem.</p>
1264
1265<p><strong>Bad:</strong> When requesting an Access Token the request will fail if you include any parameters that it is not expecting. Google does not require a <code>state</code> or <code>type</code> parameter when getting the token like some other APIs do and will give you a 400 Bad Request with an <code>invalid_request</code> error if they are included.</p>
1266
1267<p><strong>Bad:</strong> The scopes options are not immediately obvious. There&#8217;s a huge list of services and you must enable them individually (good) in the &#8216;Services&#8217; section of your project in the APIs Console. This page though does not list the scopes value to use. The Playground does have what appears to be a complete list.</p>
1268
1269<h3>Facebook</h3>
1270
1271<p><strong>Bad:</strong> If you just want to use OAuth with the Graph API, you still need to enable &#8220;Website with Facebook Login&#8221; in order to set the Site URL. This is hidden by default and took me a little bit to find it. This setting restricts which domains they will redirect back to.</p>
1272
1273<p><strong>Good:</strong> The Site URL only requires a domain instead of a full URL which means you can change your callback URL path without breaking your app.</p>
1274
1275<h3>37signals</h3>
1276
1277<p><strong>Bad:</strong> When you create the app you select which services you want your app to have access to but during the auth flow only one of the services is displayed.</p>
1278
1279<p><strong>Bad:</strong> There&#8217;s no support for limiting access to read-only via scopes. The only option is full read/write for all of the apps selected.</p>
1280
1281<h3>Stripe</h3>
1282
1283<p><strong>Bad:</strong> Stripe does not use a <code>client_secret</code>. Most client libraries and OAuth examples use it so it may be confusing for experienced developers wondering where that value is.</p>
1284
1285<p><strong>Bad:</strong> This is not technically wrong, but it isn&#8217;t common. When exchanging the code for an access token you are required to send an <code>Authorization</code> header with a value of <code>Bearer</code> and your Stripe account secret key (either test or live). I&#8217;d rather they just tell you to use the secret key as the client_secret and not require the additional header.</p>
1286
1287<h3>Instagram</h3>
1288
1289<p><strong>Bad:</strong> The docs say that the <code>scope</code> parameter is optional but will give you an error (400 OAuthException - Invalid scope field(s)) if it isn&#8217;t specified. You should specify at least &#8216;basic&#8217;.</p>
1290
1291<h3>Box</h3>
1292
1293<p><strong>Bad:</strong> The redirect URL settings requires HTTPS which can be difficult if you&#8217;re trying to test locally (for instance my test app runs on http://localhost:5001 which is accepted every where else). Box has 
1293informed me this will be resolved soon.</p>
1294
1295<p><strong>Bad:</strong> Does not use scopes for read-only or read/write access (is configured with the application). Box has also told me they will be changing this once they have more than one scope.</p>
1296
1297<h3>Microsoft Live Connect</h3>
1298
1299<p><strong>Good:</strong> Permissions are set via an <a href="http://msdn.microsoft.com/en-us/library/live/hh243646.aspx">extensive and clear list of scopes</a>. Very nice.</p>
1300
1301<h3>Stack Exchange</h3>
1302
1303<p><strong>Good:</strong> Callback URL validation is set via domain only (similar to Facebook).</p>
1304
1305<h3>GitHub</h3>
1306
1307<p><strong>Bad:</strong> Scopes must be specified comma-separated, contrary to the OAuth2 spec. <a href="https://twitter.com/pengwynn/status/295656100018126848">This is on the roadmap to be fixed</a>.</p>
1308
1309<h3>App.net</h3>
1310
1311<p><strong>Good:</strong> The application manager allows you to generate a token for yourself with custom scopes without having to go through the flow. This is extremely helpful during development.</p>
1312
1313<h3>Others</h3>
1314
1315<p>Here are some others that I tried that I didn&#8217;t have any notable issues with: MailChimp, Foursquare, Wordpress.</p>
1316
1317<p>Here are the services I desperately wish would move from OAuth 1.0a to OAuth 2.0: Twitter, Dropbox, LinkedIn</p>
1318
1319<p>If you&#8217;ve come across a unique implementation quirk of your own, post it below in the comments.</p>
1320
1321<h3>Related Posts</h3>
1322
1323<ul><li><a href="http://john-sheehan.com/post/21850777760/the-api-developer-experience-baseline">The API Developer Experience Baseline</a></li>
1324<li><a href="http://john-sheehan.com/post/18688963163/dont-build-the-best-rest-api-build-the-best-http-api">Don&#8217;t Build the Best REST API, Build the Best HTTP API</a></li>
1325</ul>
1326
1327
1328</div></div></div></div></div></div>
1329    
1330  
1331
1332
1333  <!--POST FOOTER-->
1334
1335  <footer>
1336    <div class="meta">
1337
1338      
1339
1340      
1341
1342      <div class="second meta-row">
1343        
1344        
1345          <span class="comments">
1346            
1347              <a href="/blog/the-good-and-the-bad-of-oauth-2-0-authorization#comments-521190b8e4b0775e185c5821">
1348                
1349                  Comment
1350                
1351              </a>
1352            
1353          </span>
1354        
1355        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5821/1359331320000/" data-record-type="1" data-full-url="/blog/the-good-and-the-bad-of-oauth-2-0-authorization" data-title="The Good and the Bad of OAuth 2.0 Authorization Implementations"></span>
1356      </div>
1357
1358    </div>
1359  </footer>
1360
1361
1362  </article>
1363
1364  <div class="post-divider"></div>
1365
1366
1367<article class="hentry author-john-sheehan post-type-text article-index-15" id="article-521190b8e4b0775e185c5824" data-item-id="521190b8e4b0775e185c5824">
1368
1369  <!--SPECIAL CONTENT-->
1370
1371  
1372
1373
1374  <!--POST HEADER-->
1375
1376  <header>
1377    <h1 class="entry-title">
1378      
1379        <a href="/blog/age" data-content-field="title">Age</a>
1380      
1381    </h1>
1382    <div class="meta">
1383      <span class="date"><time class="published" datetime="2013-01-11">January 11, 2013</time></span>
1384    </div>
1385  </header>
1386
1387  <!--POST BODY-->
1388
1389  
1390    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5824"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5825"><div class="sqs-block-content">
1391
1392<p>This post is a little more personal and not at all technical. I realized I&#8217;ve been wanting to write about this for awhile.</p>
1393
1394<p>On the <a href="http://www.hanselminutes.com/353/coneryminutes-2-the-mid-life-crisis">latest episode of Hanselminutes</a> two of my favorite internet friends had a discussion on age as they are nearing their 40th and 45th birthdays. I happened to come up a couple times as a reference point for The Young&#8217;uns.</p>
1395
1396<p><img src="http://media.tumblr.com/0d18837024eaa29d1f684a24569d21aa/tumblr_inline_mgh9a4usxg1qcl1x1.jpg"/> Age has always been a sensitive issue for me. When I was 5 my mom homeschooled me and when she couldn&#8217;t do it anymore and it was time to go to public school I was effectively done with first grade so she bumped me ahead to second grade. The rest of my primary and secondary sc
1396hool years I trailed all my classmates in age by a year. I got my license my junior year, graduated at 17, etc. I played sports on teams consisting of all older players. I was always very determined to prove that my age didn&#8217;t matter.</p>
1397
1398<p>When I started running companies when I was 15 my age was an advantage. It got me attention and customers. When I started working real jobs at 19 it was also an advantage because people couldn&#8217;t believe how mature and experienced I was &#8220;for his age.&#8221; At about 25 when all my peers had experience too (with degrees to boot) it wasn&#8217;t as advantageous.</p>
1399
1400<p><img src="http://media.tumblr.com/c9b4d93a8e5835c85f6f62e9e41aae81/tumblr_inline_mgh945LRdV1qcl1x1.jpg" title="at my first real job"/></p>
1401
1402<p>Now I&#8217;m 31. In the SF tech scene I frequently feel old. My experience frequently gets deferred to (which often makes me slightly uncomfortable). Some of the younger engineers I&#8217;ve worked with lately have made me feel <em>really</em> old. They&#8217;re insanely smart but make me realize how much experience I actually have now (going on 16 years of doing computer stuff for money). 30 under 30 lists drive me crazy not because that&#8217;s my goal in life, but just because it&#8217;s impossible nonetheless. My wife consoles me by saying there&#8217;s plenty of time for 81 under 81.</p>
1403
1404<p>Back to the Hanselminutes episode. Rob talks about a recent dinner we had together where he was giving me some advice (that I appreciated) and my reaction. I (not surprisingly) reacted by giving him a look that said I have it all under control. Almost certainly I was overcompensating for my age insecurities. I rarely feel like I do have everything under control and I crave insight from people more experienced than me.</p>
1405
1406<p>At the same time, I do know some things now. More importantly I know what I don&#8217;t know. All of that experience has lead me to a position where I can <a href="http://john-sheehan.com/post/40122684922/runscope">be a founder of a startup</a>. I&#8217;m not doing this because I&#8217;m young and impetuous and want to ride the wave of the current &#8216;bubble.&#8217; I&#8217;m doing this because I know what it will take for me to be happy in my work and I&#8217;m not going to spend any more time not pursuing it. I&#8217;ve known that for a long time, but I&#8217;m at a point where my age is an asset in making this happen. So I&#8217;m going to.</p>
1407
1408
1409</div></div></div></div></div></div>
1410    
1411  
1412
1413
1414  <!--POST FOOTER-->
1415
1416  <footer>
1417    <div class="meta">
1418
1419      
1420
1421      
1422
1423      <div class="second meta-row">
1424        
1425        
1426          <span class="comments">
1427            
1428              <a href="/blog/age#comments-521190b8e4b0775e185c5824">
1429                
1430                  Comment
1431                
1432              </a>
1433            
1434          </span>
1435        
1436        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5824/1357935259000/" data-record-type="1" data-full-url="/blog/age" data-title="Age"></span>
1437      </div>
1438
1439    </div>
1440  </footer>
1441
1442
1443  </article>
1444
1445  <div class="post-divider"></div>
1446
1447
1448<article class="hentry author-john-sheehan post-type-text article-index-16" id="article-521190b8e4b0775e185c5827" data-item-id="521190b8e4b0775e185c5827">
1449
1450  <!--SPECIAL CONTENT-->
1451
1452  
1453
1454
1455  <!--POST HEADER-->
1456
1457  <header>
1458    <h1 class="entry-title">
1459      
1460        <a href="/blog/runscope" data-content-field="title">Runscope</a>
1461      
1462    </h1>
1463    <div class="meta">
1464      <span class="date"><time class="published" datetime="2013-01-09">January  9, 2013</time></span>
1465    </div>
1466  </header>
1467
1468  <!--POST BODY-->
1469
1470  
1471    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5827"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5828"><div class="sqs-block-content">
1472
1473<p><a href="https://www.runscope.com"><img src="http://media.tumblr.com/2092bcce7a1922faddf5f02f9a0ba04b/tumblr_inline_mgdqiedSV81qcl1x1.png" alt=""/></a></p>
1474
1475<p>I’m very excited to announce that I have co-founded a company. If you use APIs in your mobile or web applications <a href="https://www.runscope.com">request an invite to our early preview</a>. We’re still very early in this and will be talking about more details as we progress.</p>
1476
1477<p>The plan when I moved out to San Francisco was always to eventually start something of my own. I learned a ton working at Twil
1477io and IFTTT and now hope to apply that knowledge to build a great company. Now’s the time. We’ve got a great team and a giant problem to solve and I can&#8217;t wait to show it to all of you.</p>
1478
1479<p><a href="https://twitter.com/runscope">Follow Runscope on Twitter</a> to track our progress.</p>
1480
1481
1482</div></div></div></div></div></div>
1483    
1484  
1485
1486
1487  <!--POST FOOTER-->
1488
1489  <footer>
1490    <div class="meta">
1491
1492      
1493
1494      
1495
1496      <div class="second meta-row">
1497        
1498        
1499          <span class="comments">
1500            
1501              <a href="/blog/runscope#comments-521190b8e4b0775e185c5827">
1502                
1503                  Comment
1504                
1505              </a>
1506            
1507          </span>
1508        
1509        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5827/1357770698000/" data-record-type="1" data-full-url="/blog/runscope" data-title="Runscope"></span>
1510      </div>
1511
1512    </div>
1513  </footer>
1514
1515
1516  </article>
1517
1518  <div class="post-divider"></div>
1519
1520
1521<article class="hentry author-john-sheehan post-type-text article-index-17" id="article-521190b8e4b0775e185c582a" data-item-id="521190b8e4b0775e185c582a">
1522
1523  <!--SPECIAL CONTENT-->
1524
1525  
1526
1527
1528  <!--POST HEADER-->
1529
1530  <header>
1531    <h1 class="entry-title">
1532      
1533        <a href="http://blog.programmableweb.com/2012/12/11/announcing-the-2012-api-community-survey/">2012 API Community Survey <span>&rarr;</span></a>
1534      
1535    </h1>
1536    <div class="meta">
1537      <span class="date"><time class="published" datetime="2012-12-17">December 17, 2012</time></span>
1538    </div>
1539  </header>
1540
1541  <!--POST BODY-->
1542
1543  
1544    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c582a"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c582b"><div class="sqs-block-content">
1545
1546<p>I (via <a href="http://www.api-jobs.com">API Jobs</a>) teamed up with Programmable Web, Mashery, 3scale and Layer7 to survey the API community landscape. One lucky participant will win an 11&#8221; MacBook Air or Surface Pro. If you&#8217;ve built or used an API in the last year, please <a href="http://www.api-survey.com">take a few minutes to take the survey</a>.</p>
1547
1548
1549</div></div></div></div></div></div>
1550    
1551  
1552
1553
1554  <!--POST FOOTER-->
1555
1556  <footer>
1557    <div class="meta">
1558
1559      
1560
1561      
1562
1563      <div class="second meta-row">
1564        
1565        
1566          <span class="comments">
1567            
1568              <a href="/blog/2012-api-community-survey#comments-521190b8e4b0775e185c582a">
1569                
1570                  Comment
1571                
1572              </a>
1573            
1574          </span>
1575        
1576        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882955405-1Z0PJUD1TYJP4Q9DXWZK" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c582a/1355767233000/" data-record-type="1" data-full-url="/blog/2012-api-community-survey" data-title="2012 API Community Survey"></span>
1577      </div>
1578
1579    </div>
1580  </footer>
1581
1582
1583  </article>
1584
1585  <div class="post-divider"></div>
1586
1587
1588<article class="hentry author-john-sheehan post-type-text article-index-18" id="article-521190b8e4b0775e185c582d" data-item-id="521190b8e4b0775e185c582d">
1589
1590  <!--SPECIAL CONTENT-->
1591
1592  
1593
1594
1595  <!--POST HEADER-->
1596
1597  <header>
1598    <h1 class="entry-title">
1599      
1600        <a href="/blog/box-api-v2-less-is-more" data-content-field="title">Box API v2: Less is More</a>
1601      
1602    </h1>
1603    <div class="meta">
1604      <span class="date"><time class="published" datetime="2012-12-14">December 14, 2012</time></span>
1605    </div>
1606  </header>
1607
1608  <!--POST BODY-->
1609
1610  
1611    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c582d"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c582e"><div class="sqs-block-content">
1612
1613<p><a href="http://developers.blog.box.com/2012/12/14/v2_api/">Box has updated their API to version 2</a> and has simplified it along the way. The highlights:</p>
1614
1615<ul><li>Consistent request/response models</li>
1616<li>Convention-based attribute names (please do this in your APIs)</li>
1617<li>No more XML, huzzah!</li>
1618<li>Better events streams (I hope that Webhooks follows)</li>
1619<li>Settled on OAuth2 standard</li>
1620</ul><p>My favorite line:</p>
1621
1622<blockquote>
1623  <p>There’s an inherent impedance mismatch between XML and regular humans.</p>
1624</blockquote>
1625
1626<p>These are all very developer-friendly changes. If you&#8217;re designing an API, there&#8217;s a lot to learn from Box&#8217;s experience.</p>
1627
1628
1629</div></div></div></div></div></div>
1630    <div class="entry-source">Source: <a href="http://developers.blog.box.com/2012/12/14/v2_api/" target="_blank">http://developers.blog.box.com/2012/12/14/...</a></div>
1631  
1632
1633
1634  <!--POST FOOTER-->
1635
1636  <footer>
1637    <div class="meta">
1638
1639      
1640
1641      
1642
1643      <div class="second meta-row">
1644        
1645        
1646          <span class="comments">
1647            
1648              <a href="/blog/box-api-v2-less-is-more#comments-521190b8e4b0775e185c582d">
1649                
1650                  Comment
1651                
1652              </a>
1653            
1654          </span>
1655        
1656        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882955483-64M07MRWDZXOFN7MXXN0" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c582d/1355511304000/" data-record-type="1" data-full-url="/blog/box-api-v2-less-is-more" data-title="Box API v2: Less is More"></span>
1657      </div>
1658
1659    </div>
1660  </footer>
1661
1662
1663  </article>
1664
1665  <div class="post-divider"></div>
1666
1667
1668<article class="hentry author-john-sheehan post-type-text article-index-19" id="article-521190b8e4b0775e185c5830" data-item-id="521190b8e4b0775e185c5830">
1669
1670  <!--SPECIAL CONTENT-->
1671
1672  
1673
1674
1675  <!--POST HEADER-->
1676
1677  <header>
1678    <h1 class="entry-title">
1679      
1680        <a href="http://trafficandweather.io">Traffic and Weather: My new Cloud/API Podcast <span>&rarr;</span></a>
1681      
1682    </h1>
1683    <div class="meta">
1684      <span class="date"><time class="published" datetime="2012-12-13">December 13, 2012</time></span>
1685    </div>
1686  </header>
1687
1688  <!--POST BODY-->
1689
1690  
1691    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5830"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5831"><div class="sqs-block-content">
1692
1693<p>Steve Marx and I had such a great time with the conversation I posted here that we decided to do it every week. Check out <a href="http://trafficandweather.io/">Traffic and Weather</a>, a (mostly) weekly news and commentary podcast about all things cloud and API. We&#8217;ve already done two episodes and I&#8217;m really happy with how they&#8217;ve turned out.</p>
1694
1695<p>Subscribe to the <a href="http://trafficandweather.libsyn.com/rss">RSS feed</a> or subscribe in <a href="https://itunes.apple.com/us/podcast/traffic-and-weather/id584636514?mt=2">iTunes</a>.</p>
1696
1697<p>Lastly, thanks to my friends at <a href="http://www.sendgrid.com">SendGrid</a> for sponsoring our first few episodes.</p>
1698
1699
1700</div></div></div></div></div></div>
1701    
1702  
1703
1704
1705  <!--POST FOOTER-->
1706
1707  <footer>
1708    <div class="meta">
1709
1710      
1711
1712      
1713
1714      <div class="second meta-row">
1715        
1716        
1717          <span class="comments">
1718            
1719              <a href="/blog/traffic-and-weather-my-new-cloud-api-podcast#comments-521190b8e4b0775e185c5830">
1720                
1721                  Comment
1722                
1723              </a>
1724            
1725          </span>
1726        
1727        <span class="squarespace-social-buttons inline-style" data-system-data-id="1376882955062-T3XJ91CJGRHRDDEQHCHC" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5830/1355418055000/" data-record-type="1" data-full-url="/blog/traffic-and-weather-my-new-cloud-api-podcast" data-title="Traffic and Weather: My new Cloud/API Podcast"></span>
1728      </div>
1729
1730    </div>
1731  </footer>
1732
1733
1734  </article>
1735
1736  <div class="post-divider"></div>
1737
1738
1739<article class="hentry author-john-sheehan post-type-text article-index-20" id="article-521190b8e4b0775e185c5833" data-item-id="521190b8e4b0775e185c5833">
1740
1741  <!--SPECIAL CONTENT-->
1742
1743  
1744
1745
1746  <!--POST HEADER-->
1747
1748  <header>
1749    <h1 class="entry-title">
1750      
1751        <a href="/blog/craving-conversation" data-content-field="title">Craving Conversation</a>
1752      
1753    </h1>
1754    <div class="meta">
1755      <span class="date"><time class="published" datetime="2012-12-12">December 12, 2012</time></span>
1756    </div>
1757  </header>
1758
1759  <!--POST BODY-->
1760
1761  
1762    <div class="body entry-content"><div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Post Body" data-type="item" id="item-521190b8e4b0775e185c5833"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-521190b8e4b0775e185c5834"><div class="sqs-block-content">
1763
1764<p><img src="http://media.tumblr.com/tumblr_meyd2iznYb1qcl1x1.png" alt=""/></p>
1765
1766<p>Twitter is my water cooler. I blow off steam, talk about what I&#8217;m working on, learn new things from others, etc. For the first few years I spent using the service it seemed like every night there was an awesome conversation going on. Lately it seems like people have been conversing less and retweeting more. I don&#8217;t know if it&#8217;s because I&#8217;ve shifted away from following people in a specific tech community (the .NET crew seems to have focused their conversing there more than the others I&#8217;ve observed) or just a general behavioral shift in how people use Twitter (or both) but lately I&#8217;
1766ve been missing those great conversations.</p>
1767
1768<p>Other social networks never really filled the gap. Google+ was OK, but activity tapered off pretty quickly after it launched. App.net is still promising, but nascent and hasn&#8217;t grabbed me yet. I almost started a site just to share links and discuss APIs just to have it. I&#8217;m not famous enough to bootstrap a discussion community though (learned that lesson once before).</p>
1769
1770<p>Then Google+ Communities were launched a few days ago. You can create them by topic. They&#8217;re moderated. The posts work like any other G+ post so links, etc. are first-class and each item has comments. To me, this is the perfect application of the G+ stream structures and having them scoped by topic solves the problem of having to follow someone who may post a lot about stuff you&#8217;re not interested in.</p>
1771
1772<p>Ultimately, it&#8217;s another message medium like many before. The quality will be determined by the people that contribute to the community. But it&#8217;s looking promising. <a href="https://plus.google.com/communities/101310422065394201059">You can find me chatting about APIs over there</a>.</p>
1773
1774
1775</div></div></div></div></div></div>
1776    
1777  
1778
1779
1780  <!--POST FOOTER-->
1781
1782  <footer>
1783    <div class="meta">
1784
1785      
1786
1787      
1788
1789      <div class="second meta-row">
1790        
1791        
1792          <span class="comments">
1793            
1794              <a href="/blog/craving-conversation#comments-521190b8e4b0775e185c5833">
1795                
1796                  Comment
1797                
1798              </a>
1799            
1800          </span>
1801        
1802        <span class="squarespace-social-buttons inline-style" data-system-data-id="" data-asset-url="https://static1.squarespace.com/static/52118c34e4b030489dbc406b/521190b7e4b0775e185c57f0/521190b8e4b0775e185c5833/1355373799000/" data-record-type="1" data-full-url="/blog/craving-conversation" data-title="Craving Conversation"></span>
1803      </div>
1804
1805    </div>
1806  </footer>
1807
1808
1809  </article>
1810
1811
1812
1813<!--PAGINATION-->
1814
1815
1816  <nav class="pagination clear">
1817      
1818      <a class="older-posts" href="/?offset=1355373799000">Older Posts &rarr;</a>
1819  </nav>
1820
1821
1822</div>
1823
1824<aside id="sidebar" data-content-field="Sidebar"><div class="sqs-layout sqs-grid-1 columns-1" data-layout-label="Blog Sidebar" data-type="block-field" data-updated-on="1612797089221" id="sidebarBlocks"><div class="row sqs-row"><div class="col sqs-col-1 span-1"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-da83e17b7ac614ad4057"><div class="sqs-block-content">
1825
1826<h2 style="white-space:pre-wrap;">Around the Web</h2><ul data-rte-list="default"><li><p class="" style="white-space:pre-wrap;"><a href="https://twitter.com/johnsheehan">Twitter</a></p></li><li><p class="" style="white-space:pre-wrap;"><a href="http://instagram.com/johnsheehan">Instagram</a></p></li><li><p class="" style="white-space:pre-wrap;"><a href="https://github.com/johnsheehan">GitHub</a></p></li><li><p class="" style="white-space:pre-wrap;"><a href="http://stackoverflow.com/users/1786/runscope-api-tools">Stack Overflow</a></p></li><li><p class="" style="white-space:pre-wrap;"><a href="https://news.ycombinator.com/user?id=johns">Hacker News</a></p></li><li><p class="" style="white-space:pre-wrap;"><a href="https://www.linkedin.com/in/sheehanjohn/">LinkedIn</a></p></li></ul>
1827
1828
1829</div></div><div class="sqs-block search-block sqs-block-search" data-block-type="33" id="block-db7c5e493191d1dd11e4"><div class="sqs-block-content">
1830
1831<div class="sqs-search-ui-text-input sqs-search-ui-button-wrapper color-dark" data-source="block" data-preview="false" data-collection="">
1832  <div class="spinner-wrapper"></div>
1833  <input
1834    type="search"
1835    class="search-input"
1836    value=""
1837    placeholder="Search"
1838    aria-label="Search"
1839  />
1840</div>
1841</div></div><div class="sqs-block image-block sqs-block-image" data-block-type="5" id="block-ba2137ff95c33fd29c81"><div class="sqs-block-content">
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856 
1857
1858  
1859  
1860    <div
1861        class="
1862          image-block-outer-wrapper
1863          layout-caption-hidden
1864          design-layout-inline
1865          combination-animation-none
1866          individual-animation-none
1867          individual-text-animation-none
1868        "
1869        data-test="image-block-inline-outer-wrapper"
1870    >
1871
1872      
1873
1874      
1875        <figure
1876            class="
1877              sqs-block-image-figure
1878              intrinsic
1879            "
1880            style="max-width:440px;"
1881        >
1882          
1883        
1884        
1885
1886        
1887          <a
1888              class="
1889                sqs-block-image-link
1890                
1891          
1892        
1893              "
1894              href="https://www.runscope.com/"
1895              
1896          >
1897            
1898          <div
1899              
1900              
1901              class="image-block-wrapper"
1902              data-animation-role="image"
1903              
1904  
1905
1906          >
1907            <div class="sqs-image-shape-container-element
1908              
1909          
1910        
1911              has-aspect-ratio
1912            " style="
1913                position: relative;
1914                
1915                  padding-bottom:50%;
1916                
1917                overflow: hidden;
1918              "
1919              >
1920              <noscript><img src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1440137395290-IY2QEITH1CGH1JBOO4CI/rt-banner-250x250-001.png" alt="rt-banner-250x250-001.png" /></noscript><img class="thumb-image" data-src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1440137395290-IY2QEITH1CGH1JBOO4CI/rt-banner-250x250-001.png" data-image="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1440137395290-IY2QEITH1CGH1JBOO4CI/rt-banner-250x250-001.png" data-image-dimensions="440x220" data-image-focal-point="0.5,0.5" alt="rt-banner-250x250-001.png" data-load="false" data-image-id="55d6c0b2e4b0f5f10ae0233c" data-type="image" />
1921            </div>
1922          </div>
1923        
1924          </a>
1925        
1926
1927        
1928      
1929        </figure>
1930      
1931
1932    </div>
1933  
1934
1935
1936
1937</div></div></div></div></div></aside>
1938    </section>
1939
1940    <div class="extra-wrapper page-footer">
1941      <div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Footer Content: John Sheehan" data-type="block-field" data-updated-on="1377019058845" id="page-footer-521190b7e4b0775e185c57f0"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block image-block sqs-block-image" data-block-type="5" id="block-d5dcfcd6021db36df39a"><div class="sqs-block-content">
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956 
1957
1958  
1959  
1960    <div
1961        class="
1962          image-block-outer-wrapper
1963          layout-caption-hidden
1964          design-layout-inline
1965          
1966          
1967          
1968        "
1969        data-test="image-block-inline-outer-wrapper"
1970    >
1971
1972      
1973
1974      
1975        <figure
1976            class="
1977              sqs-block-image-figure
1978              intrinsic
1979            "
1980            style="max-width:728px;"
1981        >
1982          
1983        
1984        
1985
1986        
1987          <a
1988              class="
1989                sqs-block-image-link
1990                
1991          
1992        
1993              "
1994              href="https://www.runscope.com/t/johnblog"
1995              
1996          >
1997            
1998          <div
1999              
2000              
2001              class="image-block-wrapper"
2002              data-animation-role="image"
2003              
2004  data-animation-override
2005
2006          >
2007            <div class="sqs-image-shape-container-element
2008              
2009          
2010        
2011              
2012            " style="
2013                position: relative;
2014                
2015                  padding-bottom:12.362637519836426%;
2016                
2017                overflow: hidden;
2018              "
2019              >
2020              <noscript><img src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1377019046734-YYD56VR1OGLKKV75QH43/rt-banner-728x90-002.png" alt="rt-banner-728x90-002.png" /></noscript><img class="thumb-image" data-src="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1377019046734-YYD56VR1OGLKKV75QH43/rt-banner-728x90-002.png" data-image="https://images.squarespace-cdn.com/content/v1/52118c34e4b030489dbc406b/1377019046734-YYD56VR1OGLKKV75QH43/rt-banner-728x90-002.png" data-image-dimensions="728x90" data-image-focal-point="0.5,0.5" alt="rt-banner-728x90-002.png" data-load="false" data-image-id="5213a4a6e4b0c36e7d2cba82" data-type="image" />
2021            </div>
2022          </div>
2023        
2024          </a>
2025        
2026
2027        
2028      
2029        </figure>
2030      
2031
2032    </div>
2033  
2034
2035
2036
2037</div></div></div></div></div>
2038    </div>
2039
2040    <div class="page-divider"></div>
2041
2042    <footer id="footer">
2043      <div class="sqs-layout sqs-grid-1 columns-1" data-layout-label="Footer Content" data-type="block-field" data-updated-on="1377018790905" id="footerBlock"><div class="row sqs-row"><div class="col sqs-col-1 span-1"><div class="sqs-block html-block sqs-block-html" data-block-type="2" id="block-b4e05a2fdfdc0bd35665"><div class="sqs-block-content">
2044
2045<p>Copyright 2013 John Sheehan</p>
2046
2047
2048</div></div></div></div></div>
2049      
2050        
2051      
2052    </footer>
2053
2054  </div>
2055
2056  <div></div>
2057
2058  
2058<script src="https://static1.squarespace.com/static/ta/4fd1028ee4b02be53c65dfb3/1359/scripts/site-bundle.js" type="text/javascript"></script>
2058
2059
2060  
2060<script type="text/javascript">
2061        /* <![CDATA[ */
2062        var google_conversion_id = 988378328;
2063        var google_custom_params = window.google_tag_params;
2064        var google_remarketing_only = true;
2065        /* ]]> */
2066        </script>
2066
2067        
2067<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">
2068        </script>
2068
2069        <noscript>
2070        <div style="display:inline;">
2071        <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/988378328/?value=0&amp;guid=ON&amp;script=0"/>
2072        </div>
2073</noscript>
2074<img src="http://ads.perfectaudience.com/seg?add=994138&t=2" width="1" height="1" border="0" />
2074<script data-sqs-type="imageloader-bootstrapper">if(window.ImageLoader) window.ImageLoader.bootstrap({}, document);</script>
2074<script>Squarespace.afterBodyLoad(Y);</script>
2074
2075
2076
2077
2078
2079</body>
2080
2081</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.