When building company identity, figure out the story your users are telling their friends. Users define value differently from what your copy is telling them. Pitches such as the new x, the fastest y, or the cheapest z won’t be what users are telling their friends. Find the story, share it, and more people will talk about your product.

The story people share is not the marketing copy

Sure Twitter is good for “finding out what was happening right now”, but who is going to tell that to their friends? I’m going to talk about how fun the debates were to watch alongside tweets, or how great Twitter is to augment a conference.

Of course Tumblr is the “simplest blogging platform”, but I’m going to tell friends about the niche music genres I love, that I discovered on it. I’m going to tell visual artists how making a GIF made my work spread like crazy.

Yeah, Snapchat is “a way to share moments with friends”, but isn’t that every social network? Really the fun in it is making goofy drawings and laughing at each other.

When you want to get people talking about your product, you’ve got to move beyond the marketing copy.  The story people share must be personally meaningful or easy to talk about. 

You can’t just ask users for a story

Figuring out these stories isn’t easy.  What users would tell their friends isn’t the same as what they’d tell you, simply because you made the product, and you’re prompting for a response.  

See how people discuss your product in forums and on Twitter.  A week ago,  we saw a tweet regarding embedding gists on a blogging platform.  One response recommended using Embedly, because someone wanted to improve the platform; Embedly solved the problem and was easy to use.

Why this is essential to figure out

When I see a talk or get pitched on a product, I’ve found it is always the anecdotes that stick with me.  A pitch is hard to relay, that feels a bit grimey.  But a meaningful anecdote is exciting to talk about, it is much more human, and the value is concrete.

Be deliberate about discovering and expressing these stories, and people will talk more about your product. People will remember your pitch, will respond better to your presentations, and will relay your conversations.  

For further reference, you can check out materials on remarkable storytelling.

Posted 10 months ago by whichlight
Embed This

Embedly and Meteor share a common goal of helping developers create rich and engaging apps quickly and intuitively. This Meteor tutorial will show you how easy it is to drop in Embedly and create an Embedly Meteor app.

For those unaware, Meteor is an application platform that makes it easy for developers to rapidly build reactive, api-backed web apps.

For this Meteor tutorial, I built a demo called Restaurant Roulette, using Meteor along with Embedly Extract, Embedly Display, and the Yelp API. The code is available on github, but I’ll highlight the good stuff in this post.

Here at Embedly, where to go for lunch is a constant battle. Blood has been shed. With restaurant roulette, we can leave the decision up to fate and its pseudorandom number generator.


I gloss over some Meteor fundamentals, so I’ll point you at this Meteor tutorial to make up the difference.

I. Keyword Extraction and Dominant Color Extraction with Embedly Extract

Embedly Extract makes it super easy to extract relevant keywords from a restaurant’s Yelp reviews (arrow 4). This gives us a quick idea of what a restaurant is like.

We use the Yelp API to query restaurants by name in our area. The Yelp API returns the restaurant’s Yelp site URL, which is where we get the reviews.

Embedly Extract also gives us useful image metadata, including image dominant colors, that we can use to create more engaging content (arrow 1).

  function fetchRestaurantExtractSync(info) {
    var extractBase = 'http://api.embed.ly/1/extract';
    var embedlyKey = Meteor.settings.embedlyApiKey;
    var result = Meteor.http.get(extractBase, {
      params: {
        key: embedlyKey,
        url: info.yelpUrl

    //result.data.keywords is a dictionary of relevant keywords from the
    //page at info.yelpURl
    info.keywords = result.data.keywords.map(function (item) {
      return item.name

    //result.data.images contains image metadata including image entropy
    //and image dominant colors
    info.imageInfo = result.data.images[0];

    info._id = Meteor.call('createRestaurant', info);

    return info

II. Image Resizing with Embedly Display

Embedly Display is a versatile image manipulation tool that we use in 2 ways.

We use the fill endpoint to create image thumbnails of an exact size, maintaining aspect ratio, and fill any leftover space with the dominant color (arrow 3). This gives us a smooth color transition around our images, instead of blots of white space.

For a larger version of the image (arrow 2), we just want to keep the width constant, so we use the resize endpoint to get the width we want while maintaining aspect ratio.

  function getThumbnail(info) {
    var displayBase = 'http://i.embed.ly/1/display/fill';
    var embedlyImageKey = Meteor.settings.public.embedlyImageKey;
    // use the image's most dominant color to fill the background, with a
    // fall-back to white.
    var dc;
    if (typeof info.imageInfo.colors !== 'undefined') {
      dc = info.imageInfo.colors[0].color;
    } else {
      dc = [255, 255, 255];

    // set all the image parameters we want embedly display to handle
    // this will fit the image into a 100 by 100 pixel area, maintaining
    // aspect ratio, and filling the extra space with our fill color
    var params = {
      key: embedlyImageKey,
      url: info.imageInfo.url,
      width: 100,
      height: 100,
      color: rgbToHex(dc[0], dc[1], dc[2])

    // return a string of the embedly display url for our properly resized image
    return displayBase + '?' + $.param(params)
  function getImage(info) {
    var displayBase = 'http://i.embed.ly/1/display/resize';
    var embedlyImageKey = Meteor.settings.public.embedlyImageKey;

    // tell embedly display to resize the image to 400 pixels wide, with
    // the original aspect ratio setting the height
    var params = {
      key: embedlyImageKey,
      url: info.imageInfo.url,
      width: 400

    return displayBase + '?' + $.param(params)

And there you have it: an Embedly Meteor app with proper image resizing, all without dealing with server-side image resizing or storage. All that’s left is to use Meteor deploy, and your site is live.

Posted 10 months ago by embedly-andy
Embed This

Curatr is your virtual living room bookshelf, showcasing your favorite media around the web. Instead of letting those things collect dust, Curatr uses Embedly to make the media rich enough to create a story in just one click. We love getting messages on what people are making with the Embedly API. Curatr creatr (see what I did there), Brent Charbonneau recently tweeted at us, surprising us with what they’ve built. 

1. What is the mission behind Curatr?

At Attempt103, we are driven to create amazing products that help people connect, engage, and better understand each other. We believe the best way to get to know someone is by understanding what they love — So we created Curatr, a new way to share what you love in the digital world. 


We built Curatr to be the digital version of your livingroom bookshelf, a place where you carefully choose to display a particular set of things that mean the most to you. Curatr encourages the same thoughtful selection by providing space for 9 items in each curation and the ability to visually personalize each of your curations.

2. How does Embedly help out in that mission?

Embedly enables us to create visually compelling and interactive experiences when our users curate items. We use Embedly to identify thumbnails and embeddable content from the links they choose for the items they add to their curations. The ability to view embedded rich content directly within curations makes the experience of viewing a curation a lot of fun. 


A great example of the functionality that Embedly provides can be found in a curation that Peter, one of our users, created to show off his own music, “COINS EP”:


In order to ensure the best user experience we’re slowing rolling out which sites we allow for rich embedding, but YouTube, SoundCloud, Vimeo are a few of the services we already support, and we plan on adding more soon.

3. What would you like to see next from Embedly?

The only feature we’d like to see, at this time, is something on a technical level. As we mentioned above, we’re slowly rolling out which sites we support rich embedding for because we feel that certain content works really well on our users’ curations (video, and audio embeds, for example), but other content works better as direct links (Amazon URLs are one example that comes to mind). At this time however, responses from the API don’t provide a way for us to discern the type of rich content we’re receiving. If we had that information we might be able to programatically enable all video-type and audio-type rich content Embedly supported services to automatically embed into curations.

Other than that little dream feature, we’re actually very happy with the service Embedly currently provides. In fact there are still existing Embedly services and features we’ve identified for possibly integrating into Curatr in the near future. For example, we’re very interested in seeing if Embedly’s recently launched Display service can help with how we display item images and backgrounds for curations.


We’re very grateful for the services that Embedly provides, and for the opportunity to share with you what we’re doing with Curatr.

We’re flattered! Amazing product use and creative innovation on displaying yourself. If you’re starting a project or ready to launch, let us know! We’d love to help and we’re always looking for our next spotlight.

Posted 10 months ago by ninerr
Embed This

After you’ve finished a blog post, you need to add tags to make the post easy to find.  Tags boost SEO by providing web crawlers with keywords to understand your post.  They also organize and classify your posts by topic, making them easier to find.

Two tools that can help you get tags for a blog post are Google’s Keyword Tool and the Extract Explorer.  They provide keywords from a different angle, and together offer a breadth of options to help you pick a great set of tags.

As an example, we’ll run our recent post on Pinterest colored placeholders through both tools.  First, save your post privately so you can get a public URL without sharing it.

1. Cast a wide net and see what people search for with Google’s Keyword Tool

Head over to the Google keyword tool and enter in the URL for your post.  You’ll get a list of keywords, including phrases, with insight on the search volume, and competition for keywords. You’ll immediately notice that many of the phrases are irrelevant to your post, but you’ll see phrases geared towards what people may search.

That is the value of the Google Keyword tool, that it offers insight on what people are searching. So I may add “photo resize”, “color image”, “image place holder”.  The drawback is that you’ll have to do a bit of sifting.

2. Use text analysis to find relevant tags with Entities and Keyword extraction

The Extract Explorer is powered by Embedly Extract.  It is an easy way to find entities and keywords from your post.  What I’ve noticed is that entities generally make good tags, because they refer to proper nouns: person, places, or things. Keywords are found with TF-IDF, and can be general, but they can combine to form useful tags.  Where the Google Keyword Tool is great to see what people are searching for, the Extract Explorer can help you quickly find words to classify your post on your blog.

To use it, head over to the Extract Explorer and paste in the URL for your post.


You can see the response for our example post. The entities include: Pinterest, Embedly, Peter Gabriel.  The keywords include: image, pinterest, placeholder, embedly, jif, resize, apps, api, browser, color.  From these, you can pick and combine to form a set of tags.  For this example, I’d make sure to include image, resize, pinterest, and color. 

The takeaway

If you’re concerned about missing some good tags for your recent blog post, use the Google Keywords tool and the Extract Explorer to get a broad set of words to choose from.

A bit meta: I used these tools to find tags for this post. From the Google Keyword Tool : “find keywords”, “keyword tool”, “seo tools”.  From Extract: “extract”, “tags”, “entities”. 

Posted 11 months ago by whichlight
Embed This

We need to figure out a better way to categorize B2B startups. SaaS, PaaS or IaaS aren’t descriptive enough for API companies, this is the path to Embedly using Cloud API.

Humans are incredibly good at categorization. We love putting labels on things and if we can’t find a label, we use one of our existing schemas to draw a comparison. This is why most new startups are described as X for Y (AirBnB for Food, Uber for Cats).

SaaS, PaaS and IaaS were all created with this comparison in mind. I mean, Software As A Service just screams “we didn’t know what to call a hosted version of Microsoft Products so we used an X for Y”.

Each have very specific meanings in this world.

SaaS: “A software delivery model in which software and associated data are centrally hosted on the cloud.” Examples include Salesforce, Google Apps and Microsoft Office 365. An individual user interacts with the product.

IaaS: “In the most basic cloud-service model, providers of IaaS offer computers - physical or (more often) virtual machines - and other resources.” Examples include AWS, Rackspace and Dyn.

PaaS: “In the PaaS model, cloud providers deliver a computing platform typically including operating system, programming language execution environment, database, and web server.” Examples include Heroku, Google App Engine and dotCloud.

These terms are incredibly important. They allow a customers/developers/investors to frame a conversation around a new product by putting it into one of these predefined categories. They allow Forrester to create outrageous claims about the market and get sales and marketing people excited.

This is all well and good until you don’t fit into any of these models. We don’t sell to the end user, we sell to the dudette that builds the SaaS app.  We don’t allow you to host your own VM and we don’t give you a layer on top of the VM like Heroku does.

People have started getting creative with these terms. Mobile backend companies decided that they didn’t like any of these labels, so they created their own.

BaaS: Backend as a Service. “A model for providing web and mobile app developers with a way to link their applications to backend cloud storage while also providing features such as user management, push notifications, and integration with social networking services.” Examples include Parse, Kinvey and StackMob.

This term can now be used it successfully to market and sell product.

Let’s talk about a segment of the market that explicitly sells to developers, but does not host code. How do they frame themselves?

  • Twilio is put into IaaS, but describes themselves as a “Cloud API”.
  • Zencoder describes themselves as a SaaS company.
  • SendGrid is a “Cloud Based Service”.
  • Filepicker says they are SaaS.
  • Mashcape is the “Cloud API Hub”.
  • Imagga is a “Cloud Platform”.

Here’s the deal guys, we need to pick. I believe, like every web business, we probably fall into SaaS, but that’s not specific enough. Selling an API to a developer is completely different then selling Yammer to a user/organization.

The boundary for this definition is the following.

"An organization who’s main product is a RESTful API that is sold to developers on a metered basis."

A few options:

  • AaaS: API as a Service
  • FaaS: Feature as a Service
  • DaaS: Data as a Service

Those are all really bad and we should probably stay away from an “As a Service”, because service will always be redundant.

From a marketing and understanding purpose, my vote is Cloud API. This is not a new term, Wikipedia describes it as:

Cloud APIs are application programming interfaces (APIs) used to build applications in the cloud computing market. Cloud APIs allow software to request data and computations from one or more services through a direct or indirect interface.

Cloud, while overused, allows even non technical customers to get an understanding of what we do. We are in “The Cloud”! It at least begs the question, “what is an API?”

While we could use REST or Web, neither conveys that message as broadly as “Cloud”.

API, while technical, clearly defines the boundary. Service, Platform or Provider are all too broad and won’t differentiate ourselves from the next company.

From here on out Embedly will be known as a Cloud API company. If you are in the space, we hope you join us.

Posted 11 months ago by screeley
Embed This

Pinterest has built a rather clever image loading technique that utilizes the dominant color of an image as a placeholder while the browser readies the image. The following jif gives you an idea of how it works:

Pinterest Loading Gif

"Hey hunny, will you come look at this" has become the universal call for "let me show you something pretty on Pinterest" (at least in my household). While the pin is always pretty I’ve been constantly impressed with the little design tweaks that Pinterest adds between each beckoning.

I’ve been told that if you really want to impress a girl, you recreate a feature of the site she loves. I’m basically holding up a boom box on my girlfriend’s front lawn by writing this. 

Pinterest has figured out that the default loading behavior for images is really ugly. The browser fills the image from top to bottom, stops at random places depending on the connection and generally looks like hell.

It would be nicer if the image just faded in when it was ready for your viewing pleasure. To boot, let’s use the dominant color of the image as a placeholder to make the transition even less jarring.

It’s _very_ pretty, so we decided to build it using Embedly’s tech. Here’s a jif of our version:

Pinterest Loading Gif

We built a tutorial on the site so you can view the demo here: embed.ly/docs/tutorials/background

A 3 sentence primer on how we built it:

We used Embedly’s Extract API to get the dominate color of the first image and used it to fill a placeholder div. Embedly’s Display API is then used to resize the image to fit in in the container. We listen for the “onload“ event on the image and then animate the opacity to 1. 

Needless to say in about 30 lines of JavaScript we can reproduce a feature that can make any site look better. I leave you with the immortal words of Peter Gabriel: 

"in your eyes oh, I want to be that complete"

Posted 11 months ago by screeley
Embed This

It’s easy to overlook among all of Tumblr’s social features and stunning design, but the cobblestones that paved the road to Tumblr’s success are embeds. They enable the curation and communities that make Tumblr an engaging and compelling platform.

The thoughtful integration of embeds allows users to easily post and display pictures, videos, and text over a range of themes and devices.  From this, media all around the web becomes an object of self-expression, creating one of the richest, most meaningful media ecosystems.  

Amidst Tumblr’s recent acquisition, I want to highlight the relationship of embeds, reblogging, and building a meaningful product. 

Embeds are a crucial part of the Tumblr experience

Embeds are so important that they are woven into the content creation and consumption of Tumblr. As soon as you log in, you see:


Why wouldn’t text posts be enough? You could easily include photos and videos as a text post.  Tumblr wants to make sure the Dashboard and custom themes embed the media properly, and includes options to post specific media so it displays them efficiently over a range of devices and themes.  This is crucial especially on mobile: images are resized and videos are given slideshow previews.

Rich embeds and the rise of reblogging

Reblogging follows naturally from Twitter’s retweets. Both improve findability of interesting users by spreading content.  

The crucial difference is that the reblog embeds the images, gifs, or movies, and the retweet does not.   Because of the rich media, the reblog is more expressive than the retweet.  It is a way to easily express part of your own identity, through an image or a gif. 

Reblogging makes it easier to become a curator, reblogging specific subjects, or based on taste.  You don’t have to produce great content to be popular on Tumblr, you can do it just based on your taste and what you reblog. 

Communities around the curator

One effect of having more curators is that reblog depth is larger than retweet depth.  Retweet depth on average is less than three, whereas reblog depth can be larger, happening in cascades.  Even if it’s a few months old, once a popular ‘curator’ reblogs your post, you’ll see many more likes, reblogs, and follows.

The rise of curators has produced a media ecosystem where you can find communities around everything related to taste. You can find music tumblogs for the most niche genres of music- the same for fashion, for food, and for visual art.  From such a rich set of media, you will certainly find things that you find beautiful, and you’ll want to come back for more.

The bottom line

Tumblr built embedding right into its product, which made reblogging more expressive, thus producing one of the richest and most meaningful media platforms. 

Posted 11 months ago by whichlight
Embed This

Build vs Buy is a classic debate. Do we spend the money on internal resources to build a product or do we just pay someone else to do it for us?

The common approach is to just compare what it will cost internally vs externally. Two Engineers for 6 months vs X dollars for the product.

Rather than thinking about the product itself it’s helpful to think of the intangibles that aren’t inherent in the buy, the things that would be difficult to obtain by building the product yourself.

So what are you really getting when buying?

1. You are buying expertise.

While your two engineers are probably excellent, they haven’t lived and breathed a space for years.

The SendGrid team are experts at email delivery. While most developers can set up their own Email server they can’t tell you exactly why an Email isn’t getting delivered and how you can fix it.

The Zencoder team are experts at quickly converting any video into any format. They know where the browser and mobile market is going and can get you there faster.

The Crocodoc team are experts at converting the many horrors of Microsoft products into HTML5. Every edge case can be properly rendered and look exactly the same on any platform.

2. You are buying time.

Anything that is outside of your core competency should be delegated to someone else. Unless you plan on competing with the company, you should probably just buy their product.

3. You are buying QA.

“Given enough eyeballs, all bugs are shallow”. When one developer finds a bug with an API, the community benefits. It’s almost impossible to catch all edge cases even with great testing practices. With a large community of developers and their users your QA department is almost infinite.

4. You are buying community.

There are a massive amount of talented engineers out there that are already building interesting products using any given API. A quick search of StackOverflow shows that there are 332 questions tagged with Twilio, 208 with SendGrid and 164 with filepicker.io to name a few.

You are in good company when you buy.

5. You are buying scale.

Interesting things start to happen at scale. Embedly’s average response time has dropped dramatically over the past year. As the service has grown and more developers use the product there is a greater probability that a URL requested is already in cache. This allows use to respond quicker and I assume this is also the case with a company like FullContact.

6. You are buying relationships.

There is almost always someone upstream that can cause issues. Twilio has the Phone Companies, SendGrid has Email providers, FullContact has Social APIs, Filepicker has Dropbox and Embedly has Providers. At scale you have probably already cultivated relationships that when something fails you know exactly who to talk to.

Embedly buys MixPanel, SendGrid, FullContact, Zendesk, GitHub and Chargify.

Who are you buying time from?

Posted 11 months ago by screeley
Embed This

By using FullContact to push user profile data into Mixpanel we’re able to make targeting and tracking more powerful. We can target drip marketing campaigns more precisely based on where our users work, as well as their social profiles, location or age.

For those that are unfamiliar, Mixpanel helps you track your users and customers as they use your application, hopefully providing insight into how to increase conversion rates (“revenue analytics”). FullContact is a cool little API that takes an email address and provides lots of information about the person behind that address — his or her social network profiles, places of employment and some basic demographic information.

We are trying to get to a place where we can trigger notifications based on personal attributes instead of just when they signed up. Here is an example of targeting made possible by FullContact and Mixpanel:


The following is a short tutorial on using the FullContact API to push user data into Mixpanel. 

First off, this is what a user might look like in your Mixpanel project:

    "email": "sean@embed.ly",
    "plan": "basic",
    "date_joined": "May 1, 2012",
    "last_login": "May 10, 2013"

This information is probably populated by your frontend via the Mixpanel javascript library, but it’s perfectly reasonable to do it in the backend as well. Fullcontact, however, is a separate API that you’ll have to call on your backend. Looking up an email address is very straightforward via its HTTP API:

$ curl "http://api.fullcontact.com/v2/person.json?email=sean@embed.ly&apiKey=YOURKEY"

  "status": 200,
  "likelihood": 0.89,
  "requestId": "aa2f9f2c-57b8-48ab-811b-1be24aa652c8",
  "demographics": {
    "locationGeneral": "Boston",
    "gender": "Male"

Take a look at the full response if you’d like to see what kind of information it can provide. Pretty simple, although there are a couple details to keep in mind:

  • Ocassionally Fullcontact will return HTTP 202 which indicates your search has been queued and that you should retry the request in a few minutes
  • A status code of 404 means the query has run and no information was found
  • Fullcontact will rate limit your requests based on your plan

This means you’ll want to do your lookups in batches, which might look something like this:

def fullcontact_lookup(emails, api_key):
    results = {}
    to_lookup = set(emails)
    api_format = 'http://api.fullcontact.com/v2/person.json?email=%s&apiKey=%s'
    while len(to_lookup) > 0:
        # make a copy so we can delete from the set while we iterate
        for email in to_lookup.copy():
            api = api_format % (email, api_key)
            response = json.loads(requests.get(api).text)
            if response['status'] == 200:
                results[email] = response
            elif response['status'] == 404:
                results[email] = None
            elif response['status'] == 202:
                # keep it around to give it another go
                raise ValueError('Unexpected response from fullcontact: %s' %
        # give fullcontact a minute to run some queries
    return results

Now we need to actually stuff this data into Mixpanel. Unfortunately, naively running fullcontact_lookup against your entire database every night will be expensive, as Fullcontact charges per successful request. What we can do is add a property to each person called, say, fullcontact_version that keeps track of who has been queried. This can be an integer that gets incremented each time you change your schema, so you can just run the people with fullcontact_version != current_version. Treat the code below as pseudo-code; if you’d like to see the nitty gritty Mixpanel API details check out their docs.

def go(fullcontact_version):
    to_update = get_with_different_version(fullcontact_version)
    all_info = fullcontact_lookup(to_update)
    for person in to_update:
        info = all_info[person['email']]
        person['fullcontact_version'] = fullcontact_version
        if info:
            person['age'] = info.get('demographics', {}).get('age')
            # add more properties as you see fit

And there it is! With this small amount of effort you can get greater insight into who your users are and the ability to communicate with them more efficiently.

Posted 11 months ago by thejohnnest
Embed This

Our newest product is an Image Proxy and Image Resize API, fondly referred to as Display. This service is being thrown into the lime-light today to highlight its simplicity and usefulness for providing optimized 3rd party images to your web or mobile application.

Display is useful in many situations, but we find that some of the most important features include its use as a proxy to provide SSL images and its ability to resize images, which not only decreases the file size, but also allows you to scale them to fit and load quickly in any mobile or web browser.

The Image Resize API is a great complement to any 3rd party media API aggregating photos and images of various sizes. It integrates directly with our own Embed and Extract APIs to provide SSL images and resizing automatically.


See the Display image resize feature in action in the Resize demo or try some examples with Embedly JQuery.

Images make your site more engaging, but they slow down page load time, and it’s hard to optimize them for different screens.  Display solves that problem. Sign up to get started with Display.

Posted 11 months ago by artgibby
Embed This