Skip to content

Phase 12: GraphQL API for modern queries #22

@rianjs

Description

@rianjs

Overview

Add GraphQL API support for modern, flexible queries and mutations. The GraphQL API provides efficient data retrieval with field-level control and is fully GA as of Spring '26.

Parent issue: #17

12.1 GraphQL Client

Item Title Description
12.1.1 GraphQL client api/graphql/ package
12.1.2 Query execution Execute GraphQL queries
12.1.3 Mutations Create/update/delete via GraphQL
12.1.4 Introspection Schema discovery

Files:

  • api/graphql/client.go
  • api/graphql/types.go
  • api/graphql/*_test.go

Key Types:

type GraphQLRequest struct {
    Query     string                 `json:"query"`
    Variables map[string]interface{} `json:"variables,omitempty"`
}

type GraphQLResponse struct {
    Data   json.RawMessage `json:"data"`
    Errors []GraphQLError  `json:"errors,omitempty"`
}

type GraphQLError struct {
    Message   string   `json:"message"`
    Locations []struct {
        Line   int `json:"line"`
        Column int `json:"column"`
    } `json:"locations,omitempty"`
    Path []interface{} `json:"path,omitempty"`
}

12.2 GraphQL Commands (sfdc graphql)

Item Command Description
12.2.1 sfdc graphql query Execute GraphQL query
12.2.2 sfdc graphql mutate Execute GraphQL mutation
12.2.3 sfdc graphql schema Show schema info

Query Command

# Inline query
sfdc graphql query '{ uiapi { query { Account { edges { node { Id Name { value } } } } } } }'

# From file
sfdc graphql query --file query.graphql

# With variables
sfdc graphql query --file query.graphql --var "id=001xx000003DGbYAAW"

# Output as JSON (default)
sfdc graphql query '...' -o json

Mutation Command

# Create record
sfdc graphql mutate '
mutation {
  uiapi {
    AccountCreate(input: { Account: { Name: "New Account" } }) {
      Record { Id Name { value } }
    }
  }
}'

# From file
sfdc graphql mutate --file mutation.graphql

# With variables
sfdc graphql mutate --file mutation.graphql --var "name=Acme Corp"

Schema Command

# Get schema for object
sfdc graphql schema --type Account

# List available types
sfdc graphql schema --list

# Full introspection
sfdc graphql schema --introspect

Files:

  • internal/cmd/graphqlcmd/graphql.go
  • internal/cmd/graphqlcmd/query.go
  • internal/cmd/graphqlcmd/mutate.go
  • internal/cmd/graphqlcmd/schema.go
  • internal/cmd/graphqlcmd/*_test.go

API Endpoint

POST /services/data/v62.0/graphql
Content-Type: application/json

{
  "query": "...",
  "variables": {...}
}

Example Queries

Query Records

query {
  uiapi {
    query {
      Account(first: 10) {
        edges {
          node {
            Id
            Name { value }
            Industry { value }
            Phone { value }
          }
        }
      }
    }
  }
}

Query with Filter

query {
  uiapi {
    query {
      Account(where: { Industry: { eq: "Technology" } }, first: 5) {
        edges {
          node {
            Id
            Name { value }
          }
        }
      }
    }
  }
}

Create Record (Mutation)

mutation {
  uiapi {
    AccountCreate(input: {
      Account: {
        Name: "New Account"
        Industry: "Technology"
      }
    }) {
      Record {
        Id
        Name { value }
      }
    }
  }
}

Update Record (Mutation)

mutation {
  uiapi {
    AccountUpdate(input: {
      Id: "001xx000003DGbYAAW"
      Account: {
        Phone: "555-1234"
      }
    }) {
      Record {
        Id
        Phone { value }
      }
    }
  }
}

Verification

# Simple query
sfdc graphql query '{ uiapi { query { Account(first: 3) { edges { node { Id Name { value } } } } } } }'

# Query from file
echo '{ uiapi { query { Account(first: 3) { edges { node { Id Name { value } } } } } } }' > test.graphql
sfdc graphql query --file test.graphql

# Schema introspection
sfdc graphql schema --type Account

Notes

  • GraphQL API uses the uiapi namespace for UI API queries
  • Field values are wrapped in { value } for nullable fields
  • Pagination uses first, after, last, before arguments
  • Filtering uses where with comparison operators
  • Mutations follow the pattern {Object}Create, {Object}Update, {Object}Delete

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions