Rye’s GraphQL bet: Making online commerce integrations suck less

Sophia Willows

Head of Engineering @ Rye

September 4, 2024

8 minutes

At Rye, we’re on a mission to make commerce integrations less painful. We’ve all been there - wrestling with poorly designed APIs, inconsistent data models, and documentation that reads like a cryptic tome from the dark ages. It’s a nightmare, and it holds back innovation in any space - whether it commerce, payments, whatever. So why did we choose GraphQL over REST? It’s not the most mainstream choice, but we believe it’s the right tool for the job. Let’s dive in.

Variants of software complexity

There’s no shortage of thought leadership on the internet when it comes to the debate between REST and GraphQL. Much of it is also—regrettably—not very nuanced, and generally unhelpful for anyone trying to make a considered decision on their API layer technology.

Superficially, it is true that REST is simpler than GraphQL. There’s no schema language, no type system, and no need to “think in graphs.” Anyone can spin up a barebones REST endpoint using nothing more than the Node.js standard library in about 15 minutes, and the same is not true for GraphQL.

If this is the lens through which you judge these two technologies, then you will naturally come away feeling skeptical of GraphQL. You would likely come away thinking that GraphQL is over-engineered, unnecessarily complex, and a waste of time. Why bother with all the ceremony when REST is so straightforward?

In our experience, the choice between REST and GraphQL is a bit more nuanced than this. What we have found while building out our API is that there are—broadly speaking—two different kinds of complexity, and these two options optimize for each differently.

There’s no shortage of thought leadership on the internet when it comes to the debate between REST and GraphQL. Much of it is also—regrettably—not very nuanced, and generally unhelpful for anyone trying to make a considered decision on their API layer technology.

Superficially, it is true that REST is simpler than GraphQL. There’s no schema language, no type system, and no need to “think in graphs.” Anyone can spin up a barebones REST endpoint using nothing more than the Node.js standard library in about 15 minutes, and the same is not true for GraphQL.

If this is the lens through which you judge these two technologies, then you will naturally come away feeling skeptical of GraphQL. You would likely come away thinking that GraphQL is over-engineered, unnecessarily complex, and a waste of time. Why bother with all the ceremony when REST is so straightforward?

In our experience, the choice between REST and GraphQL is a bit more nuanced than this. What we have found while building out our API is that there are—broadly speaking—two different kinds of complexity, and these two options optimize for each differently.

There’s no shortage of thought leadership on the internet when it comes to the debate between REST and GraphQL. Much of it is also—regrettably—not very nuanced, and generally unhelpful for anyone trying to make a considered decision on their API layer technology.

Superficially, it is true that REST is simpler than GraphQL. There’s no schema language, no type system, and no need to “think in graphs.” Anyone can spin up a barebones REST endpoint using nothing more than the Node.js standard library in about 15 minutes, and the same is not true for GraphQL.

If this is the lens through which you judge these two technologies, then you will naturally come away feeling skeptical of GraphQL. You would likely come away thinking that GraphQL is over-engineered, unnecessarily complex, and a waste of time. Why bother with all the ceremony when REST is so straightforward?

In our experience, the choice between REST and GraphQL is a bit more nuanced than this. What we have found while building out our API is that there are—broadly speaking—two different kinds of complexity, and these two options optimize for each differently.

Internal complexity

Firstly, there is internal complexity. This is the kind of complexity that software engineers run into every single day at work. It’s the friction you directly feel while designing, implementing, and maintaining your codebase.

REST creates very little internal complexity. While best practices and conventions do exist for REST APIs, there is absolutely nothing enforcing them. Engineers are free to design REST APIs however they please, and any guardrails or constraints are opt-in. Spinning up endpoints is trivially easy, and building a REST API generally has very little upfront cost.

GraphQL, in contrast, creates a lot of internal complexity. The most obvious example of this is how you are forced to model your data upfront using its schema definition language, but there are many other examples of how GraphQL creates internal complexity for engineering teams. On this dimension, REST and GraphQL sit at opposite ends of the spectrum.

Because internal complexity is felt so intimately by engineers, we have a tendency to index on it. It’s natural to focus on the challenges we face day-to-day, so they often become primary factors in our decision-making. Many “GraphQL vs REST” posts are deeply rooted in this focus on internal complexity.

External complexity

But there’s more to the discussion than just internal complexity. There is also external complexity, which refers to the challenges faced by the clients or consumers of your API.

This is where GraphQL shines. Defining a rigid schema upfront might be a frustrating exercise for your engineering team, but it makes consumers’ lives much easier. Features such as codegen, introspection, playgrounds, and more are all possible because of the existence of the GraphQL schema.

It’s a very different story for REST. The lack of standardization and guardrails means that every REST API is a snowflake with unique behavior that developers need to learn per API.

My favorite example of this in action is Dropbox’s file upload API endpoint which has you upload your file’s content as a multipart form, and has you provide all of your API parameters as a stringified JSON object inside a special Dropbox-API-Arg header. I’ve never seen this particular design pattern in any other RESTful API, and oddities like this are commonplace. When there is no standardization, API developers just end up reinventing the wheel:

  • Basic concepts like the shape of an error are completely unspecified, and up to the API vendor to invent.

  • Documentation standards vary wildly, as there is no well-defined type system for REST APIs.

  • Eventually, you run into problems with over-fetching or under-fetching data. Do you favor Canvas’ choice of an include parameter or Stripe’s choice of an expand parameter?

  • There are multiple different API versioning schemes for REST.

  • We’re told that PUT is the correct verb for updating a REST resource, but Stripe and Twilio use POST instead.

  • While it’s generally safe to assume that REST APIs deal in JSON, this isn’t guaranteed.

All of the above are solved problems in GraphQL. The combination of a rigid specification, rich tooling ecosystem, and standardization completely obviate the need for thinking about table stakes concerns like the ones noted above.

This is the accidental complexity trap of REST. Integrating with REST APIs as a third-party developer is error-prone and inevitably requires heavy upfront technical due diligence to figure out how things work.

The external complexity of REST is high, and API companies like us live and die by how easy our APIs are to use. External complexity is top of mind for us whenever we make technical decisions, and we’re generally less concerned about internal complexity.

This internal vs. external complexity tradeoff is REST’s accidental complexity trap. It’s largely invisible to API designers because all of the hard bits end up thrown over the fence for external developers to deal with, and developers themselves are used to the status quo of APIs being hard to integrate.

But there’s more to the discussion than just internal complexity. There is also external complexity, which refers to the challenges faced by the clients or consumers of your API.

This is where GraphQL shines. Defining a rigid schema upfront might be a frustrating exercise for your engineering team, but it makes consumers’ lives much easier. Features such as codegen, introspection, playgrounds, and more are all possible because of the existence of the GraphQL schema.

It’s a very different story for REST. The lack of standardization and guardrails means that every REST API is a snowflake with unique behavior that developers need to learn per API.

My favorite example of this in action is Dropbox’s file upload API endpoint which has you upload your file’s content as a multipart form, and has you provide all of your API parameters as a stringified JSON object inside a special Dropbox-API-Arg header. I’ve never seen this particular design pattern in any other RESTful API, and oddities like this are commonplace. When there is no standardization, API developers just end up reinventing the wheel:

  • Basic concepts like the shape of an error are completely unspecified, and up to the API vendor to invent.

  • Documentation standards vary wildly, as there is no well-defined type system for REST APIs.

  • Eventually, you run into problems with over-fetching or under-fetching data. Do you favor Canvas’ choice of an include parameter or Stripe’s choice of an expand parameter?

  • There are multiple different API versioning schemes for REST.

  • We’re told that PUT is the correct verb for updating a REST resource, but Stripe and Twilio use POST instead.

  • While it’s generally safe to assume that REST APIs deal in JSON, this isn’t guaranteed.

All of the above are solved problems in GraphQL. The combination of a rigid specification, rich tooling ecosystem, and standardization completely obviate the need for thinking about table stakes concerns like the ones noted above.

This is the accidental complexity trap of REST. Integrating with REST APIs as a third-party developer is error-prone and inevitably requires heavy upfront technical due diligence to figure out how things work.

The external complexity of REST is high, and API companies like us live and die by how easy our APIs are to use. External complexity is top of mind for us whenever we make technical decisions, and we’re generally less concerned about internal complexity.

This internal vs. external complexity tradeoff is REST’s accidental complexity trap. It’s largely invisible to API designers because all of the hard bits end up thrown over the fence for external developers to deal with, and developers themselves are used to the status quo of APIs being hard to integrate.

But there’s more to the discussion than just internal complexity. There is also external complexity, which refers to the challenges faced by the clients or consumers of your API.

This is where GraphQL shines. Defining a rigid schema upfront might be a frustrating exercise for your engineering team, but it makes consumers’ lives much easier. Features such as codegen, introspection, playgrounds, and more are all possible because of the existence of the GraphQL schema.

It’s a very different story for REST. The lack of standardization and guardrails means that every REST API is a snowflake with unique behavior that developers need to learn per API.

My favorite example of this in action is Dropbox’s file upload API endpoint which has you upload your file’s content as a multipart form, and has you provide all of your API parameters as a stringified JSON object inside a special Dropbox-API-Arg header. I’ve never seen this particular design pattern in any other RESTful API, and oddities like this are commonplace. When there is no standardization, API developers just end up reinventing the wheel:

  • Basic concepts like the shape of an error are completely unspecified, and up to the API vendor to invent.

  • Documentation standards vary wildly, as there is no well-defined type system for REST APIs.

  • Eventually, you run into problems with over-fetching or under-fetching data. Do you favor Canvas’ choice of an include parameter or Stripe’s choice of an expand parameter?

  • There are multiple different API versioning schemes for REST.

  • We’re told that PUT is the correct verb for updating a REST resource, but Stripe and Twilio use POST instead.

  • While it’s generally safe to assume that REST APIs deal in JSON, this isn’t guaranteed.

All of the above are solved problems in GraphQL. The combination of a rigid specification, rich tooling ecosystem, and standardization completely obviate the need for thinking about table stakes concerns like the ones noted above.

This is the accidental complexity trap of REST. Integrating with REST APIs as a third-party developer is error-prone and inevitably requires heavy upfront technical due diligence to figure out how things work.

The external complexity of REST is high, and API companies like us live and die by how easy our APIs are to use. External complexity is top of mind for us whenever we make technical decisions, and we’re generally less concerned about internal complexity.

This internal vs. external complexity tradeoff is REST’s accidental complexity trap. It’s largely invisible to API designers because all of the hard bits end up thrown over the fence for external developers to deal with, and developers themselves are used to the status quo of APIs being hard to integrate.

The external benefits of GraphQL

While we eat some internal complexity for choosing GraphQL, it makes our developers’ lives much better. We’ve had developers who’ve never used GraphQL before run through our getting started guide in only an afternoon, and that’s in large part due to the excellent developer experience offered by GraphQL.

Let’s start from the beginning. Imagine that I want to list out all of Alo Yoga’s products using Rye’s API, and I accidentally typo the title field as titel. I’ll get the following error back:

Not only do I know exactly where the error originates from, but the GraphQL server is also smart enough to suggest a fix for my problem. Great error messages like this one are a massive accelerant for developers who are onboarding to our API, and aren’t quite yet experts on our offering.

Once I’ve fixed my typo, I can then use code generation to automatically generate types for each query in my language of choice. GraphQL code generators work directly against the schema, so I know that the output will always be correct. It’s impossible for the schema to drift from the actual API implementation, which is very different from the REST world where there’s no forcing function for keeping OpenAPI specs up to date.

There’s a lot of great, open source tooling around GraphQL schemas. Inside the Rye Console we ship GraphiQL, which acts as a sandbox for developers to play with our API. GraphiQL is incredibly robust, and because we’re using GraphQL we get it for free. Not having to build out our own API sandbox and keep it up to date with new API features means our small engineering team has more time to focus on the parts of our product which really matter.

How about if you wanted to then fetch all of the reviews for those products? REST endpoints are all-or-nothing, which means API designers need to be careful when deciding what fields to include in a response payload. If developers only need reviews 5% of the time, then it probably won’t make sense for the API designer to eagerly load reviews whenever a product is retrieved. Waterfalled API requests are commonplace when integrating with REST APIs because it simply isn’t possible to design endpoints which satisfy all possible integration stories.

In GraphQL, developers are responsible for specifically requesting the exact set of fields they require. Developers who don’t care for having reviews can request just the product data, and developers who do want the reviews can request them alongside the product data in a single API request. Everybody wins with this approach, and because there are no waterfalled requests the end user experience remains smooth.

Deprecating changes also becomes much easier when we know which developers are requesting each field in our API. When we needed to remove our old productsByDomain query in favor of productsByDomainV2, we were able to make contact with the specific developers using the deprecated query and encourage them to migrate. If we were building a REST API we would have had to send out a mass email to everyone, and degrade our communications’ signal:noise ratio.

Could you build all these things in-house on top of your REST API? Sure. But it would be a huge undertaking.

While we eat some internal complexity for choosing GraphQL, it makes our developers’ lives much better. We’ve had developers who’ve never used GraphQL before run through our getting started guide in only an afternoon, and that’s in large part due to the excellent developer experience offered by GraphQL.

Let’s start from the beginning. Imagine that I want to list out all of Alo Yoga’s products using Rye’s API, and I accidentally typo the title field as titel. I’ll get the following error back:

Not only do I know exactly where the error originates from, but the GraphQL server is also smart enough to suggest a fix for my problem. Great error messages like this one are a massive accelerant for developers who are onboarding to our API, and aren’t quite yet experts on our offering.

Once I’ve fixed my typo, I can then use code generation to automatically generate types for each query in my language of choice. GraphQL code generators work directly against the schema, so I know that the output will always be correct. It’s impossible for the schema to drift from the actual API implementation, which is very different from the REST world where there’s no forcing function for keeping OpenAPI specs up to date.

There’s a lot of great, open source tooling around GraphQL schemas. Inside the Rye Console we ship GraphiQL, which acts as a sandbox for developers to play with our API. GraphiQL is incredibly robust, and because we’re using GraphQL we get it for free. Not having to build out our own API sandbox and keep it up to date with new API features means our small engineering team has more time to focus on the parts of our product which really matter.

How about if you wanted to then fetch all of the reviews for those products? REST endpoints are all-or-nothing, which means API designers need to be careful when deciding what fields to include in a response payload. If developers only need reviews 5% of the time, then it probably won’t make sense for the API designer to eagerly load reviews whenever a product is retrieved. Waterfalled API requests are commonplace when integrating with REST APIs because it simply isn’t possible to design endpoints which satisfy all possible integration stories.

In GraphQL, developers are responsible for specifically requesting the exact set of fields they require. Developers who don’t care for having reviews can request just the product data, and developers who do want the reviews can request them alongside the product data in a single API request. Everybody wins with this approach, and because there are no waterfalled requests the end user experience remains smooth.

Deprecating changes also becomes much easier when we know which developers are requesting each field in our API. When we needed to remove our old productsByDomain query in favor of productsByDomainV2, we were able to make contact with the specific developers using the deprecated query and encourage them to migrate. If we were building a REST API we would have had to send out a mass email to everyone, and degrade our communications’ signal:noise ratio.

Could you build all these things in-house on top of your REST API? Sure. But it would be a huge undertaking.

While we eat some internal complexity for choosing GraphQL, it makes our developers’ lives much better. We’ve had developers who’ve never used GraphQL before run through our getting started guide in only an afternoon, and that’s in large part due to the excellent developer experience offered by GraphQL.

Let’s start from the beginning. Imagine that I want to list out all of Alo Yoga’s products using Rye’s API, and I accidentally typo the title field as titel. I’ll get the following error back:

Not only do I know exactly where the error originates from, but the GraphQL server is also smart enough to suggest a fix for my problem. Great error messages like this one are a massive accelerant for developers who are onboarding to our API, and aren’t quite yet experts on our offering.

Once I’ve fixed my typo, I can then use code generation to automatically generate types for each query in my language of choice. GraphQL code generators work directly against the schema, so I know that the output will always be correct. It’s impossible for the schema to drift from the actual API implementation, which is very different from the REST world where there’s no forcing function for keeping OpenAPI specs up to date.

There’s a lot of great, open source tooling around GraphQL schemas. Inside the Rye Console we ship GraphiQL, which acts as a sandbox for developers to play with our API. GraphiQL is incredibly robust, and because we’re using GraphQL we get it for free. Not having to build out our own API sandbox and keep it up to date with new API features means our small engineering team has more time to focus on the parts of our product which really matter.

How about if you wanted to then fetch all of the reviews for those products? REST endpoints are all-or-nothing, which means API designers need to be careful when deciding what fields to include in a response payload. If developers only need reviews 5% of the time, then it probably won’t make sense for the API designer to eagerly load reviews whenever a product is retrieved. Waterfalled API requests are commonplace when integrating with REST APIs because it simply isn’t possible to design endpoints which satisfy all possible integration stories.

In GraphQL, developers are responsible for specifically requesting the exact set of fields they require. Developers who don’t care for having reviews can request just the product data, and developers who do want the reviews can request them alongside the product data in a single API request. Everybody wins with this approach, and because there are no waterfalled requests the end user experience remains smooth.

Deprecating changes also becomes much easier when we know which developers are requesting each field in our API. When we needed to remove our old productsByDomain query in favor of productsByDomainV2, we were able to make contact with the specific developers using the deprecated query and encourage them to migrate. If we were building a REST API we would have had to send out a mass email to everyone, and degrade our communications’ signal:noise ratio.

Could you build all these things in-house on top of your REST API? Sure. But it would be a huge undertaking.

Taming GraphQL’s internal complexity

While we love the benefits GraphQL gives developers building with Rye APIs, it obviously doesn’t come for free. We spend a fair bit of engineering brainpower solving problems that are unique to GraphQL.

Consider how GraphQL supports client-driven data fetching. If you’re consuming a GraphQL API then this feels great because you don’t waste bandwidth over-fetching. If you’re producing that GraphQL API, though, then client-driven data fetching creates problems for you. A very large and complicated GraphQL query can easily take down a naively designed GraphQL API.

Technical challenges like N+1 queries, per-field authorization, caching difficulties, and the performance overhead of GraphQL’s type system are all well understood technical challenges that have been described in great detail elsewhere. Any engineering team that starts building a GraphQL service has plenty of communal knowledge to lean on, and is going into the project with their eyes wide open.

There’s no magic bullet for these issues, but we’re meeting them head-on with a combination of best practices, clever engineering, and domain-specific optimizations. It’s an ongoing battle but one we’re committed to fighting. We are continuously working on refining our engineering practices as we learn more from operating the Rye API. Recent learnings from us include the importance of so-called connected data loaders to improve cache hit rates.

We’re also not dogmatic about any one technology. While we generally like GraphQL and lean on it heavily for our public API, it’s also just one tool in our box among many others. We use other solutions (including REST!) where it makes sense to do so, and we’re always reassessing as our scale and needs grow.

While we love the benefits GraphQL gives developers building with Rye APIs, it obviously doesn’t come for free. We spend a fair bit of engineering brainpower solving problems that are unique to GraphQL.

Consider how GraphQL supports client-driven data fetching. If you’re consuming a GraphQL API then this feels great because you don’t waste bandwidth over-fetching. If you’re producing that GraphQL API, though, then client-driven data fetching creates problems for you. A very large and complicated GraphQL query can easily take down a naively designed GraphQL API.

Technical challenges like N+1 queries, per-field authorization, caching difficulties, and the performance overhead of GraphQL’s type system are all well understood technical challenges that have been described in great detail elsewhere. Any engineering team that starts building a GraphQL service has plenty of communal knowledge to lean on, and is going into the project with their eyes wide open.

There’s no magic bullet for these issues, but we’re meeting them head-on with a combination of best practices, clever engineering, and domain-specific optimizations. It’s an ongoing battle but one we’re committed to fighting. We are continuously working on refining our engineering practices as we learn more from operating the Rye API. Recent learnings from us include the importance of so-called connected data loaders to improve cache hit rates.

We’re also not dogmatic about any one technology. While we generally like GraphQL and lean on it heavily for our public API, it’s also just one tool in our box among many others. We use other solutions (including REST!) where it makes sense to do so, and we’re always reassessing as our scale and needs grow.

While we love the benefits GraphQL gives developers building with Rye APIs, it obviously doesn’t come for free. We spend a fair bit of engineering brainpower solving problems that are unique to GraphQL.

Consider how GraphQL supports client-driven data fetching. If you’re consuming a GraphQL API then this feels great because you don’t waste bandwidth over-fetching. If you’re producing that GraphQL API, though, then client-driven data fetching creates problems for you. A very large and complicated GraphQL query can easily take down a naively designed GraphQL API.

Technical challenges like N+1 queries, per-field authorization, caching difficulties, and the performance overhead of GraphQL’s type system are all well understood technical challenges that have been described in great detail elsewhere. Any engineering team that starts building a GraphQL service has plenty of communal knowledge to lean on, and is going into the project with their eyes wide open.

There’s no magic bullet for these issues, but we’re meeting them head-on with a combination of best practices, clever engineering, and domain-specific optimizations. It’s an ongoing battle but one we’re committed to fighting. We are continuously working on refining our engineering practices as we learn more from operating the Rye API. Recent learnings from us include the importance of so-called connected data loaders to improve cache hit rates.

We’re also not dogmatic about any one technology. While we generally like GraphQL and lean on it heavily for our public API, it’s also just one tool in our box among many others. We use other solutions (including REST!) where it makes sense to do so, and we’re always reassessing as our scale and needs grow.

Is GraphQL right for you?

There are no free lunches in software engineering. All technical decisions come with tradeoffs, and the role of a software engineer is to carefully thread the needle between competing concerns to find the most suitable solution for a given problem. Choosing a solution for your API layer is no different.

Rye is an API startup. We build and ship a single API that is used by thousands of developers to push the edge of what’s possible in ecommerce. If a technology choice makes our job 10% harder, but makes our API 1% better for our developers then we will always take that tradeoff.

In any situation where there’s one implementation and many consumers of that implementation it makes sense to push complexity into the implementation and out of the consumers. Rye is firmly in this boat, and most other API companies are as well. GraphQL can be a pretty compelling option in this case.

On the other hand, not all companies are shipping their API as a product. A typical SaaS business shipping a web app with a private API is in a very different position from us. There’s only a single—or otherwise very few—consumers of the API, and the business in question controls both the consumer and API implementation. Teams working in this context will likely be better served optimizing for their internal developer experience, and REST may very well be the more appropriate choice.

Ultimately, the decision to use GraphQL should be based on a thorough evaluation of your project’s needs, your team’s expertise, and the long-term maintenance implications.

There are no free lunches in software engineering. All technical decisions come with tradeoffs, and the role of a software engineer is to carefully thread the needle between competing concerns to find the most suitable solution for a given problem. Choosing a solution for your API layer is no different.

Rye is an API startup. We build and ship a single API that is used by thousands of developers to push the edge of what’s possible in ecommerce. If a technology choice makes our job 10% harder, but makes our API 1% better for our developers then we will always take that tradeoff.

In any situation where there’s one implementation and many consumers of that implementation it makes sense to push complexity into the implementation and out of the consumers. Rye is firmly in this boat, and most other API companies are as well. GraphQL can be a pretty compelling option in this case.

On the other hand, not all companies are shipping their API as a product. A typical SaaS business shipping a web app with a private API is in a very different position from us. There’s only a single—or otherwise very few—consumers of the API, and the business in question controls both the consumer and API implementation. Teams working in this context will likely be better served optimizing for their internal developer experience, and REST may very well be the more appropriate choice.

Ultimately, the decision to use GraphQL should be based on a thorough evaluation of your project’s needs, your team’s expertise, and the long-term maintenance implications.

There are no free lunches in software engineering. All technical decisions come with tradeoffs, and the role of a software engineer is to carefully thread the needle between competing concerns to find the most suitable solution for a given problem. Choosing a solution for your API layer is no different.

Rye is an API startup. We build and ship a single API that is used by thousands of developers to push the edge of what’s possible in ecommerce. If a technology choice makes our job 10% harder, but makes our API 1% better for our developers then we will always take that tradeoff.

In any situation where there’s one implementation and many consumers of that implementation it makes sense to push complexity into the implementation and out of the consumers. Rye is firmly in this boat, and most other API companies are as well. GraphQL can be a pretty compelling option in this case.

On the other hand, not all companies are shipping their API as a product. A typical SaaS business shipping a web app with a private API is in a very different position from us. There’s only a single—or otherwise very few—consumers of the API, and the business in question controls both the consumer and API implementation. Teams working in this context will likely be better served optimizing for their internal developer experience, and REST may very well be the more appropriate choice.

Ultimately, the decision to use GraphQL should be based on a thorough evaluation of your project’s needs, your team’s expertise, and the long-term maintenance implications.

Conclusion

GraphQL is a core part of Rye’s technical strategy. Its flexibility, client-driven architecture, and rich tooling set it apart from REST. Most importantly, it lets us focus relentlessly on the developer experience.

We’re at the start of a GraphQL revolution in eCommerce. The future belongs to platforms that empower devs to innovate and ship fast. With our GraphQL-first approach, Rye is leading the charge.

We can’t wait to see what you’ll build.

GraphQL is a core part of Rye’s technical strategy. Its flexibility, client-driven architecture, and rich tooling set it apart from REST. Most importantly, it lets us focus relentlessly on the developer experience.

We’re at the start of a GraphQL revolution in eCommerce. The future belongs to platforms that empower devs to innovate and ship fast. With our GraphQL-first approach, Rye is leading the charge.

We can’t wait to see what you’ll build.

GraphQL is a core part of Rye’s technical strategy. Its flexibility, client-driven architecture, and rich tooling set it apart from REST. Most importantly, it lets us focus relentlessly on the developer experience.

We’re at the start of a GraphQL revolution in eCommerce. The future belongs to platforms that empower devs to innovate and ship fast. With our GraphQL-first approach, Rye is leading the charge.

We can’t wait to see what you’ll build.

Accelerate your commerce operations

Accelerate your commerce operations

Accelerate your commerce operations