Here's your chance to speak at GraphQL Summit in New York City, October 8 - 10, 2024! 🏙️ Submit your proposal by May 31.
Launch GraphOS Studio

Fragments in Apollo Kotlin

Note: This article describes the behavior of when using the default operationBased codegen in . For the responseBased codegen, see this page.

Apollo Kotlin supports both forms of GraphQL fragments:

Named fragments

Take a look at the following definitions:

# Declaration of named fragment
fragment launchFragment on Launch {
mission {
query LaunchDetails($id:ID!) {
launch(id: $id) {
# Usage of named fragment

Based on the fragment definition, Apollo Kotlin generates the following LaunchFragment class that you can reuse in different queries:

data class LaunchFragment(
val id: String,
val site: String?,
val mission: Mission?

Generated models for that use this have a .launchFragment property for accessing the fragment's fields:

println("Mission site: ${launch.launchFragment?.site}")

The launchFragment property is null if the returned object is not a Launch.

You can reuse the fragment in any number of operations:

# ...previous definitions...
query LaunchList {
launches {
launches {

You can even use a fragment in operations that are defined in a different .graphql file from the fragment itself. This is because Apollo Kotlin codegen merges all .graphql files in to a single file before generating models.

Inline fragments

Take a look at this definition that uses two inline fragments:

query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
... on Droid {
... on Human {

For this operation, Apollo Kotlin generates a Hero class that contains OnDroid and OnHuman nested classes. Hero also includes onDroid and onHuman fields that enable you to access fields that are specific to Droid and Human:

println("Droid primaryFunction: ${hero.onDroid?.primaryFunction}")
println("Human height: ${hero.onHuman?.height}")

These on<ShapeName> fields (onDroid and onHuman) are null if the returned object is not the corresponding type.

Custom scalars
@defer support (experimental)
Edit on GitHubEditForumsDiscord

© 2024 Apollo Graph Inc.

Privacy Policy