Inspected, never loaded.
A pickle can run code the moment it’s opened, so we never open yours on our servers. We read its bytes, pin the exact versions it needs, and refuse files that would run commands.
Inspection, isolation, keys, versions, rollback and monitoring for every model.
A pickle can run code the moment it’s opened, so we never open yours on our servers. We read its bytes, pin the exact versions it needs, and refuse files that would run commands.
import os, requests url = "https://mlg-iris-7f3a9c21.onrender.com/predict" key = os.environ["MLGATEE_KEY"] res = requests.post(url, headers={"Authorization": f"Bearer {key}"}, json={"input_data": [[5.1, 3.5, 1.4, 0.2]]}) print(res.json()) # {'output': [0], 'model': 'iris'}
Make a new key on the model’s page. The old one keeps working until the new one is live, so nothing breaks in between. Keys are shown once and stored only as a hash.
Replacing or deleting one model never touches another. On the free plan an idle model naps after 15 quiet minutes and wakes on the next call.
Calls, errors and answer times, per hour and per version, for the last 24 hours or 7 days. Never your inputs, outputs or keys.
Scroll to explore the dashboard
Modelsiris
scikit-learn · Free machine · Updated 2 h ago
Send rows of input features to /predict. Classifiers also answer /predict_proba.
export MLGATEE_KEY="paste-your-key-here"
curl -X POST https://mlg-iris-7f3a9c21.onrender.com/predict \
-H "Authorization: Bearer $MLGATEE_KEY" \
-H "Content-Type: application/json" \
-d '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'$env:MLGATEE_KEY = "paste-your-key-here"
$body = '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'
Invoke-RestMethod -Method Post -Uri "https://mlg-iris-7f3a9c21.onrender.com/predict" `
-Headers @{ Authorization = "Bearer $env:MLGATEE_KEY" } `
-ContentType "application/json" -Body $bodyimport json, os, urllib.request
KEY = os.environ.get("MLGATEE_KEY") or "paste-your-key-here"
request = urllib.request.Request(
"https://mlg-iris-7f3a9c21.onrender.com/predict",
data=json.dumps({"input_data": [[5.1, 3.5, 1.4, 0.2]]}).encode(),
headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=120) as response:
print(json.loads(response.read())["output"])15:11:12 [deploying] Server started on Python 3.12
15:11:14 [live] Version 3 is live
15:11:15 [live] Monitoring: reporting
https://mlg-iris-7f3a9c21.onrender.commlg_live_••••••••a3f1The full key is shown only once, when it’s created.
Calls, errors and answer times, reported by the model about once a minute.
| Version | Calls | Errors | Slowest 5% |
|---|---|---|---|
v3 answering now | 412 | 0.5% | 11 ms |
v2 | 236 | 1.7% | 14 ms |
Counts and answer times only: MLGatee never records what is sent to your model or what it answers.
The 3 newest versions are kept, so you can roll back to them.
| Version | File | Live | Actions |
|---|---|---|---|
v3 Answering now | scikit-learn · 3.1 KB | Live 2 h ago | |
v2 | XGBoost · 41 KB | 3 days ago, replaced 2 h ago | |
v1 | CatBoost · 88 KB | 5 days ago, replaced 3 days ago |
A rollback becomes a new version built from the earlier file. Same address, same key.
Send rows of input features to /predict, in the same order the model was trained on. Classifiers also answer /predict_proba.
export MLGATEE_KEY="paste-your-key-here"
curl -X POST https://mlg-iris-7f3a9c21.onrender.com/predict \
-H "Authorization: Bearer $MLGATEE_KEY" \
-H "Content-Type: application/json" \
-d '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'$env:MLGATEE_KEY = "paste-your-key-here"
$body = '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'
Invoke-RestMethod -Method Post -Uri "https://mlg-iris-7f3a9c21.onrender.com/predict" `
-Headers @{ Authorization = "Bearer $env:MLGATEE_KEY" } `
-ContentType "application/json" -Body $bodyset MLGATEE_KEY=paste-your-key-here
curl.exe -X POST "https://mlg-iris-7f3a9c21.onrender.com/predict" ^
-H "Authorization: Bearer %MLGATEE_KEY%" ^
-H "Content-Type: application/json" ^
-d "{\"input_data\": [[5.1, 3.5, 1.4, 0.2]]}"import json, os, urllib.request
KEY = os.environ.get("MLGATEE_KEY") or "paste-your-key-here"
request = urllib.request.Request(
"https://mlg-iris-7f3a9c21.onrender.com/predict",
data=json.dumps({"input_data": [[5.1, 3.5, 1.4, 0.2]]}).encode(),
headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=120) as response:
print(json.loads(response.read())["output"])const KEY = process.env.MLGATEE_KEY || "paste-your-key-here";
const response = await fetch("https://mlg-iris-7f3a9c21.onrender.com/predict", {
method: "POST",
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ input_data: [[5.1, 3.5, 1.4, 0.2]] }),
});
console.log((await response.json()).output);The sample body is the iris example (4 numbers); replace it with your own model’s features. On the free machine the model sleeps after 15 minutes without requests, and the next request can take about a minute.
Everything that happened to this model, newest last. Times are in your time zone.
15:09:02 [uploading] Upload link created (single use)
15:09:04 [uploading] model.pkl received · 3.1 KB
15:09:05 [inspecting] Reading the bytes, without loading the model
15:09:06 [inspecting] Found scikit-learn 1.9.1 · numpy 2.5.3
15:09:06 [inspecting] Nothing in this file runs when it loads
15:09:08 [deploying] Created its own service: mlg-iris-7f3a9c21
15:09:40 [deploying] Installing scikit-learn==1.9.1 numpy==2.5.3
15:10:52 [deploying] Fetching the model through a short-lived link
15:11:12 [deploying] Server started on Python 3.12
15:11:14 [live] Version 3 is live
15:11:15 [live] Monitoring: reporting
mlg_live_••••••••a3f1The full key is shown only once, when it’s created.
The model rebuilds with a new key. The old key keeps working until the rebuild is live.
Removes its service, its files and its record. The address stops answering.
Same address. Same key. Every version.
Roll back in one click, or one line of Python, to any of your three newest versions. Same address, same key, so nothing that calls it has to change.
>>> mlgatee.deploy(net, name="digits",
... example_input=X[:5], task="classifier")
converting PyTorch → ONNX (opset 18)
checking against the original… same answers
uploading · inspecting · building
✓ live https://mlg-digits-…onrender.com (version 1)
Sign in once with an access token, then call mlgatee.deploy(model). Keras and PyTorch models are converted in your own Python and checked against the original first.
Files up to 50 MB. Pickle, joblib, XGBoost .json and .ubj, .onnx and .tflite.
Exact versions. Packages are pinned from what the file itself says.
Notebook classes caught. A plain message explains the fix before anything builds.
Keys shown once. Stored only as a hash and the last four characters.
New key any time. The old key keeps working until the rebuild is live.
Probabilities too. Classifiers also answer /predict_proba.
Upload a file or deploy from your notebook. MLGatee handles the packages, the server and the key.
Free plan: one model, no card needed