Skip to main content

GraphQL-API for Python

PyPI version Python versions License: MIT

Documentation | PyPI | GitHub


A powerful and intuitive Python library for building GraphQL APIs, designed with a code-first, decorator-based approach.

graphql-api simplifies schema definition by leveraging Python's type hints, dataclasses, and Pydantic models, allowing you to build robust and maintainable GraphQL services with minimal boilerplate.

Key Features

  • Decorator-Based Schema: Define your GraphQL schema declaratively using simple and intuitive decorators.
  • Type Hinting: Automatically converts Python type hints into GraphQL types.
  • Implicit Type Inference: Automatically maps Pydantic models, dataclasses, and classes with fields - no explicit decorators needed.
  • Pydantic & Dataclass Support: Seamlessly use Pydantic and Dataclass models as GraphQL types.
  • Asynchronous Execution: Full support for async and await for high-performance, non-blocking resolvers.
  • Apollo Federation: Built-in support for creating federated services.
  • Subscriptions: Implement real-time functionality with GraphQL subscriptions.
  • Middleware: Add custom logic to your resolvers with a flexible middleware system.
  • Relay Support: Includes helpers for building Relay-compliant schemas.

Installation

pip install graphql-api

Quick Start

For simple APIs, register plain functions directly — no class required:

# example.py
from graphql_api.api import GraphQLAPI

api = GraphQLAPI()

@api.query
def hello(name: str = "World") -> str:
    """A classic greeting."""
    return f"Hello, {name}!"

@api.mutation
def set_name(name: str) -> str:
    return f"Name set to {name}"

if __name__ == "__main__":
    result = api.execute('query { hello(name: "Developer") }')
    print(result.data)
$ python example.py
{'hello': 'Hello, Developer!'}

Use @api.query, @api.mutation, and @api.subscription for root-level fields. For nested object types, reach for the class-based form below.

Class-based form

When you need object types with their own fields (relationships, computed properties, nested resolvers), define a root class:

from graphql_api.api import GraphQLAPI

api = GraphQLAPI()

@api.type(is_root_type=True)
class Query:
    """The root query for our amazing API."""
    @api.field
    def hello(self, name: str = "World") -> str:
        return f"Hello, {name}!"

result = api.execute('query { hello(name: "Developer") }')
print(result.data)
# {'hello': 'Hello, Developer!'}

Examples

Using Pydantic Models

Leverage Pydantic for data validation and structure. graphql-api will automatically convert your models into GraphQL types.

from pydantic import BaseModel
from typing import List
from graphql_api.api import GraphQLAPI

class Book(BaseModel):
    title: str
    author: str

@api.type(is_root_type=True)
class BookAPI:
    @api.field
    def get_books(self) -> List[Book]:
        return [
            Book(title="The Hitchhiker's Guide to the Galaxy", author="Douglas Adams"),
            Book(title="1984", author="George Orwell"),
        ]

api = GraphQLAPI()

graphql_query = """
    query {
        getBooks {
            title
            author
        }
    }
"""

result = api.execute(graphql_query)
# result.data will contain the list of books

Asynchronous Resolvers

Define async resolvers for non-blocking I/O operations.

import asyncio
from graphql_api.api import GraphQLAPI

api = GraphQLAPI()

@api.type(is_root_type=True)
class AsyncAPI:
    @api.field
    async def fetch_data(self) -> str:
        await asyncio.sleep(1)
        return "Data fetched successfully!"

# To execute async queries, you'll need an async executor
# or to run it within an async context.
async def main():
    result = await api.execute("""
        query {
            fetchData
        }
    """)
    print(result.data)

if __name__ == "__main__":
    asyncio.run(main())

Mutations with Dataclasses

Use dataclasses to define the structure of your data, and mark fields as mutable to automatically separate them into the GraphQL Mutation type.

from dataclasses import dataclass
from graphql_api.api import GraphQLAPI

@dataclass
class User:
    id: int
    name: str

# A simple in-memory database
db = {1: User(id=1, name="Alice")}

api = GraphQLAPI()

@api.type(is_root_type=True)
class Root:
    @api.field
    def get_user(self, user_id: int) -> User:
        return db.get(user_id)

    @api.field(mutable=True)
    def add_user(self, user_id: int, name: str) -> User:
        new_user = User(id=user_id, name=name)
        db[user_id] = new_user
        return new_user

GraphQL automatically separates queries and mutations - you don't need separate classes. Fields marked with mutable=True are placed in the Mutation type, while regular fields go in the Query type. Fields with AsyncGenerator return types are automatically detected as subscriptions. This automatic mapping means you can define all your operations in a single class and let graphql-api handle the schema organization for you.

  • graphql-http - Serve your API over HTTP with authentication and GraphiQL
  • graphql-db - SQLAlchemy integration for database-backed APIs
  • graphql-mcp - Expose your API as MCP tools for AI agents

See the documentation for advanced schema patterns, federation, remote GraphQL, and more.

Documentation

Visit the official documentation for comprehensive guides, tutorials, and API reference.

Key Topics

Running Tests

To contribute or run the test suite locally:

# Install dependencies
uv sync

# Run tests
uv run pytest

Metadata

Release files for graphql-api 1.6.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for graphql-api 1.6.10
File Size Uploaded
graphql_api-1.6.10.tar.gz 266.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for graphql-api 1.6.10
File Interpreter ABI Platform
graphql_api-1.6.10-py3-none-any.whl Python 3 none any Details

Total release size: 340.0 kB

Release files / graphql_api-1.6.10.tar.gz

Download URL graphql_api-1.6.10.tar.gz
Size 266.1 kB
Tags Source
SHA-256 checksum
How to use checksums
a43648d9100b2a4093d2cf4a959d8da93ad3f539fe8d1e01927df8f2cf2213e8
BLAKE2b-256 checksum
How to use checksums
3a95cf16f1854a0337287db067b9af347ad3aa6b0b00086efdd40ec10c7ad94d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / graphql_api-1.6.10-py3-none-any.whl

Download URL graphql_api-1.6.10-py3-none-any.whl
Size 73.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3743082fdae44f486eb7cf942bb8e3ef8774a2e506406e018a5954b0115ab480
BLAKE2b-256 checksum
How to use checksums
281fe4774d032d622a321f9df71bc7c806ab5186efa2425267c87f3f2b5649ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.6.10 This release

2 release files

1.6.9

2 release files

1.6.8

2 release files

1.6.7

2 release files

1.6.6

2 release files

1.6.5

2 release files

1.6.4

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.0

2 release files

1.4.21

2 release files

1.4.20

2 release files

1.4.17

2 release files

1.4.16

2 release files

1.4.15

2 release files

1.4.14

2 release files

1.4.13

2 release files

1.4.11

2 release files

1.4.10

2 release files

1.4.9

2 release files

1.4.8

2 release files

1.4.7

2 release files

1.4.6

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.33

2 release files

1.3.31

2 release files

1.3.30

1 release file

1.3.29

1 release file

1.3.28

1 release file

1.3.27

1 release file

1.3.26

1 release file

1.3.25

1 release file

1.3.24

1 release file

1.3.23

1 release file

1.3.22

1 release file

1.3.21

1 release file

1.3.20

1 release file

1.3.19

1 release file

1.3.18

1 release file

1.3.17

1 release file

1.3.16

1 release file

1.3.15

1 release file

1.3.14

1 release file

1.3.13

1 release file

1.3.12

1 release file

1.3.11

1 release file

1.3.10

1 release file

1.3.9

1 release file

1.3.8

1 release file

1.3.7

1 release file

1.3.6

1 release file

1.3.5

1 release file

1.3.4

1 release file

1.3.3

1 release file

1.3.2

1 release file

1.3.1

1 release file

1.3.0

1 release file

1.2.43

1 release file

1.2.42

1 release file

1.2.41

1 release file

1.2.40

1 release file

1.2.39

1 release file

1.2.38

1 release file

1.2.37

1 release file

1.2.36

1 release file

1.2.35

1 release file

1.2.34

1 release file

1.2.33

1 release file

1.2.32

1 release file

1.2.31

1 release file

1.2.30

1 release file

1.2.29

1 release file

1.2.28

1 release file

1.2.27

1 release file

1.2.26

1 release file

1.2.25

1 release file

1.2.24

1 release file

1.2.23

1 release file

1.2.22

1 release file

1.2.21

1 release file

1.2.20

1 release file

1.2.19

1 release file

1.2.18

1 release file

1.2.17

1 release file

1.2.16

1 release file

1.2.15

1 release file

1.2.14

1 release file

1.2.13

1 release file

1.2.12

1 release file

1.2.11

1 release file

1.2.10

1 release file

1.2.9

1 release file

1.2.8

1 release file

1.2.7

1 release file

1.2.6

1 release file

1.2.5

1 release file

1.2.4

1 release file

1.2.3

1 release file

1.2.2

1 release file

1.2.1

1 release file

1.2.0

1 release file

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page