Over the past year at FullContact, the DevOps team has transitioned into an SRE team, and we couldn’t be happier. Our DevOps team functioned like many other DevOps teams and matched well with a sentiment I hear from fellow attendees at every DevOps-oriented conference I’ve attended, from DevOps Days to KubeCon. “DevOps is just a rebranded SysAdmin/Ops person….”

We primarily handled infrastructure and tooling like CI/CD to make the developers’ lives more efficient and productive. But we still operated apart from our teams, disconnected and sometimes clashing with work other teams had planned.

In my mind, DevOps is a culture…


One of the benefits of cloud computing is the ease with which engineers can spin up infrastructure and achieve business goals rapidly. It’s also one of the shortcomings, especially when cloud providers make pricing confusing to understand as your start to use more and more services. The ability to spin up resource waste in seconds with a single `terraform apply` or button press is a battle every company has, whether they acknowledge it or not. Some companies are even creating dedicated roles and teams to control cloud costs.

I believe concepts like DevOps and FinOps are primarily cultural challenges. In…


In 2020, FullContact launched our Resolve product, backed by Cassandra. Initially, we were super eager to move from our historical database HBase to Cassandra with its promises for scalability, high availability, and low latency on commodity hardware. However, we were never able to run our internal workloads as fast as we wanted — Cassandra just didn’t seem to live up to expectations. Early on, we had a testing goal of hitting 1000 queries per second, and then soon after 10x-ing that to 10,000 queries per second through the API. …


In this blog, we’ll explore the backend processes and architecture that power Resolve while discussing some challenges we faced along the way.

When designing FullContact’s newest product, Resolve, we borrowed several concepts from our Enrich platform and adapted them to support key differences between the two products.

Our existing enrichment platform, which primarily serves read-only data, uses HBase as its primary data store. A common task automated through Airflow when new datasets are periodically ingested or refreshed internally is to completely rebuild the HBase cluster from the underlying data by generating HFiles via EMR and creating a new read-only database…


Identity Resolution is core to everything FullContact does. For the Identity Resolution team, that means translating contact fragments from multiple sources into a unique identifier for a person. Customers may also have various contact information for their customers including names, addresses, emails, phone numbers, and more. Using one or all of these elements, we aim to identify the person that contact represents.

Early versions of our Identity Resolution system worked primarily based on the exact matching of individual contact fields, which were then combined into a final matching score. Such an approach works fairly well with fields like email addresses…


At FullContact, engineers have the opportunity to solve the unique and challenging problems created by a growing Identity Resolution Business. The start to any good solution is researching the tools your team is familiar with, along with the vast array of solutions out in the open-source world. This blog will outline our use of Apache Kafka and Druid and how we added Kafka Streams to the stack in order to solve a new problem.

The Problem

FullContact needs to keep track of every API call and response that a customer makes, along with the types of data returned in each response. This…


We recently decided to explore rewriting the FullContact API documentation. One of the primary goals of this project was to see if we could accomplish this using our existing component library, which would allow us to incorporate any kind of functionality we want beyond the standard, static HTML documentation we have had in the past. An additional requirement of the project was that the documentation would be generated via markdown, so that changes wouldn’t have to be made directly by the engineering team.

The Foundation

The current front-end stack at FullContact relies heavily on ClojureScript, and our component library is…


The following is the fourth and final installment of a multi-part series offering a glimpse of the behind-the-scenes advancements we achieved to deliver our Resolve API. The first post covered the origin of our Identity Graph and Resolve API. In the second post, we delved into the power of our new persistent PersonID and the ability to Bring Your Own ID. The third post focused on building customer trust through security capabilities.

Part 4: Being API First and Choosing Our Bedrock

As any structural engineer will tell you, having the proper foundation to build from is paramount to the success of a project. …


The following is the third installment of a multi-part series offering a glimpse of the behind-the-scenes advancements we achieved to deliver our Resolve API. The first post covered the origin of our Identity Graph and Resolve API, and in the second post we delved into the power of our new persistent PersonId and the ability to Bring Your Own ID.

Part 3: Building Trust Through Security

To properly support our customers in this new era of privacy and security, we went back to the drawing board to invent new systems and patterns designed to maximize security around our customers’ data. …


The following is the second installment of a multi-part series offering a glimpse of the behind-the-scenes advancements we achieved to deliver our Resolve API. You can find the first post, covering the origin of our Identity Graph and Resolve API, here.

Part 2: It’s a Party, BYOID!

To support the customization on the graph for each customer, we introduced two new concepts with our Resolve API — PersonID and Record ID. Both of which required some deep thinking around security and efficiency. We didn’t want hackable IDs, but we didn’t want unwieldy sized IDs either.

The PersonID (PID) is our version of a unique ID for…

FullContact Technology Blog

Detailing our technical journey to building a world-class Identity Resolution platform.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store