OWASP crAPI Install Guide: Docker, Ubuntu, RHEL & Windows
OWASP crAPI Install Guide for Docker, Linux & Windows
Updated July 2026 · Official OWASP sources prioritized

OWASP crAPI Install Guide: Docker, Ubuntu, RHEL & Windows

Install the official OWASP crAPI lab with Docker, open the application and MailHog locally, create a disposable account, and troubleshoot the stack without relying on outdated walkthroughs. This guide covers Ubuntu, RHEL, and Windows while keeping the intentionally vulnerable lab isolated.

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.

Lab safety comes first: crAPI is deliberately vulnerable. Keep it on your own computer or an isolated, explicitly authorized training network. Do not expose it through router port forwarding, a public cloud address, a shared office network, or a public tunnel.

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.

Before running the commands: use a clean lab machine or VM when possible, make sure ports 8888 and 8025 are available, and avoid changing the listen address from localhost.
Linux or macOS quick startUse when Docker and Compose are already installed
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
Windows PowerShell quick startStart Docker Desktop and wait until the engine reports ready
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.

Check the local servicesUseful before opening the browser
# 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
OWASP crAPI Docker installation lab running on localhost

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.

QuestionDirect answerPractical next step
What is crAPI?An intentionally vulnerable API training applicationRun it only in an isolated lab
How is it installed?Official Docker Compose deploymentUse the main-branch quick start
Where does it open?localhost:8888Create a disposable account
Where does email appear?localhost:8025Read messages in MailHog
What should I learn first?The intended happy pathCompare 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.

Ubuntu: install Docker and run crAPIUse on a supported 64-bit Ubuntu release
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 ps

Official 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.

RHEL: install Docker and run crAPIUse on a maintained RHEL release supported by Docker
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.

Windows: download and run crAPIRun after Docker Desktop is ready
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.

OWASP crAPI microservices stack on Linux and Windows with Docker Compose

Open crAPI, Create a Login, and Use MailHog

After the Compose services are healthy, open the application and local inbox on the same machine:

Recommended first-login sequence

  1. Open the application.
  2. Register a disposable local account with a made-up training identity.
  3. Use a password that is not reused anywhere else.
  4. Open MailHog when the application sends email.
  5. Return to crAPI, sign in, and complete the normal vehicle-owner workflow.
Do not depend on default credentials from old walkthroughs. The most reliable beginner path is to create your own account, because sample users and challenge details may change between releases.

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 optionBest useRecommendation
Main-branch ZIPLatest stable workflow documented by the projectBest beginner default
Official Git cloneSource inspection and repeat useGood for developers
Release or commit pinRepeatable classes and workshopsValidate before standardizing
Develop branchUnreleased changes and contributor testingNot the beginner default
Third-party mirrorLegacy course dependencyAvoid unless required
Clone the official crAPI repositoryUseful for source review and controlled updates
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

OWASP crAPI project page

Official source

OWASP/crAPI on GitHub

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.

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.

Reusable crAPI learning workflowCopy this into your lab notes
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 familyQuestion to askDefensive outcome
Object authorizationCan this identity access an object it does not own?Server-side ownership and tenant checks
Property authorizationCan the client read or write a restricted property?Allow-listed fields and policy checks
AuthenticationCan a token, session, or recovery flow be misused?Strong credential and token lifecycle
Resource consumptionCan one caller create disproportionate cost or load?Bounded requests, quotas, and downstream limits
Business-flow abuseCan valid actions be repeated or reordered for an invalid outcome?State, velocity, and workflow controls
OWASP crAPI learning workflow for authorization property and business-flow 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

  1. Complete the normal create or update action with your own local account.
  2. Record the properties the user interface legitimately sends.
  3. Compare the request with the response and any available schema.
  4. Classify each field as user-controlled, server-controlled, or role-controlled.
  5. Follow the official challenge description inside the local lab.
  6. Document the business impact without testing any external system.
  7. Write the allow-list, property authorization, validation, and audit controls that should prevent the issue.
Defensive property-binding patternIllustrative remediation pseudocode
// 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.

crAPI troubleshooting commandsRun from the deploy/docker directory
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
SymptomLikely causeBest next check
localhost:8888 does not openServices are starting or one dependency is unhealthyStatus, config, and logs
Port 8888 or 8025 is occupiedAnother process owns the host portInspect listeners before editing configuration
docker compose is unavailableCompose plugin missing or Docker installation is outdatedUse official Docker installation docs
Permission denied on LinuxThe current user cannot access the Docker socketUse sudo or review Docker post-install guidance
Windows cannot reach the engineDocker Desktop or its Linux-container backend is not readyRun docker version and check Docker Desktop
Old accounts remainNamed volumes were preservedUse down -v only for an intentional reset

Stop, restart, or reset the lab

Manage and reset the crAPI stackThe full reset deletes local accounts and progress
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
Do not fix a port conflict by making the lab public. The official setup documents an option to bind to all interfaces, but that setting is inappropriate for an ordinary beginner machine. Keep localhost unless an isolated lab architecture and explicit authorization require something else.

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 activityEngineering controlRuntime evidence
Compare access between two local accountsObject and tenant authorization on every requestCaller, object, owner, decision, endpoint
Test unexpected propertiesDTOs, schemas, writable-field policyUnexpected-field and schema-drift events
Repeat or reorder a workflowState machine, limits, and business rulesIdentity-aware sequence and velocity context
Review a sensitive responseData minimization and property authorizationSensitive-data class, not raw values
Find an undocumented routeInventory, ownership, and retirement processHost, 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:

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.

© 2026 Ammune Security. Practical guidance for safer applications and APIs.