China Footnotes Places API
The Places API from China Footnotes — 2 operation(s) for places.
The Places API from China Footnotes — 2 operation(s) for places.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/chinafootnotes-com:chinafootnotes-com-places-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Chinafootnotes Com Places API
version: 0.1.0
x-coverage:
cities:
- Shanghai
- Beijing
- Xi’an
- Chengdu
- Chongqing
- Hangzhou
placeCount: 112
pretripTopicCount: 9
dataVersion: e95b0f4e8deb
generatedAt: '2026-11-03T20:58:20.757Z'
description: 'Operations tagged Places across 2 of this provider''s published API definitions: chinafootnotes-com-openapi.json, chinafootnotes-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: /
description: Same origin as this specification
tags:
- name: Places
paths:
/api/places:
get:
operationId: searchPlaces
summary: Search canonical places with evidence and monitoring context
parameters:
- name: q
in: query
schema:
type: string
description: English/Chinese names, aliases or description; quote variants normalized
- name: category
in: query
schema:
type: string
description: Category, case insensitive
- name: district
in: query
schema:
type: string
description: District membership; quote variants normalized and multi-district places belong to either district
- name: type
in: query
required: false
description: 'Place type: open_district, water_town, museum, observation_deck, ticketed_attraction, classical_garden, park, temple.'
schema:
type: string
- name: tag
in: query
required: false
description: Feature tag, e.g. free, booking-required, night-view, open-air.
schema:
type: string
- name: city
in: query
required: false
description: City id, e.g. shanghai. Only published cities; see /api/cities. An unknown city is a 404.
schema:
type: string
responses:
'200':
description: Search canonical places with evidence and monitoring context
content:
application/json:
schema:
$ref: '#/components/schemas/PlaceList'
'400':
description: Invalid URL encoding
'404':
description: City not found (not published)
'500':
description: Local data/service unavailable
tags:
- Places
servers:
- url: /
description: Same origin as this specification
/api/places/{id}:
get:
operationId: getPlace
summary: Read one place and its evidence; retain status and pending-review warnings
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Read one place and its evidence; retain status and pending-review warnings
content:
application/json:
schema:
$ref: '#/components/schemas/PlaceDetail'
'400':
description: Invalid URL encoding
'404':
description: Place ID not found
'500':
description: Local data/service unavailable
tags:
- Places
servers:
- url: /
description: Same origin as this specification
components:
schemas:
PlaceDetail:
type: object
properties:
schemaVersion:
type: string
version:
type: string
generatedAt:
type: string
format: date-time
notice:
type: string
place:
$ref: '#/components/schemas/Place'
reviewDue:
type: string
format: date
isReviewOverdue:
type: boolean
sourceMonitoring:
type: array
items:
$ref: '#/components/schemas/SourceMonitoring'
hasPendingSourceReview:
type: boolean
required:
- place
- sourceMonitoring
- hasPendingSourceReview
Place:
type: object
properties:
id:
type: string
name:
type: string
localName:
type: string
district:
type:
- string
- 'null'
description: District name; null where not collected yet.
summary:
type: string
number:
type: integer
minimum: 1
description: 1–50 are Shanghai; other cities are numbered from 51.
category:
type: string
enum:
- Landmarks
- Museums
- Neighborhoods
- Gardens
- Temples
- Water towns
aliases:
type: array
items:
type: string
highlights:
type: array
items:
type: string
visitDuration:
type:
- string
- 'null'
description: Editorial planning suggestion, not a venue rule.
researchedAt:
type: string
format: date
sources:
type: array
items:
$ref: '#/components/schemas/Source'
tips:
type: array
items:
$ref: '#/components/schemas/Tip'
photos:
type: array
items:
$ref: '#/components/schemas/Photo'
updates:
type: array
items:
$ref: '#/components/schemas/Update'
dataQuality:
type: object
properties:
knownFields:
type: integer
totalFields:
type: integer
method:
type: string
reviewDue:
type: string
format: date
required: []
sourceMonitoring:
type: array
items:
$ref: '#/components/schemas/SourceMonitoring'
hasPendingSourceReview:
type: boolean
isReviewOverdue:
type: boolean
address:
$ref: '#/components/schemas/Field'
transport:
$ref: '#/components/schemas/Field'
hours:
$ref: '#/components/schemas/Field'
admission:
$ref: '#/components/schemas/Field'
booking:
$ref: '#/components/schemas/Field'
foreignVisitors:
$ref: '#/components/schemas/Field'
accessibility:
$ref: '#/components/schemas/Field'
lastAdmission:
$ref: '#/components/schemas/Field'
city:
type: string
description: City id, e.g. shanghai
area:
type:
- string
- 'null'
description: Area id within the city (see City.areas)
group:
type:
- string
- 'null'
enum:
- town
- trips
- null
description: For cities split into In town and Day trips (see City.groups)
distanceKm:
type:
- number
- 'null'
description: 'Day trips only: rough distance from the centre; null when not checked'
shortName:
type: string
description: Short label for maps and lists
events:
type: array
items:
$ref: '#/components/schemas/Event'
required:
- id
- name
- localName
- category
- summary
- highlights
- researchedAt
- sources
- tips
- photos
- updates
PlaceList:
type: object
properties:
schemaVersion:
type: string
version:
type: string
generatedAt:
type: string
format: date-time
notice:
type: string
total:
type: integer
places:
type: array
items:
$ref: '#/components/schemas/Place'
required:
- total
- places
Tip:
type: object
properties:
text:
type: string
topic:
type: string
kind:
type: string
const: traveler_report
sourceUrl:
type: string
format: uri
sourceTitle:
type: string
author:
type: string
observedDate:
type:
- string
- 'null'
format: date
observedDateRaw:
type:
- string
- 'null'
description: Original visible date label. It can lack a year or include locale text; never manufacture a year.
visitDate:
type:
- string
- 'null'
format: date
accessedAt:
type: string
format: date
caveat:
type: string
commercial:
type: boolean
required:
- text
- kind
- sourceUrl
- accessedAt
Photo:
type: object
properties:
url:
type: string
sourceUrl:
type: string
author:
type: string
license:
type: string
licenseUrl:
type: string
caption:
type: string
alt:
type: string
accessedAt:
type: string
format: date
required:
- url
- sourceUrl
- author
- license
Update:
type: object
properties:
id:
type: string
text:
type: string
publishedAt:
type:
- string
- 'null'
format: date
reviewedAt:
type: string
format: date
startsAt:
type: string
format: date
expiresAt:
type: string
format: date
sourceIds:
type: array
items:
type: string
placeId:
type: string
sources:
type: array
items:
$ref: '#/components/schemas/Source'
required:
- id
- text
- publishedAt
- reviewedAt
- startsAt
- expiresAt
- sourceIds
Field:
type: object
properties:
value:
type:
- string
- 'null'
description: May contain explanation even when status is unknown or conflicting. Never infer confirmation from nonempty value.
status:
type: string
enum:
- source_checked
- unknown
- conflicting
- not_applicable
description: source_checked = a published source was read, or we phoned the venue, read its sign on site or tried it ourselves (see the source kind); not confirmed for today. not_applicable means no single policy covers this scoped place; it does not mean free or no booking.
sourceIds:
type: array
items:
type: string
required:
- value
- status
- sourceIds
Source:
type: object
properties:
id:
type: string
url:
type:
- string
- 'null'
format: uri
description: 'null only for our own checks, which have no web page: kind owner_tested (we tried it ourselves; first-hand, not official) or owner_official (the venue''s own answer: method phone, onsite_sign or onsite_notice; official). accessedAt is the day we checked.'
title:
type: string
publisher:
type: string
kind:
type: string
enum:
- official
- government
method:
type:
- string
- 'null'
enum:
- phone
- onsite_sign
- onsite_notice
- null
description: 'Only for kind owner_official: how we got the venue’s answer (by phone, a standing sign on site, or a temporary notice on site).'
contact:
type:
- string
- 'null'
description: 'Only for method phone: who we called (venue and number).'
accessedAt:
type: string
format: date
publishedAt:
type:
- string
- 'null'
format: date
required:
- id
- url
- title
- publisher
- kind
- accessedAt
SourceMonitoring:
type: object
properties:
sourceId:
type: string
status:
type: string
enum:
- not_checked
- baseline
- unchanged
- changed
- failed
- alive
lastSuccessAt:
type:
- string
- 'null'
format: date-time
lastAttemptAt:
type:
- string
- 'null'
format: date-time
pendingReviewIds:
type: array
items:
type: string
required:
- sourceId
- status
- pendingReviewIds
Event:
type: object
properties:
id:
type: string
kind:
type: string
enum:
- festival
- exhibition
- show
- performance
- seasonal
- other
title:
type: string
startsAt:
type: string
format: date
endsAt:
type: string
format: date
description: Exact end date unless endsAtLabel is present; then this is only the upper bound used for filtering, not a confirmed last day.
when:
type: string
where:
type: string
ticket:
type: string
enum:
- free
- included
- paid
- unknown
price:
type: string
booking:
type: string
text:
type: string
sourceIds:
type: array
items:
type: string
placeId:
type: string
sources:
type: array
items:
$ref: '#/components/schemas/Source'
dates:
type: array
items:
type: string
format: date
description: Specific dates when the event runs, inside startsAt..endsAt
basisNotes:
type: array
items:
type: object
endsAtLabel:
type: string
description: Source-stated end period when the exact day is unknown. Use this label instead of presenting endsAt as an exact date.
required:
- id
- kind
- title
- endsAt
- text
- sourceIds
x-refined-from:
- chinafootnotes-com-openapi.json
- chinafootnotes-com-openapi.yml