nanrentiantangAPI
Try it
Open API v1 Updated

Singapore Escort API & Open Database

Build your own Singapore escort website, Telegram bot or app on top of the nanrentiantang profile database. Free, read-only JSON, no API key, CORS enabled, with full export and ETag caching so you only download what changed.

Base URL https://nanrentiantang10.net/api/v1
GET /girls 200 OK
$curl "https://nanrentiantang10.net/api/v1/girls?limit=1&fields=name,age,height,price,verified,hasVideo,url"
{  "data": [    {      "id": "1937",      "age": "28 Years Old",      "height": "160cm",      "price": "$160/60mins/1 Shot FJ",      "verified": false,      "hasVideo": true,      "url": "https://nanrentiantang10.net/escort/1937"    }  ],  "meta": {    "total": 102,    "page": 1,    "limit": 1,    "pages": 102  }}
102Active profiles
18Verified
86With video
Last updated
01

Quick start

No sign-up or API key needed.

Every endpoint is a plain GET request that returns JSON. Fetch the 20 newest Geylang listings:

curl "https://nanrentiantang10.net/api/v1/girls?area=geylang&limit=20"

Browse by area

Each card links to the area page on the site. Use the same filters in the API, as shown on each card.

02

API index · Endpoints

All paths are relative to https://nanrentiantang10.net/api/v1.

EndpointWhat it returnsUse it for
GET/API index: version, total count, current dataVersion, links to every endpoint.Health check, discovering endpoints.
GET/girlsPaginated, filterable list of profiles. See parameters.Listing pages, search, area pages.
GET/girls/{id}One profile. 404 means it is no longer listed.Profile detail pages.
GET/exportEvery active profile in one response (~335 KB before gzip).Mirroring the whole database into your own cache.
GET/syncTiny manifest: dataVersion plus { id, hash, updatedAt } for every profile. hash changes whenever anything in that profile changes.Detecting new, changed and removed profiles cheaply.
GET/areasAreas (Geylang, Central, East, West, North, Massage) with live counts.Navigation menus.
GET/openapi.jsonOpenAPI 3 description of this API.Code generators, Postman, Swagger UI.

List response shape

JSON · list response
{
  "data": [ { ...profile }, ... ],
  "meta": {
    "total": 42, "page": 1, "limit": 20, "pages": 3,
    "dataVersion": "a3d43ec827000957",
    "lastModified": "2026-10-19T09:11:53.820Z"
  },
  "links": { "self": "...", "next": "...?page=2", "prev": null },
  "attribution": { "text": "Data from nanrentiantang ...", "url": "https://nanrentiantang10.net/", ... }
}
03

Query parameters for /girls

Combine any of them.

ParameterExampleDescription
areageylanggeylang, central, east, west or north (Chinese area names also work).
massagetrueOnly massage listings.
verifiedtrueOnly listings with the verified badge.
cautionfalsecaution marks listings our admins flagged as unverified. Use caution=false to hide them.
featuredtrueOnly featured listings.
has_videotrueOnly listings with at least one video.
qthai bedokKeyword search across name, title, location, price, services and ID. Space-separated words must all match.
ids1872,1862Fetch specific profiles (up to 100). Ideal after a /sync diff.
updated_since2026-10-01Only profiles whose updatedAt is after this ISO date or Unix-millisecond timestamp. Good for “new listings”; to detect every edit, use the hash in /sync.
sortnewestnewest (default, by updatedAt), oldest, or id (highest ID first).
page2Page number, starting at 1.
limit50Results per page, 1–100. Default 20.
fieldsname,price,cover,urlReturn only these fields (id is always included). Smaller, faster responses for list views.

Example: verified Thai girls in the East with video, lightweight card fields only:

Request URL
https://nanrentiantang10.net/api/v1/girls?area=east&verified=true&has_video=true&q=thai&fields=name,price,cover,area,url
04

Profile object

Fields returned for each profile.

FieldTypeDescription
idstringStable profile ID, same as on the site (/escort/{id}).
name, titlestringDisplay name and bilingual headline.
urlstringCanonical profile page on nanrentiantang. Link to it when you show the profile.
areaobject{ slug, zh, label }: URL slug (e.g. east), Chinese area name, and display label (e.g. East Area).
location, geostring, object|nullNeighbourhood text (e.g. Bedok) and approximate { lat, lng }.
age, height, weight, cupstringAs written by the listing, e.g. 28 Years Old, 163cm.
price, pricesstring, string[]Main price line and all price lines.
servicesstring[]Service list, bilingual.
specialService, room, overnightstringFree text (HTML already stripped, line breaks as \n).
contactobject{ phone, whatsapp, telegram, wechat, callEnabled, smsEnabled }. whatsapp is in international format without + (ready for https://wa.me/{whatsapp}); phone is the local Singapore number. Values may be null.
verified, caution, featured, massage, hasVideobooleanStatus flags (see parameters).
cover, imagesobject, object[]{ url, thumbnail }. Use thumbnail for grids and url for full size.
videosstring[]MP4 URLs.
commentCountnumberNumber of user reviews on the profile page.
postedDate, updatedAtstring|nullYYYY-MM-DD listing date and ISO 8601 last-update time.

Live example

JSON · GET /girls/{id}
{
  "id": "1937",
  "name": "JingJing-晶晶",
  "title": "迷人的容颜,温柔的双手,带来极致放松和难忘体验 A Charming Face, Gentle Hands, Bringing Ultimate Relaxation and Unforgettable Experience",
  "url": "https://nanrentiantang10.net/escort/1937",
  "area": {
    "slug": "east",
    "zh": "东部",
    "label": "East Area 东部地区"
  },
  "location": "Joo Chiat Road 如切路",
  "geo": {
    "lat": 1.3074844,
    "lng": 103.9039877
  },
  "age": "28 Years Old",
  "height": "160cm",
  "weight": "48KG",
  "cup": "38C",
  "price": "$160/60mins/1 Shot FJ",
  "prices": [
    "$160/60mins/1 Shot FJ"
  ],
  "services": [
    "Shower together/鸳鸯浴",
    "Simple massage/简单按摩",
    "Bath oral sex",
    "Deep throat/深喉",
    "Nipples/舔奶头",
    "Painting/舔鲍鱼(这个服务很多人喜欢)",
    "Roam/漫游",
    "COB/射身",
    "Grasp root/抓根",
    "Chest push/胸推",
    "CIM/无套口爆(这个服务很多人喜欢)",
    "Kiss/接吻",
    "Frenching/舌吻(这个服务很多人喜欢)",
    "69Type/69式",
    "BBBJ/无套口交",
    "CBJ/有套口交",
    "FJ/有套做爱"
  ],
  "specialService": "",
  "room": "Room&CD Included  包房包套",
  "overnight": "详情请咨询",
  "contact": {
    "phone": "86709163",
    "whatsapp": "6586709163",
    "telegram": null,
    "wechat": null,
    "callEnabled": true,
    "smsEnabled": true
  },
  "verified": false,
  "caution": false,
  "featured": true,
  "massage": false,
  "hasVideo": true,
  "cover": {
    "url": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-508879295-optimized.jpg",
    "thumbnail": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-508879295-optimized.webp"
  },
  "images": [
    {
      "url": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-508879295-optimized.jpg",
      "thumbnail": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-508879295-optimized.webp"
    },
    {
      "url": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-63130150-optimized.jpg",
      "thumbnail": "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792401115772-63130150-optimized.webp"
    }
  ],
  "videos": [
    "https://nanrentiantang.cdncdncdnglodbal.com/1937-1792402943507-260389179.mp4?t=1792406826774"
  ],
  "commentCount": 0,
  "postedDate": "2026-10-19",
  "updatedAt": "2026-10-19T09:11:53.820Z"
}

Images and videos trimmed for this page. The API returns all of them. Text fields are returned exactly as listed, so some may be bilingual.

05

Caching & sync

Recommended setup.

The database changes a few times a day, not every second. Keep your own copy and refresh it in the background. Your site gets faster, and you stay far below the rate limit.

  1. Mirror once

    Download /export and store it (memory, Redis, a JSON file or your database).

  2. Poll cheaply

    Every 15–30 minutes, request /export (or /sync) with the If-None-Match header set to the last ETag. If nothing changed you get 304 Not Modified with an empty body.

  3. Apply changes

    On 200, replace your copy. With /sync, compare each ID’s hash with the one you stored, fetch only the changed ones via /girls?ids=…, and delete IDs that disappeared.

  4. Serve from your cache

    Serve your visitors from your own copy, never by calling our API on every page view.

Every data response includes ETag, X-Data-Version and Cache-Control: public, max-age=300 headers.

// Server-side cache that refreshes itself every 15 minutes
const BASE = 'https://nanrentiantang10.net/api/v1';
let cache = { etag: null, girls: [], byId: new Map() };

async function refresh() {
  try {
    const res = await fetch(`${BASE}/export`, {
      headers: cache.etag ? { 'If-None-Match': cache.etag } : {}
    });
    if (res.status === 304) return;            // unchanged — keep cache
    if (!res.ok) return;                       // 429 / 5xx — keep serving old data
    const body = await res.json();
    cache = {
      etag: res.headers.get('ETag'),
      girls: body.data,
      byId: new Map(body.data.map(g => [g.id, g]))
    };
  } catch (err) {
    console.error('nanrentiantang sync failed', err);
  }
}

await refresh();
setInterval(refresh, 15 * 60 * 1000);

// In your routes: cache.girls, cache.byId.get('1872') ...
Freshness: our servers refresh their copy of the database every few hours. Polling more often than every 15 minutes will not get you newer data.
06

Rate limits & errors

Fair use is up to 60 requests per minute per IP; our edge network may apply stricter limits to abusive traffic. Responses include RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers. Need a higher limit? Contact us for a business quota.

StatusMeaningWhat to do
200OKStore the body and its ETag.
304Not modifiedKeep using your cached copy.
400Invalid parameterRead error.message; fix the query.
404Profile not listed / unknown endpointRemove the profile from your cache.
429Too many requestsWait Retry-After seconds and serve from your cache meanwhile.
5xxTemporary server problemRetry later with backoff; keep serving cached data.
JSON · error response
{
  "error": {
    "status": 400,
    "code": "invalid_parameter",
    "message": "\"area\" must be one of: geylang, central, east, west, north.",
    "docs": "https://nanrentiantang10.net/singapore-escort-api"
  }
}
07

Try it

Send a real request from your browser.

GET

08

Terms of use & attribution

  1. Free and read-only. No key or sign-up. We may change limits or block clients that abuse the service.
  2. Attribution required. Wherever you display our data, show “Data from nanrentiantang” and link each profile to its url.
  3. Don’t alter listings. Show prices, services and contact details as provided. Don’t present the listings as your own original content.
  4. Keep it fresh. Sync at least once a day and remove profiles within 24 hours after they disappear from /sync or return 404.
  5. Media. You may display images and videos by their URLs. Please don’t bulk re-host or watermark them as your own.
  6. Adults only. Content is for viewers aged 18+. You are responsible for complying with the laws that apply to your site and audience.
  7. No warranty. Data is provided as-is. Version v1 stays backwards-compatible; breaking changes will ship as /api/v2.
HTML · attribution snippet
<p>Data from <a href="https://nanrentiantang10.net/">nanrentiantang</a></p>
09

Business & custom API

Higher limits, custom endpoints and partner data.

The free API covers most websites and bots. If you run a larger site or need data the public API does not include, contact the nanrentiantang admin team. We can set up:

Higher rate limits

A dedicated quota above 60 requests/minute for high-traffic sites and apps.

Custom APIs

Extra filters, your own data format, push updates or endpoints built for your product.

Watermark-free images

Original photos without the nanrentiantang watermark for licensed partners.

Comments & reviews

User reviews and their photo / video attachments included in the API.

Talk to the admin team

Tell us your website or app, expected traffic and what you need.

10

FAQ

Is there a Singapore escort API I can use for free?

Yes. nanrentiantang provides a free, read-only JSON API at https://nanrentiantang10.net/api/v1. No API key or sign-up is needed. Please cache responses and link back to each profile URL.

How do I download the whole Singapore escort database?

Call https://nanrentiantang10.net/api/v1/export. It returns every active profile in one JSON response. Re-request it with the If-None-Match header and you get a 304 Not Modified when nothing changed.

How often is the data updated?

New listings are added daily. Our servers refresh their copy every few hours, so polling the /sync endpoint every 15 to 30 minutes is enough to stay current.

What are the rate limits?

Up to 60 requests per minute per IP address. Requests over the limit get HTTP 429 with a Retry-After header. Cached and 304 responses are the best way to stay well under the limit.

Can I get higher rate limits, watermark-free images or comments in the API?

Yes. Business users can ask for higher rate limits, custom endpoints, original images without watermark, and user comments / reviews in the API. Email [email protected] or message @mai_quyenn on Telegram.

Can I call the API from the browser?

Yes, CORS is open (Access-Control-Allow-Origin: *). For a production website we recommend fetching on your server and caching the result, so your visitors do not each hit the API.