# social.skyphone.spot.review

> Published by [riyo.skyphone.social](https://lexicon.garden/identity/did:plc:ta347pa3wlmmyymoz56mfmfw)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:ta347pa3wlmmyymoz56mfmfw/social.skyphone.spot.review)
- [Documentation](https://lexicon.garden/lexicon/did:plc:ta347pa3wlmmyymoz56mfmfw/social.skyphone.spot.review/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:ta347pa3wlmmyymoz56mfmfw/social.skyphone.spot.review/examples)

## Definitions

### `social.skyphone.spot.review`

**Type**: `record`

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.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `lang` | `string` (language) | No | Primary language of the review text (BCP 47). |
| `text` | `string` | No | Free-form review body. |
| `place` | `ref` → `#placeRef` | Yes | The place being reviewed. |
| `photos` | `array` | No | Photos taken at or of the place. |
| `rating` | `integer` | Yes | Overall rating, 1 (worst) to 5 (best). |
| `subject` | `ref` → `com.atproto.repo.strongRef` | No | Optional reference to a feed post (app.bsky.feed.post) announcing this review, if the author chose to cross-post. |
| `category` | `string` | No | Reviewer-chosen category of the place. |
| `createdAt` | `string` (datetime) | Yes | When this review record was created. |
| `visitedAt` | `string` (datetime) | No | When the reviewer visited the place. Clients SHOULD truncate to date precision to avoid leaking the reviewer's real-time location. |

### `social.skyphone.spot.review#placeRef`

**Type**: `object`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `id` | `string` | Yes | Place identifier within the source namespace. |
| `name` | `string` | No | Display name of the place at the time of review, so records remain human-readable even if the source registry is unavailable. |
| `source` | `string` | Yes | Namespace of the place identifier. Reviews referring to the same (source, id) pair describe the same place. |
| `latitude` | `string` | No | Optional decimal latitude as a string (e.g. "35.6812"), for self-describing records. |
| `longitude` | `string` | No | Optional decimal longitude as a string (e.g. "139.7671"). |

## Raw Schema

```json
{
  "id": "social.skyphone.spot.review",
  "defs": {
    "main": {
      "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."
    },
    "placeRef": {
      "type": "object",
      "required": [
        "source",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 256,
          "description": "Place identifier within the source namespace."
        },
        "name": {
          "type": "string",
          "description": "Display name of the place at the time of review, so records remain human-readable even if the source registry is unavailable.",
          "maxGraphemes": 300
        },
        "source": {
          "type": "string",
          "maxLength": 64,
          "description": "Namespace of the place identifier. Reviews referring to the same (source, id) pair describe the same place.",
          "knownValues": [
            "skyphone",
            "osm",
            "google"
          ]
        },
        "latitude": {
          "type": "string",
          "description": "Optional decimal latitude as a string (e.g. \"35.6812\"), for self-describing records."
        },
        "longitude": {
          "type": "string",
          "description": "Optional decimal longitude as a string (e.g. \"139.7671\")."
        }
      }
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
