Loading...
Loading...
Reverse engineer web APIs by capturing browser traffic (HAR files) and generating production-ready Python API clients. Use when the user wants to create an API client for a website, automate web interactions, or understand undocumented APIs. Activate on tasks mentioning "reverse engineer", "API client", "HAR file", "capture traffic", or "automate website".
npx skill4agent add kalil0321/reverse-api-engineer reverse-engineering-api[User Task] -> [Browser Capture] -> [HAR Analysis] -> [API Client Generation] -> [Testing & Refinement]plugins/reverse-api-engineer/skills/reverse-engineering-api/scripts/har_filter.pyhar_analyze.pyhar_validate.pyhar_utils.py# 1. Filter HAR to remove noise (static assets, analytics, CDN)
python {SKILL_DIR}/scripts/har_filter.py {har_path} --output filtered.har --stats
# 2. Analyze endpoints and extract patterns
python {SKILL_DIR}/scripts/har_analyze.py filtered.har --output analysis.json
# 3. Read analysis for code generation guidance
cat analysis.json
# 4. Generate API client code based on analysis
# 5. Validate generated code
python {SKILL_DIR}/scripts/har_validate.py api_client.py analysis.jsonpendingin_progresscompletedin_progressTodoWrite([
{"content": "Filter HAR using har_filter.py", "status": "in_progress", "activeForm": "Filtering HAR"},
{"content": "Analyze HAR using har_analyze.py", "status": "pending", "activeForm": "Analyzing endpoints"},
{"content": "Generate API client", "status": "pending", "activeForm": "Generating code"},
{"content": "Validate using har_validate.py", "status": "pending", "activeForm": "Validating code"},
{"content": "Test implementation", "status": "pending", "activeForm": "Testing API client"}
]){run_id}~/.reverse-api/runs/har/{run_id}/recording.harHAR file saved to: ~/.reverse-api/runs/har/{run_id}/recording.har{
"log": {
"entries": [
{
"request": {
"method": "GET|POST|PUT|DELETE",
"url": "https://api.example.com/endpoint",
"headers": [...],
"postData": {...}
},
"response": {
"status": 200,
"headers": [...],
"content": {...}
}
}
]
}
}.js.css.png.jpg.svg.woff.icogoogle-analyticssegmentmixpanelhotjardoubleclickadsensefacebook.com/trcloudflarecdn.static./api//v1//v2//graphql{output_dir}/
api_client.py # Main API client class
README.md # Usage documentation"""
Auto-generated API client for {domain}
Generated from HAR capture on {date}
"""
import requests
from typing import Optional, Dict, Any, List
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class {ClassName}Client:
"""API client for {domain}."""
def __init__(
self,
base_url: str = "{base_url}",
session: Optional[requests.Session] = None,
):
self.base_url = base_url.rstrip("/")
self.session = session or requests.Session()
self._setup_session()
def _setup_session(self):
"""Configure session with default headers."""
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (compatible)",
"Accept": "application/json",
# Add other required headers
})
def _request(
self,
method: str,
endpoint: str,
**kwargs,
) -> requests.Response:
"""Make an HTTP request with error handling."""
url = f"{self.base_url}{endpoint}"
try:
response = self.session.request(method, url, **kwargs)
response.raise_for_status()
return response
except requests.exceptions.RequestException as e:
logger.error(f"Request failed: {e}")
raise
# Generated endpoint methods go here
def get_example(self, param: str) -> Dict[str, Any]:
"""
Fetch example data.
Args:
param: Description of parameter
Returns:
JSON response data
"""
response = self._request("GET", f"/api/example/{param}")
return response.json()
# Example usage
if __name__ == "__main__":
client = {ClassName}Client()
# Example callsAttempt 1: Initial implementation
- What was tried
- What failed (if anything)
- What was changed
Attempt 2: Refinement
...| Issue | Solution |
|---|---|
| 403 Forbidden | Add missing headers, check authentication |
| Bot detection | Switch to Playwright with stealth mode |
| Rate limiting | Add delays, respect Retry-After headers |
| Session expiry | Implement token refresh logic |
| CORS errors | Use server-side requests (not applicable to Python) |
scripts/mapper.pypython scripts/mapper.py https://example.comscripts/sitemap.pypython scripts/sitemap.py https://example.com~/.reverse-api/runs/har/{run_id}/./{task_name}User: "Create an API client for the Apple Jobs website"
1. [Browser Capture]
Launch browser with HAR recording
Navigate to jobs.apple.com
Perform search, browse listings
Close browser
HAR saved to: ~/.reverse-api/runs/har/{run_id}/recording.har
Note: you can monitor browser requests with the Playwright MCP
2. [HAR Analysis]
Found endpoints:
- GET /api/role/search?query=...
- GET /api/role/{id}
Authentication: None required (public API)
3. [Generate Client]
Create : {task_name}/api_client.py
4. [Test]
Ran example usage - Success!
5. [Summary]
Generated Apple Jobs API client with:
- search_roles(query, location, page)
- get_role(role_id)
Files: ./{task_name}/