Skip to main content

GraphQL-core 3

GraphQL-core 3 is a Python 3.10+ port of GraphQL.js, the JavaScript reference implementation for GraphQL, a query language for APIs created by Facebook.

PyPI version Documentation Status Test Status Lint Status CodSpeed Code style

An extensive test suite with over 3000 unit tests and 100% coverage replicates the complete test suite of GraphQL.js, ensuring that this port is reliable and compatible with GraphQL.js.

The current stable version 3.3.0 of GraphQL-core is up-to-date with GraphQL.js version 17.0.2 and supports Python versions 3.10 to 3.15.

If you need compatibility with GraphQL.js 16 or support for Python 3.7 to 3.9, you can use the latest version 3.2.13 from the 3.2 branch.

Note that for various reasons, GraphQL-core does not use SemVer like GraphQL.js. Changes in the major version of GraphQL.js are reflected in the minor version of GraphQL-core instead. This means there can be breaking changes in the API when the minor version changes, and only patch releases are fully backward compatible. Therefore, we recommend using something like ~= 3.3.0 as the version specifier when including GraphQL-core as a dependency.

Documentation

More detailed documentation for GraphQL-core 3 can be found at graphql-core-3.readthedocs.io.

The documentation for GraphQL.js can be found at graphql.org/graphql-js/.

The documentation for GraphQL itself can be found at graphql.org.

There will be also blog articles with more usage examples.

Getting started

A general overview of GraphQL is available in the README for the Specification for GraphQL. This overview includes a simple set of GraphQL examples that are also available as tests in this repository. A good way to get started with this repository is to walk through that README and the corresponding tests in parallel.

Installation

GraphQL-core 3 can be installed from PyPI using the built-in pip command:

python -m pip install graphql-core

Or, if you prefer uv:

uv pip install graphql-core

Usage

GraphQL-core provides two important capabilities: building a type schema and serving queries against that type schema.

First, build a GraphQL type schema which maps to your codebase:

from graphql import (
    GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=lambda obj, info: 'world')
        }))

This defines a simple schema, with one type and one field, that resolves to a fixed value. The resolve function can return a value, a co-routine object or a list of these. It takes two positional arguments; the first one provides the root or the resolved parent field, the second one provides a GraphQLResolveInfo object which contains information about the execution state of the query, including a context attribute holding per-request state such as authentication information or database session. Any GraphQL arguments are passed to the resolve functions as individual keyword arguments.

Note that the signature of the resolver functions is a bit different in GraphQL.js, where the context is passed separately and arguments are passed as a single object. Also note that GraphQL fields must be passed as a GraphQLField object explicitly. Similarly, GraphQL arguments must be passed as GraphQLArgument objects.

A more complex example is included in the top-level tests directory.

Then, serve the result of a query against that type schema.

from graphql import graphql_sync

source = '{ hello }'

print(graphql_sync(schema, source))

This runs a query fetching the one field defined, and then prints the result:

ExecutionResult(data={'hello': 'world'}, errors=None)

The graphql_sync function will first ensure the query is syntactically and semantically valid before executing it, reporting errors otherwise.

from graphql import graphql_sync

source = '{ BoyHowdy }'

print(graphql_sync(schema, source))

Because we queried a non-existing field, we will get the following result:

ExecutionResult(data=None, errors=[GraphQLError(
    "Cannot query field 'BoyHowdy' on type 'RootQueryType'.",
    locations=[SourceLocation(line=1, column=3)])])

The graphql_sync function assumes that all resolvers return values synchronously. By using coroutines as resolvers, you can also create results in an asynchronous fashion with the graphql function.

import asyncio
from graphql import (
    graphql, GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)


async def resolve_hello(obj, info):
    await asyncio.sleep(3)
    return 'world'

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=resolve_hello)
        }))


async def main():
    query = '{ hello }'
    print('Fetching the result...')
    result = await graphql(schema, query)
    print(result)


asyncio.run(main())

Goals and restrictions

GraphQL-core aims to reproduce the code of the reference implementation GraphQL.js in Python as closely as possible while staying up-to-date with the latest development of GraphQL.js.

GraphQL-core 3 (formerly known as GraphQL-core-next) was created as a modern alternative to GraphQL-core 2, a prior work by Syrus Akbary based on an older version of GraphQL.js that still supported legacy Python versions. While some parts of GraphQL-core 3 were inspired by GraphQL-core 2 or directly taken over with slight modifications, most of the code has been re-implemented from scratch. This re-implementation closely replicates the latest code in GraphQL.js and adds type hints for Python.

Design goals for the GraphQL-core 3 library were:

  • to be a simple, cruft-free, state-of-the-art GraphQL implementation for current Python versions
  • to be very close to the GraphQL.js reference implementation, while still providing a Pythonic API and code style
  • to make extensive use of Python type hints, similar to how GraphQL.js used Flow (and is now using TypeScript)
  • to use black to achieve a consistent code style while saving time and mental energy for more important matters (we are now using ruff instead)
  • to replicate the complete Mocha-based test suite of GraphQL.js using pytest with pytest-describe

Some restrictions (mostly in line with the design goals):

  • requires Python 3.10 or newer, while the 3.2 branch supports Python 3.7 and newer
  • does not support some already deprecated methods and options of GraphQL.js
  • supports asynchronous operations only via async.io (does not support the additional executors in GraphQL-core)

Note that meanwhile we are using the amazing ruff tool to both format and check the code of GraphQL-core 3, in addition to using mypy as type checker.

Integration with other libraries and roadmap

  • Graphene is a more high-level framework for building GraphQL APIs in Python, and there is already a whole ecosystem of libraries, server integrations and tools built on top of Graphene. Most of this Graphene ecosystem has also been created by Syrus Akbary, who meanwhile has handed over the maintenance and future development to members of the GraphQL-Python community.

    Graphene 3 is now using Graphql-core 3 as core library for much of the heavy lifting.

  • Ariadne is a Python library for implementing GraphQL servers using schema-first approach created by Mirumee Software.

    Ariadne is also using GraphQL-core 3 as its GraphQL implementation.

  • Strawberry, created by Patrick Arminio, is a new GraphQL library for Python 3, inspired by dataclasses, that is also using GraphQL-core 3 as underpinning.

  • Typed GraphQL, thin layer over GraphQL-core that uses native Python types for creating GraphQL schemas.

Changelog

Changes are tracked as GitHub releases.

Credits and history

The GraphQL-core 3 library

  • has been created and is maintained by Christoph Zwerschke
  • uses ideas and code from GraphQL-core 2, a prior work by Syrus Akbary
  • is a Python port of GraphQL.js which has been developed by Lee Byron and others at Facebook, Inc. and is now maintained by the GraphQL foundation

Please watch the recording of Lee Byron's short keynote on the history of GraphQL at the open source leadership summit 2019 to better understand how and why GraphQL was created at Facebook and then became open sourced and ported to many different programming languages.

License

GraphQL-core 3 is MIT-licensed, just like GraphQL.js.

Release files for graphql-core 3.3.0

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-core 3.3.0
File Size Uploaded
graphql_core-3.3.0.tar.gz 726.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for graphql-core 3.3.0
File Interpreter ABI Platform
graphql_core-3.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / graphql_core-3.3.0.tar.gz

Download URL graphql_core-3.3.0.tar.gz
Size 726.4 kB
Tags Source
SHA-256 checksum
How to use checksums
fd3424e88af3f3211931c6ff96350f1cd9069cf0f1a31b9972899e35d39136b5
BLAKE2b-256 checksum
How to use checksums
fa90dfade6d16a55abb45e41b215fcdc940e4f119a6ac7d87430d45d020b659f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / graphql_core-3.3.0-py3-none-any.whl

Download URL graphql_core-3.3.0-py3-none-any.whl
Size 347.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d37fac6ef4dfc3eaa5daa59dcb498d7cbb118439d240993c68fddc4cb1bade44
BLAKE2b-256 checksum
How to use checksums
0c1303fb01b3581134cc30d7dd3fb8a9c429267574ace881a9e72c2f57896ee9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

3.3.0 This release

2 release files

3.2.13

2 release files

3.2.12

2 release files

3.2.9

2 release files

3.2.8

2 release files

3.2.7

2 release files

3.2.6

2 release files

3.2.5

2 release files

3.2.4

2 release files

3.2.3

2 release files

3.2.2

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.7

2 release files

3.1.6

2 release files

3.1.5

2 release files

3.1.4

2 release files

3.1.3

2 release files

3.1.2

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.6

2 release files

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3

2 release files

2.2.1

2 release files

2.2

2 release files

2.1

2 release files

2.0

2 release files

1.1

1 release file

1.0.1

1 release file

1.0

1 release file

0.5.3

1 release file

0.5.2

1 release file

0.5.1

1 release file

0.5

1 release file

0.4.18

1 release file

0.4.17

1 release file

0.4.16

1 release file

0.4.15

1 release file

0.4.14

1 release file

0.4.13

1 release file

0.4.12

1 release file

0.4.11

1 release file

0.4.9

1 release file

0.0.1

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