Introduction
Summer presents an ideal opportunity to advance professional development through substantive technical projects. A personalized job search system serves as both a practical tool and a demonstration of engineering expertise. This project integrates multiple technical domains, combining API interactions with data processing techniques to transform real-world data streams into actionable insights.
This guide outlines the development of an automated job search system that showcases software engineering capabilities while delivering practical value. The system demonstrates expertise in API integration, data processing, and scalable system design - key competencies valued in senior engineering roles.
Prerequisites
Technical Requirements
This project requires basic familiarity with Unix-based environments, and can be implemented on any recent version of Ubuntu or other Linux distribution. Command line experience should include fundamental operations like file manipulation and running scripts. Some experience working with APIs is helpful, as the project involves making basic HTTP requests to a job posting API.
The tutorial covers all necessary technical concepts, making it accessible while still creating a robust and practical tool. Knowledge of Bash and basic HTTP requests will be sufficient to follow along and implement the core functionality.
System Setup
We begin by updating the system package lists to ensure access to the latest software versions. The essential tools needed include curl
for making HTTP requests, jq
for sophisticated JSON processing, and mailutils
for handling email notifications. These components work together to create a robust pipeline for fetching, processing, and delivering job information. Understanding each tool's role and configuration options is crucial for building a maintainable system.
# Update package lists
sudo apt update
# Install essential tools
sudo apt install -y curl jq mailutils
API Access Setup
Access to the Daily International Job Posting API is managed through the RapidAPI platform. Follow these steps to set up your account in RapidAPI and subscribe to the API:
-
Create a RapidAPI Account:
- Visit RapidAPI
- Sign up and complete the registration process
- Navigate to the API marketplace
-
Subscribe to the API:
- Go to the Daily International Job Posting API
- Select the Basic plan (25 free requests/month)
- Save your API key securely
Understanding the API
Techmap's Daily International Job Postings API provides comprehensive access to global job data from the last 3 months. It returns structured job postings and supports queries with various filtering parameters to narrow search results such as date of posting, location, occupation, and required skills.
You can find the documentation for constructing API requests on RapidAPI's Playground for the Paginated Search or the API's OpenAPI documentation page. We will use the /api/v2/jobs/search
endpoint with the following query parameters:
dateCreated
for filtering jobs posted on a specific date (day or month),countryCode
for selecting the country (using the ISO3166 codes),city
for specifying a particular city,occupation
for job type, (using many synonyms)skills
for required expertise, andpage
to paginate through larger lists of jobs.
These parameters help us in building a personalized job posting agent for a specific type of occupation in a specific area. The API returns data in Schema.org Microdata format using JSON, which is ideal for parsing, further processing, or direct use in webpages to improve SEO.
Implementation
Core Script Development
The job search automation script utilizes basic Unix bash commands to handle API interactions, data parsing, and result formatting. The following script processes search parameters systematically, validates responses, and outputs normalized job listings in a structured format.
#!/bin/bash
# Configuration
RAPIDAPI_KEY='your-api-key'
API_URL="http://localhost:3001/api/v2/jobs/search"
HEADERS=(
-H "X-RapidAPI-Key: $RAPIDAPI_KEY"
-H "X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com"
)
SMTP_SERVER="smtp.gmail.com"
SMTP_FROM="your.email@gmail.com"
SMTP_PASS='YOUR APP PASSWORD'
EMAIL_TO="your.email@gmail.com"
EMAIL_SUBJECT="New Senior Job Postings Found!"
# Advanced settings for senior positions
REQUEST_LIMIT=2
LAST_MONTH=$(date -v-1m +"%Y-%m" 2>/dev/null || date -d "last month" +"%Y-%m")
# Initialize data structures
ALL_JOBS=()
MAX_PAGES=1
PAGE=1
# Main job fetching loop
while (( PAGE <= MAX_PAGES )); do
# echo "Fetching senior positions - Page $PAGE for $CURRENT_YEAR_MONTH..."
RAW_JSON=$(curl -s -G "$API_URL" \
--data-urlencode "dateCreated=$LAST_MONTH" \
--data-urlencode "countryCode=us" \
--data-urlencode "occupation=programmer" \
--data-urlencode "title=Senior" \
--data-urlencode "page=$PAGE" \
"${HEADERS[@]}" | jq -c .)
# Process response metadata
TOTAL_COUNT=$(printf "%s" "$RAW_JSON" | jq -r '.totalCount // 0')
MAX_PAGES=$(( (TOTAL_COUNT + 9) / 10 ))
((MAX_PAGES > $REQUEST_LIMIT)) && MAX_PAGES=$REQUEST_LIMIT
# echo "Located $TOTAL_COUNT positions across $MAX_PAGES pages"
# Extract jobs and store each job separately
while IFS= read -r job; do
ALL_JOBS+=("$job")
done < <(printf "%s" "$RAW_JSON" | jq -c '.result[]')
((PAGE++))
done
echo "Downloaded ${#ALL_JOBS[@]} of $TOTAL_COUNT job postings using $MAX_PAGES requests"
# Aggregate results
COMBINED_JOBS=$(printf "%s\n" "${ALL_JOBS[@]}" | jq -s -c '.')
printf "%s" "$COMBINED_JOBS" > senior_jobs.json
# Generate enhanced HTML report
HTML_TABLE=$(jq -r 'to_entries
| map(" <tr class=\"job-row\">
<td class=\"date\">\(.value.dateCreated | split("T") | .[0])</td>
<td class=\"title\">\(.value.title)</td>
<td class=\"company\">\(.value.company)</td>
<td class=\"location\">\(.value.city), \(.value.state)</td>
<td class=\"url\"><a href=\"\(.value.jsonLD.url)\">Link</a></td>
</tr>")
| join("\n")
' senior_jobs.json)
# Create professional email template
HTML_CONTENT="
<!DOCTYPE html>
<html>
<head>
<style>
table { width: 100%; border-collapse: collapse; }
th, td { padding: 12px; text-align: left; }
th { background-color: #2c3e50; color: white; }
tr:nth-child(even) { background-color: #f2f2f2; }
.job-row:hover { background-color: #e9f5ff; }
.url a { color: #3498db; text-decoration: none; }
</style>
</head>
<body>
<h2>Senior Developer Positions - Latest Opportunities</h2>
<table>
<tr>
<th>Posted Date</th>
<th>Position</th>
<th>Company</th>
<th>Location</th>
<th>Application</th>
</tr>
$HTML_TABLE
</table>
</body>
</html>"
# Send formatted email
curl -s --ssl-reqd \
--url "smtps://$SMTP_SERVER:465" \
--user "$SMTP_FROM:$SMTP_PASS" \
--mail-from "$SMTP_FROM" \
--mail-rcpt "$EMAIL_TO" \
--upload-file <(echo -e "From: $SMTP_FROM
To: $EMAIL_TO
Subject: $EMAIL_SUBJECT
MIME-Version: 1.0
Content-Type: text/html
$HTML_CONTENT")
echo "Job search complete - Results sent to $EMAIL_TO"
To run the script on Ubuntu, first make it executable using the chmod
command. For example, if your script is named script.sh
, run chmod +x script.sh
to grant execute permissions. Once the script is executable, you can run it by typing ./script.sh
in the terminal.
Future Enhancements
The job search automation system you’ve built is a solid foundation, but there are numerous ways to enhance its functionality, scalability, and usefulness. Below are some advanced features and improvements that can elevate the system to a production-grade tool, while also showcasing your ability to think like a senior or lead engineer.
- Query Optimization for Higher Positions: Modify the API query to target lead developer positions by adding synonyms and advanced filters.
- Daily Execution with Cron: Schedule the script to run daily using cron for faster reaction times to new job postings.
- Caching Job Postings: Implement a caching mechanism to store job postings locally, reducing redundant API calls and improving performance.
- Cron-Based Search Agents with Synonyms: Create multiple cron jobs with different search parameters (e.g., location, skills, or job titles) to cover a wider range of opportunities.
- Salary Analysis: Extract and analyze salary data from job postings to identify trends and negotiate better offers.
- Email Customization and Personalization: Customize email notifications with personalized recommendations, better formatting, or more insights.
- Dashboard and Visualization: Build a web-based dashboard to visualize job trends, salary data, and application status.
- Skill Gap Analysis: Analyze job descriptions to identify in-demand skills and recommend areas for skill development.
Conclusion
This tutorial presents a powerful and customizable approach to automating job searches for senior developer positions. By integrating API-based job retrieval with advanced filtering mechanisms, the system provides job seekers with highly relevant listings tailored to their specific expertise and career aspirations.
Future enhancements could include the daily execution for faster reaction times, automated search agents with more synonyms, integration of AI-powered job matching, and salary trend analysis, further refining the job search process. By building on this foundation, professionals can continuously adapt their job search strategies to the evolving technology landscape, positioning themselves for success in competitive job market.