GraphQL API
MyAppAPI offers a powerful GraphQL API that provides a flexible and efficient way to interact with our platform. With GraphQL, you can request exactly the data you need, combine multiple resources in a single request, and take advantage of a strongly-typed schema.
Overview
GraphQL is a query language for APIs that enables clients to request exactly the data they need. Unlike our REST API, which uses multiple endpoints for different resources, our GraphQL API exposes a single endpoint:
https://api.myappapi.com/graphql
                    Key Benefits
Precise Data Fetching
Request only the data you need, reducing bandwidth usage and improving performance.
Reduced Network Requests
Combine multiple resources in a single request to minimize network round trips.
Strongly Typed Schema
Discover available data and operations through introspection, enabling better tooling and development experience.
API Evolution
Add new fields and types without versioning or breaking existing queries.
Note: Our GraphQL API complements rather than replaces our REST API. You can use whichever best fits your use case, or even combine both approaches.
Getting Started
To get started with our GraphQL API, you'll need:
- An API key or authentication token (see Authentication)
 - A GraphQL client or HTTP client capable of making POST requests
 
Your First Query
Here's a simple query to retrieve your user information:
{
  me {
    id
    name
    email
    createdAt
  }
}
                            curl -X POST 'https://api.myappapi.com/graphql' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "query": "{ me { id name email createdAt } }"
  }'
                            // Using fetch
const fetchUserData = async () => {
  const response = await fetch('https://api.myappapi.com/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer YOUR_API_KEY'
    },
    body: JSON.stringify({
      query: `{
        me {
          id
          name
          email
          createdAt
        }
      }`
    })
  });
  
  const { data } = await response.json();
  console.log(data);
};
fetchUserData();
                            import requests
url = 'https://api.myappapi.com/graphql'
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
}
query = """
{
  me {
    id
    name
    email
    createdAt
  }
}
"""
response = requests.post(url, json={'query': query}, headers=headers)
data = response.json()
print(data)
                            Response:
{
  "data": {
    "me": {
      "id": "usr_123456789",
      "name": "John Doe",
      "email": "[email protected]",
      "createdAt": "2025-01-15T08:30:00Z"
    }
  }
}
                    Schema
Our GraphQL schema defines the data types, queries, mutations, and subscriptions available in our API. You can explore the full schema using tools like GraphiQL or Apollo Studio.
Core Types
Here are some of the key types in our schema:
type User {
  id: ID!
  name: String!
  email: String!
  role: UserRole!
  resources: [Resource!]!
  webhooks: [Webhook!]!
  createdAt: DateTime!
  updatedAt: DateTime!
}
enum UserRole {
  ADMIN
  USER
  VIEWER
}
type Resource {
  id: ID!
  name: String!
  description: String
  owner: User!
  status: ResourceStatus!
  data: JSONObject
  createdAt: DateTime!
  updatedAt: DateTime!
}
enum ResourceStatus {
  ACTIVE
  ARCHIVED
  PENDING
}
type Webhook {
  id: ID!
  url: String!
  events: [WebhookEvent!]!
  user: User!
  createdAt: DateTime!
  updatedAt: DateTime!
}
enum WebhookEvent {
  RESOURCE_CREATED
  RESOURCE_UPDATED
  RESOURCE_DELETED
  USER_CREATED
  USER_UPDATED
}
type Event {
  id: ID!
  type: String!
  resourceId: ID
  data: JSONObject!
  createdAt: DateTime!
}
scalar DateTime
scalar JSONObject
                    Schema Introspection
GraphQL provides built-in introspection capabilities to explore and discover the schema. You can query the schema itself to understand available types, fields, and operations.
{
  __schema {
    types {
      name
      kind
      description
    }
  }
}
                    Queries
GraphQL queries allow you to retrieve data from our API. Our schema provides various root query fields to access different resources.
Available Queries
| Query | Description | Arguments | 
|---|---|---|
me | 
                                    Get the currently authenticated user | None | 
user(id: ID!) | 
                                    Get a user by ID | id: The ID of the user | 
                                
users(filter: UserFilter, pagination: PaginationInput) | 
                                    Get a list of users | 
                                        filter: Filter criteria for userspagination: Pagination options
                                     | 
                                
resource(id: ID!) | 
                                    Get a resource by ID | id: The ID of the resource | 
                                
resources(filter: ResourceFilter, pagination: PaginationInput) | 
                                    Get a list of resources | 
                                        filter: Filter criteria for resourcespagination: Pagination options
                                     | 
                                
webhook(id: ID!) | 
                                    Get a webhook by ID | id: The ID of the webhook | 
                                
webhooks(pagination: PaginationInput) | 
                                    Get a list of webhooks | pagination: Pagination options | 
                                
event(id: ID!) | 
                                    Get an event by ID | id: The ID of the event | 
                                
events(filter: EventFilter, pagination: PaginationInput) | 
                                    Get a list of events | 
                                        filter: Filter criteria for eventspagination: Pagination options
                                     | 
                                
Query Example: Fetching Resources with Their Owners
{
  resources(
    filter: { status: ACTIVE }
    pagination: { limit: 5, offset: 0 }
  ) {
    pageInfo {
      totalCount
      hasNextPage
    }
    edges {
      node {
        id
        name
        description
        status
        owner {
          id
          name
          email
        }
        createdAt
      }
    }
  }
}
                    Response:
{
  "data": {
    "resources": {
      "pageInfo": {
        "totalCount": 42,
        "hasNextPage": true
      },
      "edges": [
        {
          "node": {
            "id": "res_123456789",
            "name": "Project Alpha",
            "description": "A sample project",
            "status": "ACTIVE",
            "owner": {
              "id": "usr_123456789",
              "name": "John Doe",
              "email": "[email protected]"
            },
            "createdAt": "2025-01-15T08:30:00Z"
          }
        },
        {
          "node": {
            "id": "res_987654321",
            "name": "Project Beta",
            "description": "Another sample project",
            "status": "ACTIVE",
            "owner": {
              "id": "usr_987654321",
              "name": "Jane Smith",
              "email": "[email protected]"
            },
            "createdAt": "2025-01-10T14:20:00Z"
          }
        },
        // ... more resources
      ]
    }
  }
}
                    Mutations
Mutations allow you to modify data in our API. Unlike queries, which only retrieve data, mutations can create, update, or delete resources.
Available Mutations
| Mutation | Description | Arguments | 
|---|---|---|
createUser(input: CreateUserInput!) | 
                                    Create a new user | input: User creation data | 
                                
updateUser(id: ID!, input: UpdateUserInput!) | 
                                    Update an existing user | 
                                        id: The ID of the user to updateinput: User update data
                                     | 
                                
deleteUser(id: ID!) | 
                                    Delete a user | id: The ID of the user to delete | 
                                
createResource(input: CreateResourceInput!) | 
                                    Create a new resource | input: Resource creation data | 
                                
updateResource(id: ID!, input: UpdateResourceInput!) | 
                                    Update an existing resource | 
                                        id: The ID of the resource to updateinput: Resource update data
                                     | 
                                
deleteResource(id: ID!) | 
                                    Delete a resource | id: The ID of the resource to delete | 
                                
createWebhook(input: CreateWebhookInput!) | 
                                    Create a new webhook | input: Webhook creation data | 
                                
updateWebhook(id: ID!, input: UpdateWebhookInput!) | 
                                    Update an existing webhook | 
                                        id: The ID of the webhook to updateinput: Webhook update data
                                     | 
                                
deleteWebhook(id: ID!) | 
                                    Delete a webhook | id: The ID of the webhook to delete | 
                                
Mutation Example: Creating a Resource
mutation {
  createResource(input: {
    name: "New Project",
    description: "A brand new project",
    status: ACTIVE,
    data: {
      category: "Development",
      priority: "High"
    }
  }) {
    resource {
      id
      name
      description
      status
      createdAt
    }
  }
}
                    Response:
{
  "data": {
    "createResource": {
      "resource": {
        "id": "res_567890123",
        "name": "New Project",
        "description": "A brand new project",
        "status": "ACTIVE",
        "createdAt": "2025-05-11T14:30:00Z"
      }
    }
  }
}
                    Input Types
Our mutations use input types to specify the data for creating or updating resources. Here are some key input types:
input CreateUserInput {
  name: String!
  email: String!
  role: UserRole
}
input UpdateUserInput {
  name: String
  email: String
  role: UserRole
}
input CreateResourceInput {
  name: String!
  description: String
  status: ResourceStatus
  data: JSONObject
}
input UpdateResourceInput {
  name: String
  description: String
  status: ResourceStatus
  data: JSONObject
}
input CreateWebhookInput {
  url: String!
  events: [WebhookEvent!]!
}
input UpdateWebhookInput {
  url: String
  events: [WebhookEvent!]
}
input PaginationInput {
  limit: Int = 10
  offset: Int = 0
}
                    Subscriptions
Subscriptions enable real-time updates through a persistent connection. When subscribing to specific events, you'll receive updates whenever those events occur.
Note: Subscriptions require a WebSocket connection, unlike queries and mutations which use HTTP.
Available Subscriptions
| Subscription | Description | Arguments | 
|---|---|---|
resourceUpdated(id: ID!) | 
                                    Subscribe to updates for a specific resource | id: The ID of the resource to monitor | 
                                
userUpdated(id: ID!) | 
                                    Subscribe to updates for a specific user | id: The ID of the user to monitor | 
                                
eventCreated(types: [String!]) | 
                                    Subscribe to new events of specific types | types: List of event types to monitor | 
                                
Subscription Example: Monitoring Resource Updates
subscription {
  resourceUpdated(id: "res_123456789") {
    id
    name
    status
    updatedAt
  }
}
                    When the resource is updated, you'll receive a message like:
{
  "data": {
    "resourceUpdated": {
      "id": "res_123456789",
      "name": "Project Alpha Updated",
      "status": "ACTIVE",
      "updatedAt": "2025-05-11T15:45:00Z"
    }
  }
}
                    Client Implementation
To implement subscriptions in your client, you'll need a GraphQL client that supports WebSocket connections. Popular choices include:
- Apollo Client for JavaScript
 - gql for Python
 - Apollo Kotlin for Android
 - Apollo iOS for iOS
 
Authentication
Authentication for our GraphQL API works the same way as our REST API. You can use API keys, OAuth tokens, or JWT tokens, depending on your use case.
HTTP Header Authentication
Include your authentication token in the HTTP Authorization header:
Authorization: Bearer YOUR_API_KEY
                    WebSocket Authentication (for Subscriptions)
For WebSocket connections, you can include your authentication token as a query parameter in the connection URL:
wss://api.myappapi.com/graphql?token=YOUR_API_KEY
                    Alternatively, you can pass the token during the WebSocket handshake using the connection_init message:
{
  "type": "connection_init",
  "payload": {
    "Authorization": "Bearer YOUR_API_KEY"
  }
}
                    For more details on authentication methods, refer to our Authentication Guide.
Error Handling
GraphQL errors are returned in a standardized format, making it easier to handle them in your client applications.
Error Structure
GraphQL responses may include an "errors" array alongside the "data" field:
{
  "data": {
    "user": null
  },
  "errors": [
    {
      "message": "User not found",
      "path": ["user"],
      "extensions": {
        "code": "NOT_FOUND",
        "details": {
          "userId": "usr_nonexistent"
        }
      }
    }
  ]
}
                    Error Codes
| Code | Description | 
|---|---|
UNAUTHENTICATED | 
                                    Not authenticated or invalid authentication credentials | 
FORBIDDEN | 
                                    Authenticated but not authorized to perform the requested operation | 
BAD_USER_INPUT | 
                                    Invalid input provided in the request | 
NOT_FOUND | 
                                    Requested resource not found | 
ALREADY_EXISTS | 
                                    Resource already exists (e.g., when creating a resource with a duplicate identifier) | 
RATE_LIMITED | 
                                    Rate limit exceeded | 
INTERNAL_SERVER_ERROR | 
                                    Internal server error occurred | 
For more details on handling errors, refer to our Error Handling Guide.
Pagination
Our GraphQL API uses the Relay-style cursor pagination pattern for lists of objects, making it easier to paginate through large result sets.
Pagination Structure
Lists are returned with a connection structure that includes:
pageInfo: Information about the pagination stateedges: The actual items, each wrapped in an "edge" object
type ResourceConnection {
  pageInfo: PageInfo!
  edges: [ResourceEdge!]!
}
type ResourceEdge {
  node: Resource!
  cursor: String!
}
type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
  endCursor: String
  totalCount: Int!
}
                    Pagination Example
{
  resources(first: 10, after: "cursor_abc123") {
    pageInfo {
      hasNextPage
      hasPreviousPage
      startCursor
      endCursor
      totalCount
    }
    edges {
      cursor
      node {
        id
        name
        status
      }
    }
  }
}
                    Response:
{
  "data": {
    "resources": {
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": true,
        "startCursor": "cursor_def456",
        "endCursor": "cursor_ghi789",
        "totalCount": 42
      },
      "edges": [
        {
          "cursor": "cursor_def456",
          "node": {
            "id": "res_123456789",
            "name": "Project Alpha",
            "status": "ACTIVE"
          }
        },
        // ... more resources
        {
          "cursor": "cursor_ghi789",
          "node": {
            "id": "res_987654321",
            "name": "Project Beta",
            "status": "ACTIVE"
          }
        }
      ]
    }
  }
}
                    Pagination Parameters
You can use the following parameters for pagination:
first: Number of items to return (forward pagination)after: Cursor to start after (forward pagination)last: Number of items to return (backward pagination)before: Cursor to end before (backward pagination)
For more information on pagination, see our Pagination Guide.
Tooling
There are many tools available to help you work with our GraphQL API more effectively.
GraphQL IDEs
- GraphiQL: A browser-based IDE for exploring GraphQL APIs
 - GraphQL Playground: An alternative GraphQL IDE with more features
 - Apollo Studio: A powerful platform for developing and monitoring GraphQL APIs
 
GraphQL Clients
- Apollo Client: A comprehensive GraphQL client for JavaScript
 - Relay: Facebook's GraphQL client for React applications
 - graphql-request: A minimal GraphQL client for simple use cases
 - gql: A Python client for GraphQL
 
Code Generation
You can generate type-safe code for your API clients using tools like:
- GraphQL Code Generator: Generate types and hooks for TypeScript, Flow, and more
 - Apollo Android: Generate Kotlin or Java code for Android apps
 - Apollo iOS: Generate Swift code for iOS apps
 
Examples
Here are some practical examples to help you get started with our GraphQL API.
Fetching Multiple Resources in a Single Request
{
  # Get current user information
  me {
    id
    name
    email
  }
  
  # Get active resources
  activeResources: resources(filter: { status: ACTIVE }, pagination: { limit: 5 }) {
    edges {
      node {
        id
        name
        status
      }
    }
  }
  
  # Get recent events
  recentEvents: events(pagination: { limit: 5 }) {
    edges {
      node {
        id
        type
        createdAt
      }
    }
  }
}
                    Creating a Resource and Registering a Webhook
mutation {
  # Create a new resource
  newResource: createResource(input: {
    name: "New Project",
    description: "A brand new project",
    status: ACTIVE
  }) {
    resource {
      id
      name
    }
  }
  
  # Register a webhook to monitor updates to the resource
  newWebhook: createWebhook(input: {
    url: "https://example.com/webhooks/myappapi",
    events: [RESOURCE_UPDATED, RESOURCE_DELETED]
  }) {
    webhook {
      id
      url
      events
    }
  }
}
                    Complex Query with Filtering and Relationships
{
  # Get resources created in the last 7 days
  recentResources: resources(
    filter: {
      createdAfter: "2025-05-04T00:00:00Z"
    },
    pagination: { limit: 10 }
  ) {
    pageInfo {
      totalCount
      hasNextPage
      endCursor
    }
    edges {
      node {
        id
        name
        status
        
        # Include the owner details
        owner {
          id
          name
          email
        }
        
        # Include recent events for this resource
        events(pagination: { limit: 3 }) {
          edges {
            node {
              id
              type
              data
              createdAt
            }
          }
        }
        
        createdAt
        updatedAt
      }
    }
  }
}
                    Real-time Events with Subscriptions
subscription {
  # Subscribe to resource creation and update events
  eventCreated(types: ["RESOURCE_CREATED", "RESOURCE_UPDATED"]) {
    id
    type
    resourceId
    data
    createdAt
  }
}
                    Ready to Try Our GraphQL API?
Explore our GraphQL API interactively, run queries, and see live responses.