Show HN: Nango – Open unified API for product integrations (nango.dev)
Other integration companies have focused on building a lot of pre-built integrations. These are fast to ship and low maintenance, but they limit how deeply you can integrate with the external APIs.
We take a different approach: we make it easier for developers to build and maintain product integrations in code. This lets you create exactly the integration your customers need without compromising on speed and maintainability, and without having to build complex infrastructure (OAuth, retries, rate-limit handling, change detection, monitoring & logging, alerting, etc.).
Our platform has two layers: (1) An API-agnostic infrastructure built with Temporal and Postgres, and (2) lambda function-like integrations written in typescript by any developer.
Integrations are rarely more than 50 lines of code (here is an example: https://bit.ly/nango-example), thanks to the developer tooling we’ve built in: authentication, pagination, retries, change detection, rate-limit handling, monitoring, Slack alerts, etc.
We have pre-built integration templates you can clone and extend—or you can build entirely custom integrations. Your integrations live in your repo and are tested and deployed to Nango with a CLI.
In your product, you use a single API to interact with all your integrations. This lets you easily grow the available integrations with minimal code changes in your product.
As a community-driven project, anybody can contribute integration templates and APIs to the platform. In fact, more than 30% of the APIs we support today have been contributed by our community.
Nango grew out of a “universal OAuth” project called Pizzly and powers the integrations of 100+ SaaS products today. We have an active community of 800+ developers (https://nango.dev/slack).
All auth-related features are free forever, and we monetize with sync-related features. The entire code base and all integrations are source-available: https://github.com/NangoHQ/nango.
We hope Nango can help connect all SaaS products together and look forward to your feedback!
43 comments
[ 3.3 ms ] story [ 96.4 ms ] threadBut if, for every integrated service, you need to build out a custom URL to receive OAuth tokens after an authorization flow, and a database to securely store them, and a reliable background task to periodically refresh them... then you're doing a ton of work before you can even access a Salesforce or Quickbooks object on behalf of your clients. Having a service that can orchestrate all of this can make it as easy to work with as a stable API key, and then you just need to do the work.
Building integrations comes with specific challenges (security, ETL, etc.), which are usually not the core competency of SaaS teams.
We often see that problems related to building integrations are underestimated and can spiral in terms of engineering costs. Authorization in itself is complex, data synchronization even more so!
Things don’t need to work that well to be sold. One of my employers has entire integrations that don’t work and we still sell them to the business types successfully. They then file a bug ticket and wait months until we get to it, them paying fees all the way.
You have built a really great product that is easy to use. I've tested out the self-hosted option on render.com with neon postgres and the cloud version. Both are super easy to get up and running.
Now, it is no exaggeration to say that the most annoying part of adding a new integration is just navigating the API provider's portal to get the app outh creds.
I agree that getting approved to have an OAuth app is a major pain point (for some APIs). We help customers navigate this and would like to do more in the future (partner with API providers, offer sandbox accounts without approval, and even manage the approvals for customers when possible).
So instead of
I have to do ?What is the benefit of doing this?
Say the API is
What benefit do I get from calling instead?Can you show in code, what you mean?
Using your example, let's say I want to get the weather for Berlin today from NOAA, Foreca, and DarSky. I would have to do:
return each results and store them.As opposed to sending the call once:
Now let's say I want to add a new source (Wunderground). I login to Merge/Nango and just check "Wunderground" and just change my API call to store the new source.Now let's say Foreca changes it's API to foreca.com/v2/api?city=berlin I don't have to monitor this at all. Merge/Nango would do this for me.
Regarding your second point, APIs don't change just nilly willy from /v1/ to /v2/ and let you "fix" it by swapping "1" with "2". Usually you get changes like /v1/weather does not exist anymore and now you got /v2/exact_weather and /v2/broad_weather. Both different to /v1/weather. exact_weather only accepts city names of cities with a population over 1 million, is now a paid service and returns weekly weather instead of daily. And /v2/broad_weather does not accept city names anymore but only coordinates, is still free but locks you out after 10k monthly requests and returns daily weather but without rainfall info.
So a "in between API" won't save you from dabbling with the change from v1 to v2.
And on top of that, now you have two APIs that will change from time to time. The weather API and the Merge/Nango API.
Your example is very simplified and not what real integrations look like.
Rather than have a trillion different custom implementations for each 3rd party service (prone to frequent breaking), we just call the unified APIDeck endpoints for everything. We get the same exact data structure regardless of integration, so all the code is super generic and crazy easy to work with.
Whatever platforms they support, we support, and all we have to do is toggle a button, after which the integrations page gets populated with each activated integration. They bother with the actual integrations and making sure they're up-to-date with whatever changes all the different platforms make, and it's so much better than what we had before where we had to upkeep 30(!!!!) different integrations, all with various API patterns & return types and whatnot.
Our usecase is that we have a sidebar where we embed the contents from various CRM and Ecom apps, so a user "installs" an integration through APIDeck (skinned to look like our own thing), and then we just fetch through APIDeck and display whatever it gives us back to the user.
While I understand Elastic's goal of preventing other companies from just rebranding Elasticsearch and selling it as it is, I would probably use Nango as it is and build a front-end layer on top of it for my side projects as I thought this is the main use-case. Can you elaborate more on the license?
My point is that if there is no clear boundary, it's too risky for me to try this product even if it's open-core. For Elastic, their boundary is "database as a service" but I don't see anything similar in your license.
What I mean by that is your unified API can only support features that all of the APIs it is abstracting also support. Otherwise the users of that API will make calls and not know if they will work because it will depend on the backend.
The classic example of this was when people tried to create unified APIs for AWS, GCE, and Azure. They had to only support features all three had, otherwise the API would break if you used the wrong cloud provider, in which case it was easier to just interface directly with said cloud provider.
Which is a lot of words to say, how will you support multiple APIs with different feature sets without breaking your API?
There's a lot of subjectivity that goes into unifying functionalities across APIs. Traditional unified APIs must make these subjective decisions for all their customers in a one-size-fits-all manner.
Nango lets you customize integrations & schemas, so you can make these subjective decisions for yourself. The result is a unified API that truly fits your business use case.
Still, some radically diverging API functionalities cannot be unified, which requires some additional API-specific logic to handle. This can be abstracted in our integration scripts, supported by our tooling, instead of living in your main code-base.
Unification should mean creating a single interface that seamlessly interacts with multiple underlying services without needing custom adaptations for each case.
The issue with allowing for customization is that it leads to fragmentation. This defeats the purpose of having a unified API in the first place.
I'm not sure whether the convenience of unifying leftover common functionalities like authentication outweighs the complexity and reliance introduced by adding another layer to the tech stack.
In practice, most customers we serve have use cases that could not be supported by traditional unified APIs, but are still better off not rebuilding an integration infrastructure from scratch.
We also offer professional services to outsource the customization, so you still have an off-the-shelf unified API, but specific to your company.
I'd be happy to join the Slack and chat.
[1] https://github.com/NangoHQ/nango/issues/900
If you like Nango, you'd love us! ;)