{"openapi":"3.0.3","info":{"title":"nanrentiantang Singapore Escort API","version":"1.0.0","description":"Free, read-only JSON API for the nanrentiantang 新加坡男人天堂网 Singapore escort profile database. No API key required. Please cache responses and link back to the profile URL.","termsOfService":"https://nanrentiantang10.net/singapore-escort-api#terms","contact":{"name":"nanrentiantang admin","email":"nrtt8888@gmail.com","url":"https://t.me/mai_quyenn"}},"externalDocs":{"url":"https://nanrentiantang10.net/singapore-escort-api"},"servers":[{"url":"https://nanrentiantang10.net/api/v1"}],"paths":{"/":{"get":{"summary":"API index and dataset version","responses":{"200":{"description":"OK"}}}},"/girls":{"get":{"summary":"List and search profiles","parameters":[{"name":"area","in":"query","schema":{"type":"string","enum":["geylang","central","east","west","north"]},"description":"Filter by Singapore area."},{"name":"massage","in":"query","schema":{"type":"boolean"},"description":"Only massage listings."},{"name":"verified","in":"query","schema":{"type":"boolean"},"description":"Filter by verified badge."},{"name":"caution","in":"query","schema":{"type":"boolean"},"description":"Filter by caution (unverified) flag. Use caution=false to hide flagged listings."},{"name":"featured","in":"query","schema":{"type":"boolean"}},{"name":"has_video","in":"query","schema":{"type":"boolean"}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Keyword search (name, title, location, price, services, ID). Space-separated terms are ANDed."},{"name":"ids","in":"query","schema":{"type":"string"},"description":"Comma-separated profile IDs (max 100)."},{"name":"updated_since","in":"query","schema":{"type":"string"},"description":"ISO 8601 date or Unix ms. Only profiles updated after this time."},{"name":"sort","in":"query","schema":{"type":"string","enum":["newest","oldest","id"],"default":"newest"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Comma-separated list of fields to return (id is always included)."}],"responses":{"200":{"description":"Paginated list of profiles","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Profile"}},"meta":{"type":"object"},"links":{"type":"object"}}}}}},"304":{"description":"Not modified (send If-None-Match with the previous ETag)"},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited"}}}},"/girls/{id}":{"get":{"summary":"Get one profile by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Profile","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Profile"}}}}}},"404":{"description":"Not found or no longer listed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sync":{"get":{"summary":"Lightweight manifest of every profile ID with a content hash and updatedAt, for incremental cache sync","responses":{"200":{"description":"OK"},"304":{"description":"Not modified"}}}},"/export":{"get":{"summary":"Full database export in one response","responses":{"200":{"description":"OK"},"304":{"description":"Not modified"}}}},"/areas":{"get":{"summary":"Areas with profile counts","responses":{"200":{"description":"OK"}}}}},"components":{"schemas":{"Profile":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","description":"Canonical profile page. Link to it when you display the profile."},"area":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"zh":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}}},"location":{"type":"string"},"geo":{"type":"object","nullable":true,"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"age":{"type":"string"},"height":{"type":"string"},"weight":{"type":"string"},"cup":{"type":"string"},"price":{"type":"string","description":"Primary price line"},"prices":{"type":"array","items":{"type":"string"}},"services":{"type":"array","items":{"type":"string"}},"specialService":{"type":"string"},"room":{"type":"string"},"overnight":{"type":"string"},"contact":{"type":"object","properties":{"phone":{"type":"string","nullable":true},"whatsapp":{"type":"string","nullable":true},"telegram":{"type":"string","nullable":true},"wechat":{"type":"string","nullable":true},"callEnabled":{"type":"boolean"},"smsEnabled":{"type":"boolean"}}},"verified":{"type":"boolean"},"caution":{"type":"boolean"},"featured":{"type":"boolean"},"massage":{"type":"boolean"},"hasVideo":{"type":"boolean"},"cover":{"type":"object","properties":{"url":{"type":"string"},"thumbnail":{"type":"string"}},"nullable":true},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"thumbnail":{"type":"string"}}}},"videos":{"type":"array","items":{"type":"string"}},"commentCount":{"type":"integer"},"postedDate":{"type":"string","format":"date","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string"}}}}}}}}