Google Classroom Python API Docs | dltHub

Build a Google Classroom-to-database pipeline in Python using dlt with AI Workbench support for Claude Code, Cursor, and Codex.

Last updated:

Google Classroom API is a RESTful API to manage classes, rosters, course work, announcements, and user profiles in Google Classroom. The REST API base URL is https://classroom.googleapis.com and OAuth 2.0 (Bearer token) authentication is required for all requests..

dlt is an open-source Python library that handles authentication, pagination, and schema evolution automatically. dlthub provides AI context files that enable code assistants to generate production-ready pipelines. Install with uv pip install "dlt[workspace]" and start loading Google Classroom data in under 10 minutes.


What data can I load from Google Classroom?

Here are some of the endpoints you can load from Google Classroom:

ResourceEndpointMethodData selectorDescription
courses/v1/coursesGETcoursesReturns list of courses the requester can view
course_work/v1/courses/{courseId}/courseWorkGETcourseWorkReturns list of course work for a course
course_work_materials/v1/courses/{courseId}/courseWorkMaterialsGETcourseWorkMaterialsReturns list of course work materials
announcements/v1/courses/{courseId}/announcementsGETannouncementsReturns list of announcements
students/v1/courses/{courseId}/studentsGETstudentsReturns list of students in a course
teachers/v1/courses/{courseId}/teachersGETteachersReturns list of teachers in a course
invitations/v1/invitationsGETinvitationsReturns list of invitations
guardians/v1/userProfiles/{studentId}/guardiansGETguardiansReturns list of guardians
guardian_invitations/v1/userProfiles/{studentId}/guardianInvitationsGETguardianInvitationsReturns list of guardian invitations
topics/v1/courses/{courseId}/topicsGETtopicsReturns list of topics

How do I authenticate with the Google Classroom API?

Requests must include an Authorization: Bearer header containing an OAuth 2.0 access token. Service accounts can obtain tokens via domain‑wide delegation.

1. Get your credentials

  1. Create a Google Cloud project and enable the Classroom API. 2) Configure the OAuth consent screen and create an OAuth client ID; record the client_id and client_secret. 3) For user OAuth, follow the OAuth flow to obtain an access token with the required scopes (e.g., https://www.googleapis.com/auth/classroom.courses.readonly). 4) For service‑account access, create a service account, download its JSON key, enable domain‑wide delegation, and grant the necessary scopes in the Admin console. 5) Exchange the JWT for an access token and include it in the Authorization header.

2. Add them to .dlt/secrets.toml

[sources.google_classroom_source] client_id = "your_oauth_client_id" client_secret = "your_oauth_client_secret" service_account_json = "path_or_json_string"

dlt reads this automatically at runtime — never hardcode tokens in your pipeline script. For production environments, see setting up credentials with dlt for environment variable and vault-based options.


How do I set up and run the pipeline?

Set up a virtual environment and install dlt:

uv venv && source .venv/bin/activate uv pip install "dlt[workspace]"

1. Install the dlt AI Workbench:

dlt ai init --agent <your-agent> # <agent>: claude | cursor | codex

This installs project rules, a secrets management skill, appropriate ignore files, and configures the dlt MCP server for your agent. Learn more →

2. Install the rest-api-pipeline toolkit:

dlt ai toolkit rest-api-pipeline install

This loads the skills and context about dlt the agent uses to build the pipeline iteratively, efficiently, and safely. The agent uses MCP tools to inspect credentials — it never needs to read your secrets.toml directly. Learn more →

3. Start LLM-assisted coding:

Use /find-source to load data from the Google Classroom API into DuckDB.

The rest-api-pipeline toolkit takes over from here — it reads relevant API documentation, presents you with options for which endpoints to load, and follows a structured workflow to scaffold, debug, and validate the pipeline step by step.

4. Run the pipeline:

python google_classroom_pipeline.py

If everything is configured correctly, you'll see output like this:

Pipeline google_classroom_pipeline load step completed in 0.26 seconds 1 load package(s) were loaded to destination duckdb and into dataset google_classroom_data The duckdb destination used duckdb:/google_classroom.duckdb location to store data Load package 1749667187.541553 is LOADED and contains no failed jobs

Inspect your pipeline and data:

dlt pipeline google_classroom_pipeline show

This opens the Pipeline Dashboard where you can verify pipeline state, load metrics, schema (tables, columns, types), and query the loaded data directly.


Python pipeline example

This example loads courses and course_work from the Google Classroom API into DuckDB. It mirrors the endpoint and data selector configuration from the table above:

import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def google_classroom_source(credentials=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "https://classroom.googleapis.com", "auth": { "type": "bearer", "token": credentials, }, }, "resources": [ {"name": "courses", "endpoint": {"path": "v1/courses", "data_selector": "courses"}}, {"name": "course_work", "endpoint": {"path": "v1/courses/{courseId}/courseWork", "data_selector": "courseWork"}} ], } yield from rest_api_resources(config) def get_data() -> None: pipeline = dlt.pipeline( pipeline_name="google_classroom_pipeline", destination="duckdb", dataset_name="google_classroom_data", ) load_info = pipeline.run(google_classroom_source()) print(load_info)

To add more endpoints, append entries from the resource table to the "resources" list using the same name, path, and data_selector pattern.


How do I query the loaded data?

Once the pipeline runs, dlt creates one table per resource. You can query with Python or SQL.

Python (pandas DataFrame):

import dlt data = dlt.pipeline("google_classroom_pipeline").dataset() sessions_df = data.courses.df() print(sessions_df.head())

SQL (DuckDB example):

SELECT * FROM google_classroom_data.courses LIMIT 10;

In a marimo or Jupyter notebook:

import dlt data = dlt.pipeline("google_classroom_pipeline").dataset() data.courses.df().head()

See how to explore your data in marimo Notebooks and how to query your data in Python with dataset.


What destinations can I load Google Classroom data to?

dlt supports loading into any of these destinations — only the destination parameter changes:

DestinationExample value
DuckDB (local, default)"duckdb"
PostgreSQL"postgres"
BigQuery"bigquery"
Snowflake"snowflake"
Redshift"redshift"
Databricks"databricks"
Filesystem (S3, GCS, Azure)"filesystem"

Change the destination in dlt.pipeline(destination="snowflake") and add credentials in .dlt/secrets.toml. See the full destinations list.


Troubleshooting

Authentication failures

If the Authorization header is missing or invalid, the API returns 401 Unauthorized. Verify that a valid OAuth 2.0 access token is supplied and that service‑account domain‑wide delegation is correctly configured.

Permissions and scopes

A 403 Forbidden response indicates that the token does not include the required scopes (e.g., https://www.googleapis.com/auth/classroom.courses.readonly). Request the appropriate scopes during OAuth consent and ensure the calling user has access to the resource.

Rate limits and quotas

Google enforces per‑project and per‑user quotas; exceeding them returns 429 Too Many Requests. Apply exponential backoff and monitor quota usage in the Cloud Console.

Pagination

List methods return a nextPageToken when additional pages exist. Include the pageToken (and optionally pageSize) query parameters to retrieve subsequent pages until nextPageToken is absent.

Service‑account specific quirks

When using a service account, many Classroom resources require impersonation of a real user. Enable domain‑wide delegation and grant the service‑account client ID the necessary scopes in the Admin console. Some APIs (e.g., rubrics) are in preview and may have additional eligibility requirements.

Ensure that the API key is valid to avoid 401 Unauthorized errors. Also, verify endpoint paths and parameters to avoid 404 Not Found errors.


Next steps

Continue your data engineering journey with the other toolkits of the dltHub AI Workbench:

  • data-exploration — Build custom notebooks, charts, and dashboards for deeper analysis with marimo notebooks.
  • dlthub-runtime — Deploy, schedule, and monitor your pipeline in production.
dlt ai toolkit data-exploration install dlt ai toolkit dlthub-runtime install

Was this page helpful?

Community Hub

Need more dlt context for Google Classroom?

Request dlt skills, commands, AGENT.md files, and AI-native context.