A public review of a real-world place (restaurant, cafe, shop, etc.). Designed so any AT Protocol app can read, render, and aggregate place reviews regardless of which app created them.
tid
Timestamp-based ID
Properties
category
string
Optional
Reviewer-chosen category of the place.
maxLength: 64 bytesrestaurant, cafe, bar, salon, clinic, hotel, gym, shop, othercreatedAt
string
datetime
Required
When this review record was created.
lang
string
language
Optional
Primary language of the review text (BCP 47).
photos
array
of
blob
Optional
Photos taken at or of the place.
maxLength: 8 itemsplace
ref
#placeRef
Required
The place being reviewed.
rating
integer
Required
Overall rating, 1 (worst) to 5 (best).
minimum: 1maximum: 5subject
ref
com.atproto.repo.strongRef
Optional
Optional reference to a feed post (app.bsky.feed.post) announcing this review, if the author chose to cross-post.
text
string
Optional
Free-form review body.
maxLength: 30000 bytesmaxGraphemes: 3000 graphemesvisitedAt
string
datetime
Optional
When the reviewer visited the place. Clients SHOULD truncate to date precision to avoid leaking the reviewer's real-time location.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"place",
"rating",
"createdAt"
],
"properties": {
"lang": {
"type": "string",
"format": "language",
"description": "Primary language of the review text (BCP 47)."
},
"text": {
"type": "string",
"maxLength": 30000,
"description": "Free-form review body.",
"maxGraphemes": 3000
},
"place": {
"ref": "#placeRef",
"type": "ref",
"description": "The place being reviewed."
},
"photos": {
"type": "array",
"items": {
"type": "blob",
"accept": [
"image/*"
],
"maxSize": 2000000
},
"maxLength": 8,
"description": "Photos taken at or of the place."
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Overall rating, 1 (worst) to 5 (best)."
},
"subject": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "Optional reference to a feed post (app.bsky.feed.post) announcing this review, if the author chose to cross-post."
},
"category": {
"type": "string",
"maxLength": 64,
"description": "Reviewer-chosen category of the place.",
"knownValues": [
"restaurant",
"cafe",
"bar",
"salon",
"clinic",
"hotel",
"gym",
"shop",
"other"
]
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When this review record was created."
},
"visitedAt": {
"type": "string",
"format": "datetime",
"description": "When the reviewer visited the place. Clients SHOULD truncate to date precision to avoid leaking the reviewer's real-time location."
}
}
},
"description": "A public review of a real-world place (restaurant, cafe, shop, etc.). Designed so any AT Protocol app can read, render, and aggregate place reviews regardless of which app created them."
}