# V2EX Account Validation Reference ## API Endpoints ### Username Existence (public, no auth) ``` GET https://www.v2ex.com/api/members/show.json?username={username} ``` **Response (exists):** ```json { "id": 1, "username": "Livid", "url": "https://www.v2ex.com/u/Livid", "website": "...", "twitter": "", "github": "", "avatar_mini": "https://cdn.v2ex.com/avatar/...", "avatar_normal": "...", "avatar_large": "...", "created": 1272200000, "last_modified": 1782797864, "pro": false, "status": "found" } ``` **Response (not found):** ```json {"status": "error", "message": "Object Not Found"} ``` HTTP 404. **Response (rate limited):** ```json {"status": "error", "message": "Rate Limit Exceeded", "rate_limit": {"used": 600, "quota": 600, "reset_at": 1782957764}} ``` HTTP 403. ### Rate Limit Headers - `X-Rate-Limit-Limit`: 600 (quota per hour) - `X-Rate-Limit-Remaining`: remaining requests - `X-Rate-Limit-Reset`: Unix timestamp of reset - Rate limit is per-IP, resets on the hour ### Site Info ``` GET https://www.v2ex.com/api/site/info.json ``` Returns: `{"title": "V2EX", "slogan": "way to explore", "domain": "www.v2ex.com"}` ## Login Form Mechanics ### Form Structure V2EX login at `/signin` uses randomized SHA256 field names. Must be parsed fresh from each page load: ```html
``` ### CAPTCHA - Image: `GET /_captcha` (returns PNG) - Simple text CAPTCHA, not reCAPTCHA - Solvable via Tesseract OCR or 2captcha API ### Login POST ``` POST /signin Content-Type: application/x-www-form-urlencoded