Install
openclaw skills install kaggle-apiKaggle API integration with managed authentication. Access datasets, models, competitions, and kernels. Use this skill when users want to search, download, or interact with Kaggle resources. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install kaggle-apiAccess Kaggle datasets, models, competitions, and notebooks via managed API authentication.
python <<'EOF'
import urllib.request, os, json
data = json.dumps({}).encode()
req = urllib.request.Request('https://gateway.maton.ai/kaggle/v1/datasets.DatasetApiService/ListDatasets', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/kaggle/{native-api-path}
The gateway proxies requests to api.kaggle.com and automatically injects your credentials.
All requests require the Maton API key:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Kaggle connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=kaggle&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'kaggle'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Open the returned url in a browser to complete authentication. Kaggle uses API key authentication - you'll need to provide your Kaggle username and API key from kaggle.com/settings.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Kaggle uses an RPC-style API. All requests are POST with JSON body.
POST /kaggle/v1/{ServiceName}/{MethodName}
Content-Type: application/json
POST /kaggle/v1/datasets.DatasetApiService/ListDatasets
Content-Type: application/json
{}
Request Body Parameters:
search - Search term (optional)user - Filter by username (optional)pageSize - Results per page (optional)pageToken - Pagination token (optional)Example with search:
{
"search": "covid"
}
Response:
{
"datasets": [
{
"id": 9481458,
"ref": "amar5693/screen-time-sleep-and-stress-analysis-dataset",
"title": "Screen Time, Sleep & Stress Analysis Dataset",
"subtitle": "ML-ready dataset analyzing smartphone usage and productivity.",
"totalBytes": 787136,
"downloadCount": 11659,
"voteCount": 236,
"usabilityRating": 1,
"licenseName": "CC0: Public Domain",
"ownerName": "Amar Tiwari",
"tags": [...]
}
]
}
POST /kaggle/v1/datasets.DatasetApiService/GetDataset
Content-Type: application/json
{
"ownerSlug": "amar5693",
"datasetSlug": "screen-time-sleep-and-stress-analysis-dataset"
}
Response:
{
"id": 9481458,
"title": "Screen Time, Sleep & Stress Analysis Dataset",
"subtitle": "ML-ready dataset analyzing smartphone usage and productivity.",
"totalBytes": 787136,
"downloadCount": 11659,
"usabilityRating": 1
}
POST /kaggle/v1/datasets.DatasetApiService/ListDatasetFiles
Content-Type: application/json
{
"ownerSlug": "amar5693",
"datasetSlug": "screen-time-sleep-and-stress-analysis-dataset"
}
Response:
{
"datasetFiles": [
{
"name": "Smartphone_Usage_Productivity_Dataset_50000.csv",
"creationDate": "2026-02-13T06:56:19.803Z",
"totalBytes": 2958561
}
]
}
POST /kaggle/v1/datasets.DatasetApiService/GetDatasetMetadata
Content-Type: application/json
{
"ownerSlug": "amar5693",
"datasetSlug": "screen-time-sleep-and-stress-analysis-dataset"
}
Response:
{
"info": {
"datasetId": 9481458,
"datasetSlug": "screen-time-sleep-and-stress-analysis-dataset",
"ownerUser": "amar5693",
"title": "Screen Time, Sleep & Stress Analysis Dataset",
"description": "...",
"totalViews": 44291,
"totalVotes": 236,
"totalDownloads": 11661
}
}
POST /kaggle/v1/datasets.DatasetApiService/DownloadDataset
Content-Type: application/json
{
"ownerSlug": "amar5693",
"datasetSlug": "screen-time-sleep-and-stress-analysis-dataset"
}
Returns binary data (ZIP file). Response headers:
Content-Type: application/zipContent-Length: <size in bytes>POST /kaggle/v1/models.ModelApiService/ListModels
Content-Type: application/json
{}
Request Body Parameters:
owner - Filter by owner (optional)search - Search term (optional)pageSize - Results per page (optional)Example:
{
"owner": "google"
}
Response:
{
"models": [
{
"id": 1,
"owner": "google",
"slug": "gemma",
"title": "Gemma",
"subtitle": "Gemma is a family of lightweight, state-of-the-art models",
"instanceCount": 16,
"framework": "transformers"
}
]
}
POST /kaggle/v1/models.ModelApiService/GetModel
Content-Type: application/json
{
"ownerSlug": "google",
"modelSlug": "gemma"
}
Response:
{
"id": 1,
"title": "Gemma",
"slug": "gemma",
"owner": "google",
"subtitle": "Gemma is a family of lightweight, state-of-the-art models",
"publishTime": "2024-02-21T16:00:00Z",
"instanceCount": 16
}
POST /kaggle/v1/competitions.CompetitionApiService/ListCompetitions
Content-Type: application/json
{}
Request Body Parameters:
search - Search term (optional)category - Filter by category (optional)pageSize - Results per page (optional)Example:
{
"search": "nlp"
}
Response:
{
"competitions": [
{
"id": 118448,
"ref": "https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3",
"title": "AI Mathematical Olympiad - Progress Prize 3",
"url": "https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3",
"deadline": "2026-06-06T23:59:00Z",
"category": "Featured",
"reward": "$1,048,576",
"teamCount": 1234,
"userHasEntered": false
}
]
}
POST /kaggle/v1/kernels.KernelsApiService/ListKernels
Content-Type: application/json
{}
Request Body Parameters:
search - Search term (optional)user - Filter by username (optional)language - Filter by language: python, r, etc. (optional)pageSize - Results per page (optional)Example:
{
"search": "titanic"
}
Response:
{
"kernels": [
{
"id": 5660537,
"ref": "alexisbcook/titanic-tutorial",
"title": "Titanic Tutorial",
"author": "alexisbcook",
"language": "Python",
"totalVotes": 1234,
"totalViews": 56789
}
]
}
POST /kaggle/v1/kernels.KernelsApiService/GetKernel
Content-Type: application/json
{
"userName": "alexisbcook",
"kernelSlug": "titanic-tutorial"
}
Response:
{
"metadata": {
"id": 5660537,
"ref": "alexisbcook/titanic-tutorial",
"title": "Titanic Tutorial",
"author": "alexisbcook",
"language": "Python"
}
}
const response = await fetch(
'https://gateway.maton.ai/kaggle/v1/datasets.DatasetApiService/ListDatasets',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ search: 'covid' })
}
);
const data = await response.json();
console.log(data);
import os
import requests
response = requests.post(
'https://gateway.maton.ai/kaggle/v1/datasets.DatasetApiService/ListDatasets',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
},
json={'search': 'covid'}
)
print(response.json())
/v1/{ServiceName}/{MethodName}{owner}/{dataset-slug}{owner}/{model-slug}{user}/{kernel-slug}| Status | Meaning |
|---|---|
| 200 | Success |
| 400 | Invalid request parameters |
| 401 | Invalid or missing authentication |
| 403 | Permission denied |
| 404 | Resource not found |
| 429 | Rate limited |