Automating PERM Case Status Monitoring: My EB-3 Green Card Journey

My EB-3 Green Card Journey: Automating PERM Status Checks

The Immigration Process

Going through the U.S. employment-based immigration process is a journey that tests your patience in ways you never imagined. As someone pursuing an EB-3 visa (skilled worker category), I found myself navigating the complex maze of PERM labor certification - the first major step toward permanent residency.

Understanding PERM

PERM (Program Electronic Review Management) is the process where the Department of Labor certifies that there are no qualified U.S. workers available for the position offered to the foreign worker. For most employment-based green cards, including EB-3, this is a mandatory step. The process involves:

  1. Prevailing Wage Determination - Establishing the appropriate wage for the position
  2. Recruitment - Advertising the position to test the labor market
  3. Filing ETA Form 9089 - Submitting the PERM application
  4. The Wait - Processing times can range from several months to over a year

The Anxiety of Waiting

Once your PERM is filed, you’re assigned a case number (format: X-YYY-DDDDD-AAAAAA). Then comes the hardest part: waiting. The U.S. Department of Labor provides a website where you can check your case status, but manually checking every day quickly becomes tedious and anxiety-inducing.

I found myself obsessively refreshing the Flag DOL case status page, wondering if today would be the day my case moved forward. The process is opaque, timelines are unpredictable, and the stakes couldn’t be higher - your future in the country literally depends on this case.

The Solution: Automated PERM Monitoring

To preserve my sanity and get timely updates without the constant manual checking, I built a Python-based automation tool that checks my PERM status daily and sends notifications directly to my phone.

How It Works

The solution uses a headless browser approach to navigate the PERM status website, automatically handles the invisible reCAPTCHA, extracts the case status, and sends a push notification via Pushover.

Here’s the technical breakdown:

The Challenge: The PERM website uses Google’s invisible reCAPTCHA v3, which traditionally requires paid API services to solve programmatically. However, I discovered that modern headless browsers with proper stealth configurations can often bypass or auto-solve these challenges without additional costs.

The Architecture:

  • Playwright - For browser automation and handling the headless Chromium instance
  • Route Interception - The script intercepts the API calls made by the website to capture the case status directly
  • Pushover Integration - Sends formatted notifications to my phone with all relevant case details
  • Docker + Cron - Runs automatically once daily at a configurable time

Technical Implementation

The core script uses Playwright to:

  1. Launch a stealth-configured Chromium browser with anti-detection measures
  2. Navigate to the PERM case status page
  3. Intercept the caseStatus API endpoint to capture the JSON response
  4. Extract key details: case number, status, employer, job title, visa type, and submission date
  5. Format and send a Pushover notification
# Key approach: Intercept the API response instead of parsing HTML
async def handle_route(route, request):
    if "caseStatus" in request.url:
        await route.continue_()
        response = await request.response()
        if response:
            api_response = await response.json()
            # Process the case status data

The script runs as a Docker container with cron scheduling, making it a “set and forget” solution. It’s configured via environment variables, so no code changes are needed to customize it for different cases or notification preferences.

The Repository

You can find the complete project on GitHub: usa-green-card/perm-check

The repository includes:

  • Full Python script with Playwright automation
  • Docker and Docker Compose configuration
  • Setup instructions for Pushover integration
  • Configurable cron scheduling
  • Detailed logging for troubleshooting

Quick Setup

If you’re going through the same process and want to automate your status checks:

  1. Sign up for Pushover (free for 7 days, then $5 one-time per platform)
  2. Clone the repository
  3. Configure your .env file with your case number and Pushover credentials
  4. Run docker compose up -d

That’s it. You’ll receive a notification every day with your current PERM status.

Reflections on the Process

Going through the PERM/EB-3 process has been one of the most stressful experiences of my life. The uncertainty, the waiting, the lack of control - it takes a toll. But building this automation tool gave me back a small sense of control. Instead of anxiously checking the website multiple times a day, I now get a single daily update and can focus on actually living my life.

For anyone else going through this process: you’re not alone. The immigration system is complex and often frustrating, but with some technical creativity, you can at least automate away the repetitive parts of the waiting game.

Current status: Still waiting, but at least now I know immediately when something changes.


Note: This tool is for personal use only. Please be respectful of the DOL website and don’t abuse the service with excessive requests. The daily check frequency is sufficient for most cases, as PERM processing doesn’t happen in real-time anyway.