Quick answer: install Docker and the Compose plugin, download the official OWASP crAPI main branch, enter crAPI-main/deploy/docker, run docker compose pull, start the stack with docker compose -f docker-compose.yml --compatibility up -d, and open http://localhost:8888. Use http://localhost:8025 for local email.
Fastest OWASP crAPI Docker Setup
The official crAPI setup guide uses Docker Compose and the project’s main branch for the latest stable workflow. Check docker compose version first; the project requires Compose 1.27.0 or newer, although a current Docker installation is strongly preferred.
8888 and 8025 are available, and avoid changing the listen address from localhost.docker compose version mkdir -p "$HOME/crapi-lab" cd "$HOME/crapi-lab" curl -L -o crapi.zip https://github.com/OWASP/crAPI/archive/refs/heads/main.zip unzip -q crapi.zip cd crAPI-main/deploy/docker docker compose pull docker compose -f docker-compose.yml --compatibility up -d docker compose ps
docker compose version New-Item -ItemType Directory -Force "$HOME\crapi-lab" | Out-Null Set-Location "$HOME\crapi-lab" curl.exe -L -o crapi.zip https://github.com/OWASP/crAPI/archive/refs/heads/main.zip tar -xf .\crapi.zip Set-Location .\crAPI-main\deploy\docker docker compose pull docker compose -f docker-compose.yml --compatibility up -d docker compose ps Start-Process "http://localhost:8888"
Open the application
Use http://localhost:8888 on the same machine.
Open local email
Use http://localhost:8025 for MailHog.
Create your own login
Register a disposable lab identity and use a password that is not used anywhere else.
Check, do not guess
If the page is not ready, inspect docker compose ps and the logs instead of repeatedly reinstalling.
# Application and MailHog curl -I http://127.0.0.1:8888 curl -I http://127.0.0.1:8025 # Linux desktop xdg-open http://127.0.0.1:8888 xdg-open http://127.0.0.1:8025
What Is OWASP crAPI?
OWASP crAPI stands for Completely Ridiculous API. It is an intentionally vulnerable, API-driven training application maintained as an OWASP project. The fictional vehicle-owner platform uses microservices and realistic workflows so learners can study API security in a controlled environment.
crAPI is most useful when you begin with the normal application workflow. Register, verify the account, sign in, add a vehicle, and observe what a legitimate user can do. That baseline makes later authorization, property, authentication, data-exposure, resource-consumption, inventory, and business-flow findings easier to explain.
| Question | Direct answer | Practical next step |
|---|---|---|
| What is crAPI? | An intentionally vulnerable API training application | Run it only in an isolated lab |
| How is it installed? | Official Docker Compose deployment | Use the main-branch quick start |
| Where does it open? | localhost:8888 | Create a disposable account |
| Where does email appear? | localhost:8025 | Read messages in MailHog |
| What should I learn first? | The intended happy path | Compare expected and accepted behavior |
For broader context, see the top API security risks and controls and the focused OWASP API1 BOLA guide.
Install OWASP crAPI on Ubuntu, RHEL, or Windows
If Docker is already installed and working, use the quick start above. The longer examples below are for a new lab machine and follow Docker’s official repository-based installation methods. Review Docker’s current prerequisites before changing packages on a workstation that already runs containers.
Ubuntu
Use a supported 64-bit Ubuntu release and Docker’s official APT repository.
RHEL
Use a maintained RHEL release and Docker’s official RPM repository.
Windows 10 or 11
Use Docker Desktop with the Linux-container engine and supported virtualization.
Remote server
Not a beginner default. A vulnerable lab should not be reachable from untrusted networks.
Ubuntu copy-and-paste installation
These commands install Docker Engine and the Compose plugin from Docker’s official Ubuntu repository, verify the engine, and start the official crAPI stack.
sudo apt update
sudo apt install -y ca-certificates curl unzip
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world
mkdir -p "$HOME/crapi-lab"
cd "$HOME/crapi-lab"
curl -L -o crapi.zip https://github.com/OWASP/crAPI/archive/refs/heads/main.zip
unzip -q crapi.zip
cd crAPI-main/deploy/docker
sudo docker compose pull
sudo docker compose -f docker-compose.yml --compatibility up -d
sudo docker compose psOfficial reference: Install Docker Engine on Ubuntu.
Red Hat Enterprise Linux copy-and-paste installation
Docker’s current documentation supports maintained RHEL releases and recommends the RPM repository for normal installation and upgrades.
sudo dnf -y install dnf-plugins-core curl unzip sudo dnf config-manager --add-repo \ https://download.docker.com/linux/rhel/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker sudo docker run --rm hello-world mkdir -p "$HOME/crapi-lab" cd "$HOME/crapi-lab" curl -L -o crapi.zip https://github.com/OWASP/crAPI/archive/refs/heads/main.zip unzip -q crapi.zip cd crAPI-main/deploy/docker sudo docker compose pull sudo docker compose -f docker-compose.yml --compatibility up -d sudo docker compose ps
Official reference: Install Docker Engine on RHEL.
Windows PowerShell installation
Install Docker Desktop from Docker’s official Windows page, start Docker Desktop, and confirm that docker version can reach the Linux-container engine. Docker Desktop licensing terms may apply to larger organizations, so review the current terms before enterprise use.
docker version docker compose version New-Item -ItemType Directory -Force "$HOME\crapi-lab" | Out-Null Set-Location "$HOME\crapi-lab" curl.exe -L -o crapi.zip https://github.com/OWASP/crAPI/archive/refs/heads/main.zip tar -xf .\crapi.zip Set-Location .\crAPI-main\deploy\docker docker compose pull docker compose -f docker-compose.yml --compatibility up -d docker compose ps Start-Process "http://localhost:8888" Start-Process "http://localhost:8025"
Official reference: Install Docker Desktop on Windows.
Open crAPI, Create a Login, and Use MailHog
After the Compose services are healthy, open the application and local inbox on the same machine:
- crAPI application:
http://localhost:8888 - MailHog inbox:
http://localhost:8025
Recommended first-login sequence
- Open the application.
- Register a disposable local account with a made-up training identity.
- Use a password that is not reused anywhere else.
- Open MailHog when the application sends email.
- Return to crAPI, sign in, and complete the normal vehicle-owner workflow.
Why the happy path matters
The official repository recommends learning the intended workflow before attempting challenges. Record the caller identity, endpoint, object, request properties, response fields, and expected state change. This prevents false conclusions and gives each finding a defensible explanation.
Use the official crAPI happy-path guide and challenge descriptions as the source of truth.
OWASP crAPI GitHub, Branches, Releases, and Downloads
The official OWASP repository and project documentation should be your source of truth. Avoid repackaged archives and old forks unless a course explicitly requires a specific version.
| Source option | Best use | Recommendation |
|---|---|---|
| Main-branch ZIP | Latest stable workflow documented by the project | Best beginner default |
| Official Git clone | Source inspection and repeat use | Good for developers |
| Release or commit pin | Repeatable classes and workshops | Validate before standardizing |
| Develop branch | Unreleased changes and contributor testing | Not the beginner default |
| Third-party mirror | Legacy course dependency | Avoid unless required |
git clone https://github.com/OWASP/crAPI.git cd crAPI/deploy/docker docker compose pull docker compose -f docker-compose.yml --compatibility up -d
Official project
Official source
Latest stable release
As checked on August 4, 2026, GitHub marks Release 1.1.6 as latest; it was published September 30, 2025. Always verify the release page.
Official setup
The current setup documentation also includes optional chatbot and LLM-provider settings. Those are not required for the core lab. Do not place production API keys in a broadly reachable or shared training deployment.
A Beginner crAPI Walkthrough That Survives Version Changes
A useful walkthrough teaches a repeatable method rather than a list of challenge answers. Endpoints, sample data, and challenge wording can change, but the process of comparing expected behavior with accepted behavior remains valuable.
1. Create a disposable local account. 2. Complete the official happy path before any challenge. 3. Record the caller, method, endpoint, object, request, response, and state change. 4. Change one authorized lab input or sequence at a time. 5. Compare the result with the documented business rule. 6. Name the missing server-side control. 7. Record the minimum evidence a defender would need. 8. Reset the local lab when you need a clean state.
1. Learn expected behavior
Use the application normally and understand ownership, roles, fields, and state transitions.
2. Capture a baseline
Record one normal request and its response before changing anything.
3. Change one variable
Keep the experiment small so the result has a clear cause.
4. Write the remediation
Name the authorization, schema, validation, resource, or workflow control that should reject the behavior.
What makes a useful lab finding?
A strong finding explains the normal action, the single controlled change, the unexpected result, the business impact, the missing server-side control, and the minimum safe evidence needed for investigation. A screenshot or copied request alone is not enough.
| Challenge family | Question to ask | Defensive outcome |
|---|---|---|
| Object authorization | Can this identity access an object it does not own? | Server-side ownership and tenant checks |
| Property authorization | Can the client read or write a restricted property? | Allow-listed fields and policy checks |
| Authentication | Can a token, session, or recovery flow be misused? | Strong credential and token lifecycle |
| Resource consumption | Can one caller create disproportionate cost or load? | Bounded requests, quotas, and downstream limits |
| Business-flow abuse | Can valid actions be repeated or reordered for an invalid outcome? | State, velocity, and workflow controls |
What the crAPI Mass-Assignment Lesson Is Teaching
Mass assignment occurs when an application maps client-supplied properties to an internal object without restricting which properties the current caller may change. The real defect is not the presence of an extra JSON field; it is the server accepting a field that should be controlled by ownership rules, business logic, or a privileged role.
OWASP terminology has evolved. In the 2023 API Security Top 10, property-level authorization problems—including patterns previously discussed as mass assignment or excessive data exposure—are addressed under API3: Broken Object Property Level Authorization.
Safe learning method
- Complete the normal create or update action with your own local account.
- Record the properties the user interface legitimately sends.
- Compare the request with the response and any available schema.
- Classify each field as user-controlled, server-controlled, or role-controlled.
- Follow the official challenge description inside the local lab.
- Document the business impact without testing any external system.
- Write the allow-list, property authorization, validation, and audit controls that should prevent the issue.
// Bind only fields this operation and caller may change const allowedFields = policy.writableFields(currentUser, existingRecord); const update = pick(request.body, allowedFields); rejectUnknownProperties(request.body, allowedFields); authorizePropertyChanges(currentUser, existingRecord, update); validateStateTransition(existingRecord, update); auditUnexpectedFieldAttempts(currentUser, request.body);
For deeper defensive coverage, see the mass-assignment API vulnerability guide and broken object property-level authorization.
OWASP crAPI Troubleshooting: Page Not Loading, Ports Busy, or Containers Unhealthy
crAPI runs several services, so a failed page does not always mean the installation is broken. Start with the Compose status, rendered configuration, and service logs. Reinstalling immediately can hide the real error.
docker compose ps docker compose config docker compose logs --tail=250 docker version docker compose version # Linux: check whether expected ports are already in use sudo ss -lntp | grep -E ':8888|:8025' # Windows PowerShell: check expected ports Get-NetTCPConnection -LocalPort 8888,8025 -ErrorAction SilentlyContinue # Re-pull images and recreate after reviewing the logs docker compose pull docker compose -f docker-compose.yml --compatibility up -d --force-recreate
| Symptom | Likely cause | Best next check |
|---|---|---|
localhost:8888 does not open | Services are starting or one dependency is unhealthy | Status, config, and logs |
| Port 8888 or 8025 is occupied | Another process owns the host port | Inspect listeners before editing configuration |
docker compose is unavailable | Compose plugin missing or Docker installation is outdated | Use official Docker installation docs |
| Permission denied on Linux | The current user cannot access the Docker socket | Use sudo or review Docker post-install guidance |
| Windows cannot reach the engine | Docker Desktop or its Linux-container backend is not ready | Run docker version and check Docker Desktop |
| Old accounts remain | Named volumes were preserved | Use down -v only for an intentional reset |
Stop, restart, or reset the lab
docker compose ps docker compose logs --tail=150 # Stop without deleting data docker compose stop # Start the same lab later docker compose start # Remove containers and networks, preserve named volumes docker compose down # Full reset: remove containers and named volumes docker compose down -v
From crAPI Lab Finding to Production API Control
crAPI is a training environment, not a production blueprint. Its value is in connecting one controlled finding to the design, testing, deployment, monitoring, and response controls that a real API needs.
Authorization evidence
Capture caller identity, tenant, object relationship, operation, decision, and response—without copying secrets into alerts.
Property governance
Use response models, writable-field policies, schema validation, and change review to prevent silent field drift.
Resource and workflow controls
Apply per-operation limits, downstream-cost controls, state validation, and identity-aware velocity rules.
Inventory and ownership
Discover endpoints, versions, hosts, and owners so deprecated or undocumented APIs do not escape testing and monitoring.
| Lab activity | Engineering control | Runtime evidence |
|---|---|---|
| Compare access between two local accounts | Object and tenant authorization on every request | Caller, object, owner, decision, endpoint |
| Test unexpected properties | DTOs, schemas, writable-field policy | Unexpected-field and schema-drift events |
| Repeat or reorder a workflow | State machine, limits, and business rules | Identity-aware sequence and velocity context |
| Review a sensitive response | Data minimization and property authorization | Sensitive-data class, not raw values |
| Find an undocumented route | Inventory, ownership, and retirement process | Host, route, version, first seen, owner |
The practical model is not “testing versus monitoring.” It combines secure design, contract and authorization testing, deployment hardening, runtime visibility, controlled enforcement, incident response, and feedback into development. See API security testing versus runtime monitoring and API runtime visibility.
Official and Current OWASP crAPI References
Commands, release details, ports, and challenge behavior can change. Verify them against these primary sources:
- OWASP crAPI project page
- Official OWASP crAPI GitHub repository
- Official latest release page
- Official crAPI setup guide
- Official application happy path
- Official challenge descriptions
- OWASP ZAP crAPI test-app guidance
- Docker Engine on Ubuntu
- Docker Engine on RHEL
- Docker Desktop on Windows
- OWASP API Security Top 10:2023
Conclusion: Build a Local crAPI Lab You Can Reproduce
The best beginner setup is simple and repeatable: use the official Docker workflow, keep the vulnerable application on localhost, open localhost:8888, create a disposable account, use MailHog on localhost:8025, and complete the intended workflow before starting a challenge.
The lasting skill is not memorizing a challenge answer. It is learning how to establish expected behavior, make one controlled change, explain the missing server-side control, and identify the minimum evidence that engineering and security teams would need in production.
OWASP crAPI FAQ
What is OWASP crAPI?
OWASP crAPI, or Completely Ridiculous API, is an intentionally vulnerable API training application maintained as an OWASP project. It uses a microservices-based vehicle-owner application to teach authorization, authentication, data exposure, input handling, resource use, inventory, and business-flow risks in an isolated lab.
What is the fastest safe way to install OWASP crAPI?
Install Docker and the Docker Compose plugin, download the official main-branch ZIP from OWASP/crAPI, extract it, enter crAPI-main/deploy/docker, run docker compose pull, and start the stack with docker compose -f docker-compose.yml --compatibility up -d. Keep the lab local or on an isolated authorized network.
Which URLs open crAPI and MailHog?
Open http://localhost:8888 for the crAPI application and http://localhost:8025 for MailHog on the same machine. MailHog displays registration, recovery, and notification messages generated by the local lab.
How do I log in to OWASP crAPI?
Open the local application, register a disposable lab account, check MailHog when an email is generated, and then sign in with the credentials you created. Do not reuse a real password or depend on old, version-specific default credentials.
What is the latest stable OWASP crAPI release?
As checked on August 4, 2026, the official GitHub Releases page marks Release 1.1.6 as the latest stable release. It was published on September 30, 2025. Verify the Releases page before pinning a workshop because the latest version can change.
Should I use the main branch or a release tag?
The official setup guide uses the main branch for the latest stable Docker workflow. For a repeatable classroom or workshop build, review the official release notes and pin a tested release or commit so every participant uses the same files and images.
How do I install OWASP crAPI on Ubuntu?
Use a supported 64-bit Ubuntu release, install Docker Engine and the Docker Compose plugin from Docker’s official APT repository, verify Docker, download the official crAPI main-branch ZIP, and start the Compose stack from crAPI-main/deploy/docker.
How do I install OWASP crAPI on RHEL?
Use a maintained RHEL release supported by Docker, configure Docker’s official RPM repository, install Docker Engine and the Compose plugin, enable the service, verify it, then download and start the official crAPI Docker deployment.
How do I install OWASP crAPI on Windows?
Install Docker Desktop from Docker’s official Windows documentation, start the Linux-container engine, download and extract the official crAPI main-branch ZIP in PowerShell, run the Compose commands, and open the local application and MailHog URLs.
Is it safe to expose crAPI to the public internet?
No. crAPI is intentionally vulnerable and should remain on your own machine or an isolated, explicitly authorized training network. Do not port-forward it, publish it through a cloud load balancer, or bind it broadly unless a controlled lab design provides equivalent isolation.
How do I troubleshoot an unhealthy crAPI container?
Run docker compose ps, docker compose config, and docker compose logs --tail=250 from the deploy/docker directory. Confirm Docker and Compose versions, check whether ports 8888 or 8025 are already in use, and recreate the stack only after reviewing the failing service logs.
How do I reset OWASP crAPI?
Run docker compose down to remove containers while preserving named volumes. Run docker compose down -v only when you intentionally want to delete local accounts and progress, then pull and start the stack again.
Turn Lab Lessons Into Verifiable API Controls
Use crAPI to understand vulnerability patterns, then evaluate whether your real API program can inventory endpoints, verify authorization, control properties and workflows, protect sensitive responses, and produce investigation-ready evidence.
