Update August 1, 2024
The original blog post below went a bit viral on Hacker News and garnered 60,000+ page views in just a couple days. Maybe that (or more likely other API partners complaining) had some impact at Yelp. They just sent the email that follows. I appreciate the apology and acknowledgement of the mistake. I also would like to clarify what I wrote in more words in the original post—Yelp is perfectly within their right to start charging for their API. They just did it in a very poor way providing us 4-days notice (1 business day really Friday->Monday).
Yelp's August 1st email (emphasis mine):
Earlier this month, we sent you an email about your Yelp Fusion API usage. That email gave developers until July 23rd to contact us if they want to continue using Yelp’s data for use in their app. We realize you might need more time and are extending your free access for an additional 90 days starting today. Your access should be available now.
We’re sorry for any inconvenience or frustration this abbreviated transition might have caused. Please respond to this email or contact us at api@yelp.com if you have any questions.
The Original Post
After 10 years, I have removed from sale my macOS app for figuring out where to eat, Restaurants. In this post I’ll explain what Restaurants was, how I developed it, and why it was removed from sale. It speaks to the challenges developers face when incorporating third-party APIs.
App Development Journey
The year was 2014 and Apple had recently released a beta of its new programming language, Swift. As an exercise for an early adopter of the language, I thought it would be fun to leverage my experience in a couple startups using the Yelp API to make a restaurant-search-specific Yelp client for the Mac.
I emailed Yelp, explained the app I intended to build, and got permission. The person in developer relations said since they didn’t have a native Mac client, they would approve my use of the Yelp API for Restaurants. In fact, without me specifically asking for it, they provided a 25,000 per day API call limit (a limit my app never even came close to reaching). It seemed they were in fact encouraging me to finish the app and release it.
This makes sense since Yelp limited severely how many results (20, later 50), reviews (3), and pictures (3) were available through their API. So, it’s not like my app could replicate the full experience of using the Yelp website or the Yelp iOS client. Instead, it served as a super fast, well-integrated with macOS, way to search for restaurants on your Mac with the option to go to the Yelp website to read more reviews and see more details. In other words, it was in many ways a traffic driver to the Yelp website.
I released the app and it sold moderately, but consistently. Over the decade it was available, I charged between $1.99 and $4.99 up-front for the app (a one-time purchase through the Mac App Store). Sometimes it was in the top 10 apps in the Lifestyle category on the Mac App Store. But it turns out you only need to sell a couple copies in a day to reach the top 10! The vast majority of sales were to US customers. I assume that’s either because the US is where Yelp is most popular or has to do with our restaurant culture, or the combination of the two.
I built the app using AppKit and some third-party Yelp libraries, including most recently CDYelpFusionKit. I was sure to integrate with as many macOS features as I could. For example, you could instantly call a restaurant on your phone using Continuity, add a Restaurant to your address book, or get directions in Apple Maps. You could share a Restaurant’s details with any of your social apps. And of course Restaurants could automatically detect your location for your search if you gave it permission. It was a small app, but it did the one thing it was meant to do, search for restaurants, well. I used it myself every time I thought about going out somewhere new to eat.
One of the most popular design decisions I made was to represent different categories of restaurants with different emojis. For example, traditional American restaurants would have the turkey emoji 🦃 next to their name. This allowed folks to quickly scan the search results for their cuisine of choice. You can see what this looked like in one of the screenshots on the Restaurants website. It was actually my wife’s idea. With her help, we figured out by hand what emojis to use for all of the many restaurant categories that Yelp provides.
Over the years as Yelp added more features to the Yelp API and rebranded it as Yelp Fusion, I added those features to Restaurants. In the most recent big update, version 3, I better-integrated Apple Maps for a more seamless view of your search results geographically.
Users loved the most recent version, Restaurants 3. Its reviews were all high. One reviewer wrote on the Mac App Store, “I’m new to the Mac world, but I just love this app. It’s beautifully designed, easy and flexible to use, and infiniitely helpful.”
The 4-Day Deadline
So, why did I remove Restaurants from sale? Well on July 19, 2024 I received the following email:
Hello API user,
We appreciate you signing up for and trialing the Yelp Fusion API.
Your API usage is higher than lots of other Yelp Fusion developers and we would like to learn more about how you’re integrating the Fusion API into your platform. Please share screenshots which represent how you implemented the Yelp Fusion API, display Yelp content, and clearly attribute Yelp to your users.
To continue using Yelp Fusion commercially, we need to complete a license agreement. We will send this to you directly after reviewing your product, use case, and Yelp Fusion Enterprise eligibility.
If we don’t hear back from you by 4:00pm EST on 7/23/2024, we will temporarily disable your API key until we receive a response with the above requested information.
Please disregard this email if you are already a Yelp data licensee. If you are a license holder, please send us a copy of your agreement so that we can ensure there is no disruption to your API key.
Thanks, The Yelp Fusion team
There are a lot of problems with this email. I’ll just name a few. First of all, I was not “trialing” the Yelp API. I had been using it for a decade and had official permission from Yelp to create Restaurants. Second, Yelp already had the information they requested. I sent it to them when I first created the app and requested API access. I also had a profile on the Yelp developer portal that described the app and they could easily access the Restaurants website.
Third, it was surprising to hear my usage was, “higher than lots of other Yelp Fusion developers…” That implies I am somehow abusing the system. In fact, it was Yelp themselves who (as mentioned earlier did it without my specific prompting) provided me a 25,000 per day API call limit. But the actual usage was on average below 100 API calls per day. As I mentioned, it was not that popular an app.
But the biggest problem with the email is the threat. It said that in 4-days they would shutdown my API key with no prior notice unless I responded with the information they requested. They sent the email on a Friday and wanted a response by Monday. Imagine I was on vacation? That would effectively shutdown all of my users.
I thought this must be some kind of mistake. I was not even aware that Yelp had gone to an exclusively paid-model for the Yelp Fusion API. I had not received any prior emails to that effect, and had not been keeping up with the Yelp Engineering Blog. So, the 4-day threat seemed completely out of the blue.
I responded to the email which was sent directly from a Yelp employee who I’ve chosen to remove the name of from this post and her email CCed another Yelp employee. So despite being written to “API User” it seemed like it was sent by hand and customized for each recipient.
At the time that I wrote my reply I still was not aware (based on the first email) that no free version of the Yelp Fusion API any longer existed since the email only mentioned “enterprise” and “data.” I should have checked the Yelp developer website to better understand the situation before replying but I was surprised and given the 4-day deadline wanted to get a response as quickly as possible given the threat. I wrote:
Hi -name of person who emailed me-,
This all feels a bit out of the blue with not a lot of warning. We have shared customers who have been using Restaurants for 10 years. The tone of the email feels pretty threatening after a 10 year partnership. We do not use Yelp Fusion beyond the limits that were provided to us by Yelp when the product first launched.
I asked for permission from Yelp before launching the product and received it. It mainly drives traffic to your website since you only provide three reviews and three photos per restaurant. Why would you want to shut down a product that simply serves as another way to drive traffic to Yelp? The reason you approved it 10 years ago is because you don’t make a native Mac app yourself.
The information about Restaurants you asked for can be found on its website: https://oaksnow.com/restaurants/
Please let me know what your intentions are going forward.
Thanks, David
Of course it was naive (or you could say hopeful) of me to think they would care about my little Mac app. Here’s the reply I got a couple hours later:
HI David,
Thanks for the response and information! We have converted to a paid licensing program. You will need to obtain a license with us in order to continue your usage of the API.
Without a license in place, your API key will be disabled next week. This will just disintegrate all Yelp data on your platform. You can always sign up for a free trial on our website if you need more time.
If you are interested in a license, please review the attached program and pricing overviews.
Thanks, -name of person who emailed me-
It was then I checked the website and found there was no longer a free API. I immediately removed the app from sale on the Mac App Store because I didn’t know yet if it would make financial sense to pay for the API. I didn’t want users buying the app and being shutdown next week.
Development Ends
I did email back and forth a little bit more just to say I wouldn’t have minded them going paid if I had received several months of notice, but that the 4-day notice and the threatening zero-context email was quite rude. I did this just to provide feedback since I knew the decision was fait accompli. Of course that didn’t go anywhere.
I started looking into my options. With the few sales Restaurants garners, it really didn’t make sense to start paying for the API. Especially with a company that would be willing to pull-the-rug from under me with 4-days notice. So, the app stayed off the Mac App Store. And today, 10-days after the original email, Yelp shutdown its API key.
This distresses me because there are users who purchased Restaurants (when it was on sale for $1.99 during an indie app sale) as recently as earlier this month and now it doesn’t work. Not to mention the customers who have been using it for years. But due to the way that the Mac App Store works we don’t have our customers’ email nor any way to directly refund them. So, instead I need to direct them to Apple to request a refund. If you purchased Restaurants, please ask Apple for a refund by following the directions here. Even though it was beyond my control and I took the app down as soon as I could, I sincerely regret your customer experience.
I’ve also considered moving to a different API but unfortunately no API is quite as comprehensive for restaurants as the Yelp API. Google Places is close. But it would also require a lot of re-development which is not really something I’m up for given the app’s low sales.
Lessons Learned
I have learned a lot from this experience. Perhaps the number one thing I re-learned, since it has bitten me before (hello Facebook’s Parse), is that if you utilize a third-party API for the core of your app, you are at their whim. But using APIs for many apps is inevitable. So, you need to be sure the companies you work with are not the kind that will give you 4-days notice.
The other thing this taught me is the danger of an up-front paid model for apps that depend on ongoing access to third-party services. If users were continually paying for the app, paying for Yelp’s APIs would not be as much of an issue. And I wouldn’t feel as guilty about the app being discontinued since if the fees were charged on a monthly basis, they would just end at the same time the app ceased to exist instead of facing an expectation upon purchase of “forever access.” On the other hand, how would you charge a monthly fee for an app that people are only willing to spend less than $5 for upfront?