Programming — entry 003 of 4

Judge0 CE

Verified Jul 2026

Judge0 CE is an open-source sandboxed code-execution engine, and ce.judge0.com is its free public demo instance covering 60-plus compiler/language versions via a REST API for creating and polling submissions. A live, fully unauthenticated request — no token, no key — both listed supported languages and executed a real Python submission end-to-end, confirming the public instance ships with authentication disabled by default. Judge0's own docs steer production users toward a paid RapidAPI-hosted plan or self-hosting instead, but the tracked ce.judge0.com endpoint itself remains free to call directly.

Judge0 CE is an open-source sandboxed code-execution engine, and `ce.judge0.com` is its free public demo instance. A live, fully unauthenticated `POST /submissions?wait=true` in this run really compiled and ran a Python one-liner and handed back real stdout, timing, and memory figures — no token, no key, no signup.

code-executionsandboxed-executioncompilersonline-judge
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score74out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 74 on greatapis.com
<a href="https://greatapis.com/api/judge0-ce/"><img src="https://greatapis.com/badge/judge0-ce.svg" alt="Scored 74 on greatapis.com"></a>

Auth quickstart

  1. No API key or signup required on this public demo instance — every probe in this run, including submission creation and result polling, went through with no auth header at all. Judge0's own docs steer production use toward a paid RapidAPI-hosted plan or self-hosting instead of leaning on this shared demo instance.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Execute Python and wait for the result

POSThttps://ce.judge0.com/submissions?base64_encoded=false&wait=true

Content-Type: application/json

{"language_id":71,"source_code":"print(1+1)"}

200 application/json; charset=utf-8

{"stdout":"2\n","time":"0.025","memory":3212,"stderr":null,"token":"c53ff60f-96d2-4250-ba72-463ecffdb756","compile_output":null,"message":null,"status":{"id":3,"description":"Accepted"}}

Developer reference

Base URLhttps://ce.judge0.com

Gotchas & limits

  • `wait=true` blocks and returns the finished result inline, but the two-step flow the docs recommend for anything beyond a quick demo is `POST /submissions` (no `wait`) — which returns HTTP 201 with just `{"token":"..."}` — followed by `GET /submissions/{token}?base64_encoded=false` to poll for the result; both steps were confirmed live in this run, with the poll returning the same shape as the synchronous call once finished.
  • A failed run is still HTTP 200, not an error status: a live submission of `print(1/0)` returned `"status":{"id":11,"description":"Runtime Error (NZEC)"}` with the real Python traceback in `stderr` and `"message":"Exited with error status 1"` — check `status.id` (3 is `Accepted`), not the HTTP status code, to know whether a submission actually succeeded.
  • An invalid `language_id` is the one case that does surface as a real HTTP error: a live POST with `language_id: 999999` returned HTTP 422 `{"language_id":["language with id 999999 doesn't exist"]}`. `GET /languages` lists exactly 71 valid ids/names live, including several compiler builds of the same language — 7 of the 71 are named `C (...)`: three Clang builds (ids 75, 104, 110) and four GCC builds (ids 48, 49, 50, 103) — so "the C language" is not one id and picking the wrong build silently changes which compiler runs your code.
  • CORS headers differ by request type: a live plain GET/POST response carries `access-control-allow-origin: *` (with `vary: Origin`), but a live `OPTIONS` preflight instead echoes the request's exact `Origin` value back (`access-control-allow-origin: https://example.com` for an `Origin: https://example.com` preflight) rather than returning `*` — both were confirmed on this run's own probes.
  • The default `GET /submissions/{token}` response only returns a handful of fields (stdout/stderr/time/memory/status/etc.); adding `&fields=*` to the same live call returned the full internal record instead, including `cpu_time_limit`, `memory_limit`, `wall_time_limit`, and `created_at`/`finished_at` timestamps not present in the default response.