name: content-generator
description: Collect job posting data from the internet and post it to the Center project website. Use this skill when: (1) searching for job postings using specific keywords, (2) filtering and processing collected job data, (3) posting job data to the Center website with proper field mapping.
Content Generator
Collect data from the internet and post it to the Center project website.
Tools
The following tools are used to search and collect content from the internet:
- Web Search: Search for relevant job postings on the internet based on keywords.
- Web Fetch: Fetch and analyze detailed job information from searched URLs.
Parallel Processing with Multiple Agents
IMPORTANT: To maximize efficiency and speed, use as many agents as possible simultaneously for parallel work.
Parallel Processing Rules:
- Multiple searches: When searching for job postings across different keywords or regions, launch multiple search agents in parallel
- Concurrent fetching: When fetching detailed information from multiple URLs, process them concurrently using multiple agents
- Batch verification: When verifying contact information for multiple job postings, run verification tasks in parallel
- Simultaneous API calls: When checking for duplicates or registering multiple job postings, execute independent API calls concurrently
Example Parallel Workflow:
┌─────────────────────────────────────────────────────────────┐
│ Agent 1: Search "Singapore software engineer jobs" │
│ Agent 2: Search "Singapore data analyst jobs" │
│ Agent 3: Search "Singapore product manager jobs" │
│ Agent 4: Search "Singapore DevOps engineer jobs" │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Agent 1: Fetch details from URL 1, 2, 3 │
│ Agent 2: Fetch details from URL 4, 5, 6 │
│ Agent 3: Fetch details from URL 7, 8, 9 │
└─────────────────────────────────────────────────────────────┘
Performance Tip: Always prefer launching multiple agents in a single message with multiple Task tool calls rather than sequential processing.
API Reference
The Center website API list can be found at the following URL:
- API List:
https://sonub.com/api.php?func=function_list
API Authentication
When calling APIs that require authentication (such as post creation and modification), use the following API key:
apikey-168-be0e8270a7712129a8112faa270328f2
API Usage Example
Get My Information:
curl -s "https://sonub.com/api.php?func=my&token=apikey-168-be0e8270a7712129a8112faa270328f2" | jq .
Get Post by ID:
curl -s "https://sonub.com/api.php?func=get_post&post_id=6178" | jq .
Note: Pass the above API key to the token parameter when making API calls for authentication.
Workflow
- Search for job postings from the internet using specific keywords (Web Search)
- Fetch detailed information from search results (Web Fetch)
- Check for duplicates: Query the database via API to verify the job posting doesn't already exist
- Filter and process the collected job data (skip duplicates)
- Map data to required fields (see reference)
- Output as JSON format for posting to Center website
Duplicate Prevention
IMPORTANT: Job postings that already exist in the database must not be registered again.
Duplicate Check Process
-
After searching job data: After collecting job information via Web Search/Fetch, you must query the existing database through the API.
-
Duplicate Criteria:
- Same company name (company_name)
- Same position (position)
- Same location (location)
- Similar title (title)
- Same origin URL (origin_source_url)
-
Query existing data via API: Check for duplicates by querying the existing post list in the job posting category.
-
When duplicate found: Skip that job posting and process the next data.
Data Processing Rules
IMPORTANT: When collecting job posting data from the internet, ALL data MUST be processed and mapped according to the field specifications defined in job-hiring.md.
Search Based on Today's Date (Required)
ABSOLUTE RULE
Job posting search and registration must only search and register job postings that are currently hiring based on today's date.
Search Rules:
- Today's date basis: Always include today's date when searching (e.g., "Singapore job hiring January 23, 2026")
- Currently hiring: Only collect job postings with deadlines that haven't passed
- Latest postings first: Prioritize recently posted job openings
Do NOT Register:
- Job postings with deadlines that have already passed
- Job postings that are too old (more than 30 days since posting)
- Postings marked as "Closed", "Filled", "No longer accepting applications", etc.
Warning: Registering expired job postings will confuse users.
Only register job postings that are currently accepting applications.
Use Only Truthful Information (Top Priority Principle)
Absolute Rules:
- Information searched from the internet must only record facts
- Creating fake information or guessing is strictly prohibited
- If information is unclear or cannot be found, leave the field empty or blank
- Only extract information explicitly stated on the web page; do not fabricate non-existent information
Contact Information Search Priority (Required)
ABSOLUTE RULE
When searching for job information on the internet, only collect job postings that contain at least 1 piece of contact information.
Contact Information includes:
contact_person (Contact person name)
contact_phone (Contact phone number)
application_email (Application email)
application_url (Application URL)
Search and Filtering Rules:
- Priority search: Prioritize job postings that explicitly state contact information (email, phone number, contact person name, application URL)
- Filtering: Skip job postings with no contact information at all
- Minimum condition: Must have at least 1 of the above contact information to be collected
Why is this important?
Job postings without contact information have no practical value as users have no way to apply.
Correct Contact Extraction Location (Top Priority Rule)
ABSOLUTE RULE - Do NOT Extract Wrong Contact Information
When viewing job postings on job sites (job portals), only extract the actual contact information for that specific job posting.
Understanding Page Structure:
Most job sites have the following layout:
+-------------------------------------------------------------+
| [Header] Job site logo, search bar |
+--------------+----------------------------------------------+
| | |
| [Sidebar] | [Main Content Area] |
| | |
| - Company A | ████████████████████████████████ |
| - Company B | █ Actual job posting content █ |
| - Company C | █ ✅ Extract contact ONLY here! █ |
| - Company D | █ - Contact: John Doe █ |
| | █ - Email: hr@target-company.com █ |
| | ████████████████████████████████ |
| | |
+--------------+----------------------------------------------+
| [Footer] Job site contact info, customer service |
| ❌ Do NOT extract contact from here! |
+-------------------------------------------------------------+
✅ Contact to Extract (Correct Location):
- Contact information in the main content area for that specific job posting
- Contact person, email, phone number explicitly stated in the job posting body
- Contact information in "How to Apply", "Contact", "Contact Person" sections
❌ NEVER Extract (Wrong Location):
- Left sidebar: List of other companies' job postings - these are OTHER companies' contacts!
- Page footer: The job site (job portal) itself's contact info - this is the job site's customer service!
- Header area: Job site's general inquiry contact
- Ad banners: Sponsor company's contact information
Common Mistakes:
| Wrong Extraction | Correct Extraction |
|---|
| ❌ Glassdoor customer service email | ✅ HR email within the job posting |
| ❌ Indeed main phone number | ✅ Hiring company's contact person phone |
| ❌ Sidebar other company's contact | ✅ Main content's target company contact |
| ❌ Page footer "Contact Us" | ✅ "Apply" section within job posting |
Warning: Extracting wrong contact information is a serious problem!
If you register the job site's contact as the hiring company's contact:
- Users will send applications to the wrong place
- Trust and service quality will decline
- This is an absolutely unacceptable mistake!
Verification Method:
- Confirm the extracted contact belongs to the company that posted the job
- Verify the email domain matches the hiring company's domain
- Confirm the contact was extracted from the main content area
Contact Information Processing Rules
When contact information is partially missing:
contact_person (Contact name): If not available → Enter "000"
contact_phone (Contact phone): If not available → Enter "000"
application_email (Application email): If not available → Enter "000"
origin_source_url is REQUIRED:
- When contact information is partially missing, you must enter the original job posting URL in
origin_source_url
- This allows users to check for additional contact information on the original website
- origin_source_url is the original page URL of that job posting
{
"contact_person": "000",
"contact_phone": "000",
"application_email": "hr@company.com",
"origin_source_url": "https://example.com/job/12345"
}
Contact Verification Before Registration (Required)
MOST IMPORTANT RULE
Before registering job information via API, you must perform the following verification procedure:
Verification Process:
- Check JSON data: Review the contact information in the generated JSON data
- Revisit original site: Fetch the original job posting page stored in
origin_source_url again via Web Fetch
- Verify contact match: Compare whether the JSON contact information exactly matches the original site's information
- Correct or discard if mismatched: If they don't match, correct to the original information, or discard the data if verification is impossible
Fields to Verify:
contact_person (Contact person name)
contact_phone (Contact phone number)
application_email (Application email)
application_url (Application URL)
company_name (Company name)
Warning: Registering fake information is a serious problem!
Incorrect contact information can cause serious harm to users.
Always verify accuracy by comparing with the original site.
Actions When Verification Fails:
- Contact differs from original → Do NOT register, correct to original information and re-verify
- Cannot access original site → Hold registration, request user confirmation
Data Completeness Verification Before Registration (Required)
ABSOLUTE RULE
Before registering job information via API, you must check the completeness of the JSON data.
Job postings with insufficient content must NOT be registered!
Required Check Items:
| Category | Required Fields | Minimum Requirement |
|---|
| Basic Info | title, position, location | All required |
| Work Conditions | employment_type, work_hours, work_days | At least 1 |
| Qualifications | requirements, responsibilities | At least 1 |
| Salary Info | salary or min_salary/max_salary | Recommended (state "Negotiable" if unavailable) |
Registration NOT Allowed If:
If any of the following conditions apply, do NOT register:
- ❌
title (Title) is empty or too short (less than 10 characters)
- ❌
position (Position) is empty
- ❌
location (Location) is empty
- ❌ Both
responsibilities (Job duties) AND requirements (Qualifications) are empty
- ❌ All work condition fields are empty (
employment_type, work_hours, work_days)
- ❌ Overall data is too sparse (fewer than 5 fields populated)
Warning: Job postings with insufficient content are worthless to users!
Job postings lacking core information like work conditions, qualifications, and job duties
are not worth registering as users cannot determine whether to apply.
Actions When Verification Fails:
- Insufficient required information → Do NOT register, skip that job posting
- If additional information can be obtained from original site → Supplement information and re-verify
Save Search Results (Required)
Searched job information must be saved to local files.
Save searched information to JSON files in the search-results/ folder to:
- Check if data was previously searched
- Use as backup data
- Track search/verification dates
File Saving Rules:
| Item | Rule |
|---|
| Save Path | search-results/ folder |
| Filename Format | {company-name}-{country-code}.json |
| Company Name Processing | Lowercase, spaces converted to hyphens (-), remove special characters |
| Country Code | 2-letter lowercase (e.g., kr, sg, ph, jp) |
Filename Examples:
samsung-electronics-kr.json
grab-holdings-sg.json
jollibee-foods-ph.json
JSON File Structure:
{
"company_name": "Samsung Electronics",
"country_code": "kr",
"search_date": "2026-01-23",
"verified_date": "2026-01-23",
"status": "verified",
"jobs": [
{
"title": "[Samsung Electronics] Software Developer Hiring",
"position": "Software Developer",
"origin_source_url": "https://example.com/job/12345",
"registered": true,
"registered_date": "2026-01-23",
"meta": { ... }
}
]
}
Required Metadata:
search_date: Initial search date (YYYY-MM-DD)
verified_date: Last verification date (YYYY-MM-DD)
status: Status (pending, verified, registered, rejected)
registered: API registration status (true/false)
How to Use:
- Prevent duplicate searches: Check existing files before new searches. If necessary, check the existing job-hiring posts from the API and right before posting check the title and name of the job-hiring-company to prevent duplicated job postings.
- Data backup: Retry possible if API registration fails
- History tracking: Record when searched/verified/registered
Korean Translation (Required)
ABSOLUTE RULE
All job posting content MUST be translated into Korean before posting to the Center website.
Translation Rules:
-
Translate all text fields: The following fields must be translated to Korean:
title (제목)
content (내용)
position (직책/포지션)
responsibilities (담당업무)
requirements (자격요건)
benefits (복리후생)
skills (필요 기술)
- Any other descriptive text fields
-
DO NOT translate:
company_name (회사명) - Keep original name
contact_person (담당자명) - Keep original name
application_email (이메일)
application_url (URL)
origin_source_url (원본 URL)
- Technical terms that are commonly used in English (e.g., "React", "Python", "AWS")
- Proper nouns and brand names
-
Translation Quality:
- Use natural Korean expressions, not literal translations
- Maintain professional tone suitable for job postings
- Preserve the original meaning accurately
Example:
| Original (English) | Translated (Korean) |
|---|
| Software Engineer | 소프트웨어 엔지니어 |
| Full-time | 정규직 |
| We are looking for a talented developer... | 저희는 재능있는 개발자를 찾고 있습니다... |
| 3+ years of experience required | 3년 이상 경력 필수 |
| Competitive salary and benefits | 경쟁력 있는 급여 및 복리후생 |
Warning: Posting job information in English on a Korean website significantly reduces user engagement and comprehension.
All content must be in Korean for optimal user experience.
Mandatory Processing Steps
- Read the reference first: Before processing any job data, read job-hiring.md to understand the required field structure
- Extract and map fields: Extract relevant information from web sources and map to corresponding fields (truthful information only!)
- Translate to Korean: Translate all text content to Korean before posting (see Korean Translation rules above)
- Normalize data formats:
- Dates: Use TIMESTAMP format (YYYY-MM-DD)
- Salary: Separate into min_salary, max_salary, salary_currency, salary_type
- Employment type: Use standardized values (Full-time/Contract/Part-time/Intern)
- Experience level: Use standardized values (Entry-level/Experienced/Not specified)
- Handle missing contact info: Enter "000" for missing contact info and origin_source_url is required
- Validate completeness: Ensure all required fields (title, content, position, location) are populated
- Output as JSON: Format the processed data as JSON array for database insertion
Job Posting Fields
For complete field specifications, refer to job-hiring.md.
Field Categories:
- Basic Information: position, location, employment_type, deadline, hiring_count, start_date
- Salary: salary, salary_type, min_salary, max_salary, salary_currency, salary_negotiable
- Experience: experience_level, min_experience_years, max_experience_years, education_level
- Working Conditions: work_hours, work_days, remote_work, probation_period
- Qualifications: requirements, responsibilities, skills, languages, certifications
- Benefits: benefits, visa_sponsorship
- Company Info: company_name, department, team_size, industry
- Application: application_url, application_email, contact_person, contact_phone, application_docs
- Origin Source (Optional): origin_source_url - Original job posting URL from external source