Skip to content

Includes sparse fieldsets

Includes & Sparse Fieldsets

When to Use

Includes: Fetch related entities in a single request (compound documents). Reduces HTTP round trips.

Sparse Fieldsets: Request only needed fields. Reduces response size and processing time.

Decision

Scenario Use Includes? Use Sparse Fieldsets?
Article with author name Yes: ?include=uid Yes: ?fields[user--user]=name
Blog listing (title only) No Yes: ?fields[node--article]=title
Article with tags and images Yes: ?include=field_tags,field_image Optional
Mobile app (bandwidth concern) Selective Yes (critical)
Full entity needed Optional No
Deeply nested relationships Yes: ?include=uid.user_picture Yes

Pattern

Include single relationship:

# Get article with author
GET /jsonapi/node/article/{uuid}?include=uid

Response includes author in included array:

{
  "data": {
    "type": "node--article",
    "id": "uuid",
    "relationships": {
      "uid": { "data": { "type": "user--user", "id": "user-uuid" } }
    }
  },
  "included": [{
    "type": "user--user",
    "id": "user-uuid",
    "attributes": { "name": "admin" }
  }]
}

Include multiple relationships:

GET /jsonapi/node/article?include=uid,field_image,field_tags

Nested includes (relationship of relationship):

# Include author and author's profile picture
GET /jsonapi/node/article?include=uid.user_picture

Sparse fieldsets on main resource:

# Only return title and created date
GET /jsonapi/node/article?fields[node--article]=title,created

Sparse fieldsets on included resources:

# Include author but only their name and email
GET /jsonapi/node/article?include=uid&fields[user--user]=name,mail

Combined (includes + sparse fieldsets):

# Article title, author name, image URI
GET /jsonapi/node/article?include=uid,field_image&fields[node--article]=title,uid,field_image&fields[user--user]=name&fields[file--file]=uri

Common Mistakes

Including relationships not needed: Over-inclusion increases response size dramatically. WHY: Each included entity adds significant data. Only include what's rendered.

Not using sparse fieldsets with includes: Including a user pulls ALL user fields. WHY: Default behavior is full entity. Combine with ?fields[user--user]=name to limit.

Requesting relationship field without include: Relationships in data only contain type/id references. WHY: To get actual data, must use ?include=field_name.

Deeply nesting includes beyond 2 levels: ?include=uid.user_picture.field_media may fail or timeout. WHY: Performance degrades with nesting. Limit to 1-2 levels max.

Forgetting type prefix in sparse fieldsets: It's ?fields[node--article]=title, not ?fields=title. WHY: Must specify resource type since response can include multiple types.

See Also