changedInput schema / properties / ops / items / anyOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "amenities": {
- "items": {
- "maxLength": 80,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "best_time": {
- "maxLength": 200,
- "type": "string"
- },
- "booking": {
- "additionalProperties": false,
- "properties": {
- "booked_by": {
- "type": "string"
- },
- "booker": {
- "type": "string"
- },
- "cancellation": {
- "additionalProperties": false,
- "properties": {
- "steps": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "refund": {
- "anyOf": [
- {
- "const": "full",
- "type": "string"
- },
- {
- "additionalProperties": false,
- "properties": {
- "percent": {
- "maximum": 100,
- "minimum": 0,
- "type": "number"
- }
- },
- "required": [
- "percent"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "amount": {
- "minimum": 0,
- "type": "number"
- },
- "currency": {
- "pattern": "^[A-Z]{3}$",
- "type": "string"
- }
- },
- "required": [
- "amount",
- "currency"
- ],
- "type": "object"
- }
- ]
- },
- "until": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- }
- ]
- }
- },
- "required": [
- "until",
- "refund"
- ],
- "type": "object"
- },
- "maxItems": 10,
- "type": "array"
- },
- "text": {
- "maxLength": 1000,
- "type": "string"
- }
- },
- "required": [
- "steps"
- ],
- "type": "object"
- },
- "cancelled_on": {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- "for": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "provider": {
- "maxLength": 100,
- "type": "string"
- },
- "ref": {
- "maxLength": 100,
- "type": "string"
- },
- "url": {
- "format": "uri",
- "type": "string"
- }
- },
- "type": "object"
- },
- "booking_needed": {
- "type": "boolean"
- },
- "books_from": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "additionalProperties": false,
- "properties": {
- "days_before": {
- "maximum": 400,
- "minimum": 1,
- "type": "integer"
- }
- },
- "required": [
- "days_before"
- ],
- "type": "object"
- }
- ]
- },
- "category": {
- "maxLength": 40,
- "type": "string"
- },
- "charges": {
- "description": "What a card on file will be charged later, on a day: [{by, amount, currency, method, on}]. See guide { topic: \"money\" }.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "amount": {
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "by": {
- "description": "Whose card it goes on: their member id (mem_…) or person id.",
- "minLength": 1,
- "type": "string"
- },
- "currency": {
- "pattern": "^[A-Z]{3}$",
- "type": "string"
- },
- "method": {
- "description": "Which card, in a few words: \"Mastercard 8682\". Only a card's last 4 digits, never its whole number.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "on": {
- "description": "The day the card is charged, in the booking's own time zone.",
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- }
- },
- "required": [
- "by",
- "amount",
- "currency",
- "on"
- ],
- "type": "object"
- },
- "maxItems": 50,
- "type": "array"
- },
- "closed": {
- "maxLength": 100,
- "type": "string"
- },
- "cons": {
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 12,
- "type": "array"
- },
- "contact": {
- "additionalProperties": false,
- "properties": {
- "email": {
- "format": "email",
- "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
- "type": "string"
- },
- "phone": {
- "pattern": "^\\+?[\\d\\s().-]{5,30}$",
- "type": "string"
- },
- "social": {
- "description": "Its Instagram or other pages.",
- "items": {
- "format": "uri",
- "type": "string"
- },
- "maxItems": 5,
- "type": "array"
- },
- "website": {
- "format": "uri",
- "type": "string"
- }
- },
- "type": "object"
- },
- "cost": {
- "additionalProperties": false,
- "properties": {
- "amount": {
- "minimum": 0,
- "type": "number"
- },
- "category": {
- "enum": [
- "stays",
- "transport",
- "food",
- "activities",
- "other"
- ],
- "type": "string"
- },
- "currency": {
- "pattern": "^[A-Z]{3}$",
- "type": "string"
- },
- "estimate": {
- "type": "boolean"
- },
- "per": {
- "enum": [
- "person",
- "group"
- ],
- "type": "string"
- }
- },
- "required": [
- "amount",
- "currency"
- ],
- "type": "object"
- },
- "data": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "due": {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- "duration": {
- "maxLength": 40,
- "type": "string"
- },
- "from": {
- "additionalProperties": false,
- "properties": {
- "address": {
- "maxLength": 300,
- "type": "string"
- },
- "city": {
- "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "lat": {
- "maximum": 90,
- "minimum": -90,
- "type": "number"
- },
- "lng": {
- "maximum": 180,
- "minimum": -180,
- "type": "number"
- },
- "name": {
- "maxLength": 200,
- "type": "string"
- },
- "precision": {
- "enum": [
- "spot",
- "area",
- "city",
- "region",
- "country",
- "none"
- ],
- "type": "string"
- },
- "radius_m": {
- "exclusiveMinimum": 0,
- "maximum": 1000000,
- "type": "number"
- },
- "ref": {
- "maxLength": 500,
- "type": "string"
- }
- },
- "required": [
- "precision"
- ],
- "type": "object"
- },
- "getting_around": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "how": {
- "description": "walk, bus, train, taxi, shuttle… (walk if not said)",
- "maxLength": 40,
- "type": "string"
- },
- "minutes": {
- "maximum": 600,
- "minimum": 0,
- "type": "integer"
- },
- "note": {
- "maxLength": 200,
- "type": "string"
- },
- "to": {
- "description": "Where to: \"Nagano Station (JR, Shinkansen)\", \"Haneda Airport\".",
- "maxLength": 120,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "to"
- ],
- "type": "object"
- },
- "maxItems": 10,
- "type": "array"
- },
- "good_to_know": {
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 10,
- "type": "array"
- },
- "hours": {
- "maxLength": 300,
- "type": "string"
- },
- "important": {
- "description": "Tasks: missing it costs money or the trip (a visa, a deposit, tickets that sell out). Everyone in the trip hears when it's done, moved, reassigned or removed.",
- "type": "boolean"
- },
- "links": {
- "items": {
- "format": "uri",
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "nearby": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "minutes": {
- "description": "Minutes' walk.",
- "maximum": 120,
- "minimum": 0,
- "type": "integer"
- },
- "name": {
- "maxLength": 120,
- "minLength": 1,
- "type": "string"
- },
- "note": {
- "maxLength": 200,
- "type": "string"
- },
- "what": {
- "description": "food, shops, convenience store, sight…",
- "maxLength": 60,
- "type": "string"
- }
- },
- "required": [
- "name"
- ],
- "type": "object"
- },
- "maxItems": 15,
- "type": "array"
- },
- "notes": {
- "maxLength": 4000,
- "type": "string"
- },
- "order": {
- "type": "number"
- },
- "origin": {
- "additionalProperties": false,
- "properties": {
- "by": {
- "description": "Which AI; Tripmo fills it in from the connection.",
- "maxLength": 100,
- "type": "string"
- },
- "kind": {
- "const": "ai",
- "type": "string"
- }
- },
- "required": [
- "kind"
- ],
- "type": "object"
- },
- "owner": {
- "type": "string"
- },
- "paid": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "amount": {
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "by": {
- "description": "The person who paid: their member id (mem_…) or person id.",
- "minLength": 1,
- "type": "string"
- },
- "currency": {
- "pattern": "^[A-Z]{3}$",
- "type": "string"
- },
- "method": {
- "description": "How it was paid, in a few words: \"Mastercard 8682\", \"Cash\", \"Citi Prestige points\", \"Bank transfer\". Only a card's last 4 digits, never its whole number.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "by",
- "amount",
- "currency"
- ],
- "type": "object"
- },
- "maxItems": 50,
- "type": "array"
- },
- "parent": {
- "type": "string"
- },
- "photos": {
- "description": "Up to five pictures of it from the web, the best first, references only. See guide { topic: \"photos\" }.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "credit": {
- "description": "Who to credit: the site's or the photographer's name (\"Wikimedia Commons\", \"Kyoto City\").",
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "source": {
- "description": "The page it was found on; tapping the credit opens it.",
- "format": "uri",
- "maxLength": 2000,
- "type": "string"
- },
- "url": {
- "description": "The image itself (https), a mid-size version: Wikimedia's /960px- thumbnail, say.",
- "format": "uri",
- "maxLength": 2000,
- "type": "string"
- }
- },
- "required": [
- "url",
- "source",
- "credit"
- ],
- "type": "object"
- },
- "maxItems": 5,
- "type": "array"
- },
- "pros": {
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 12,
- "type": "array"
- },
- "recommended_by": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "name": {
- "description": "The friend's name, spelled as the trip already spells it.",
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "pad": {
- "description": "The pad it came through, when it did.",
- "type": "string"
- },
- "said": {
- "description": "Their own words, never rewritten.",
- "maxLength": 1000,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "name"
- ],
- "type": "object"
- },
- "maxItems": 20,
- "type": "array"
- },
- "refunds": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "amount": {
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "currency": {
- "pattern": "^[A-Z]{3}$",
- "type": "string"
- },
- "received": {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- "to": {
- "description": "The person it goes back to: their member id (mem_…) or person id.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "to",
- "amount",
- "currency"
- ],
- "type": "object"
- },
- "maxItems": 50,
- "type": "array"
- },
- "status": {
- "enum": [
- "idea",
- "planned",
- "booked",
- "cancelled",
- "done",
- "skipped",
- "missed",
- "dropped",
- "todo",
- "option",
- "not_chosen"
- ],
- "type": "string"
- },
- "tags": {
- "items": {
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "title": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "to": {
- "additionalProperties": false,
- "properties": {
- "address": {
- "maxLength": 300,
- "type": "string"
- },
- "city": {
- "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "lat": {
- "maximum": 90,
- "minimum": -90,
- "type": "number"
- },
- "lng": {
- "maximum": 180,
- "minimum": -180,
- "type": "number"
- },
- "name": {
- "maxLength": 200,
- "type": "string"
- },
- "precision": {
- "enum": [
- "spot",
- "area",
- "city",
- "region",
- "country",
- "none"
- ],
- "type": "string"
- },
- "radius_m": {
- "exclusiveMinimum": 0,
- "maximum": 1000000,
- "type": "number"
- },
- "ref": {
- "maxLength": 500,
- "type": "string"
- }
- },
- "required": [
- "precision"
- ],
- "type": "object"
- },
- "type": {
- "enum": [
- "place",
- "goal",
- "choice",
- "stay",
- "move",
- "task",
- "info"
- ],
- "type": "string"
- },
- "when": {
- "oneOf": [
- {
- "additionalProperties": false,
- "properties": {
- "precision": {
- "const": "none",
- "type": "string"
- }
- },
- "required": [
- "precision"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "end": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "pattern": "^day [1-9]\\d{0,2}$",
- "type": "string"
- }
- ]
- },
- "precision": {
- "const": "days",
- "type": "string"
- },
- "start": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "pattern": "^day [1-9]\\d{0,2}$",
- "type": "string"
- }
- ]
- }
- },
- "required": [
- "precision",
- "start",
- "end"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "day": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "pattern": "^day [1-9]\\d{0,2}$",
- "type": "string"
- }
- ]
- },
- "precision": {
- "const": "day",
- "type": "string"
- }
- },
- "required": [
- "precision",
- "day"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "day": {
- "anyOf": [
- {
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- {
- "pattern": "^day [1-9]\\d{0,2}$",
- "type": "string"
- }
- ]
- },
- "part": {
- "enum": [
- "morning",
- "afternoon",
- "evening",
- "night"
- ],
- "type": "string"
- },
- "precision": {
- "const": "part",
- "type": "string"
- }
- },
- "required": [
- "precision",
- "part"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "end": {
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- },
- "precision": {
- "const": "window",
- "type": "string"
- },
- "start": {
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- },
- "tz": {
- "type": "string"
- }
- },
- "required": [
- "precision",
- "start",
- "end",
- "tz"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "end": {
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- },
- "end_tz": {
- "type": "string"
- },
- "precision": {
- "const": "exact",
- "type": "string"
- },
- "start": {
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- },
- "tz": {
- "type": "string"
- }
- },
- "required": [
- "precision",
- "start",
- "tz"
- ],
- "type": "object"
- }
- ]
- },
- "where": {
- "additionalProperties": false,
- "properties": {
- "address": {
- "maxLength": 300,
- "type": "string"
- },
- "city": {
- "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "lat": {
- "maximum": 90,
- "minimum": -90,
- "type": "number"
- },
- "lng": {
- "maximum": 180,
- "minimum": -180,
- "type": "number"
- },
- "name": {
- "maxLength": 200,
- "type": "string"
- },
- "precision": {
- "enum": [
- "spot",
- "area",
- "city",
- "region",
- "country",
- "none"
- ],
- "type": "string"
- },
- "radius_m": {
- "exclusiveMinimum": 0,
- "maximum": 1000000,
- "type": "number"
- },
- "ref": {
- "maxLength": 500,
- "type": "string"
- }
- },
- "required": [
- "precision"
- ],
- "type": "object"
- }
- },
- "required": [
- "type",
- "title"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "description": "A name for this new item; later operations in the same batch can use it as $name.",
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "item",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "going": {
- "enum": [
- "yes",
- "no",
- "maybe"
- ],
- "type": "string"
- },
- "item": {
- "description": "The item's id, or $ref of an item created earlier in this batch.",
- "type": "string"
- },
- "tier": {
- "description": "\"no\" (not interested), \"maybe\" or \"yes\" (really want it).",
- "enum": [
- "no",
- "maybe",
- "yes"
- ],
- "type": "string"
- }
- },
- "required": [
- "item"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "type": {
- "const": "interest",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "items": {
- "description": "The ids (or $refs) of the places, goals or options it's about; none leaves it in the inbox.",
- "items": {
- "type": "string"
- },
- "maxItems": 50,
- "type": "array"
- },
- "note": {
- "maxLength": 1000,
- "type": "string"
- },
- "url": {
- "format": "uri",
- "type": "string"
- }
- },
- "required": [
- "url"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "link",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "for": {
- "description": "The friend's name.",
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "name": {
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "prompt": {
- "description": "What we'd like tips on.",
- "maxLength": 500,
- "type": "string"
- }
- },
- "required": [
- "name",
- "for"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "pad",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "on": {
- "description": "What it's on: an item (or $ref), research (rsr_…), the trip's id, or a member id (mem_…).",
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "maxLength": 4000,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "on",
- "text"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "note",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "about": {
- "description": "The item it's about, if any (an id or $ref).",
- "type": "string"
- },
- "options": {
- "items": {
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 10,
- "minItems": 2,
- "type": "array"
- },
- "text": {
- "maxLength": 1000,
- "minLength": 1,
- "type": "string"
- },
- "to": {
- "anyOf": [
- {
- "const": "everyone",
- "type": "string"
- },
- {
- "items": {
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 50,
- "minItems": 1,
- "type": "array"
- }
- ],
- "description": "\"everyone\", or the people asked: member ids (mem_…) or person ids."
- }
- },
- "required": [
- "to",
- "text"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "ask",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "ask": {
- "minLength": 1,
- "type": "string"
- },
- "choice": {
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "maxLength": 2000,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "ask"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "type": {
- "const": "answer",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "about": {
- "description": "The item it's about, if any (an id or $ref).",
- "type": "string"
- },
- "at": {
- "description": "Local time at the place, e.g. 2026-11-18T09:00.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
- "type": "string"
- },
- "text": {
- "maxLength": 500,
- "minLength": 1,
- "type": "string"
- },
- "to": {
- "anyOf": [
- {
- "const": "everyone",
- "type": "string"
- },
- {
- "items": {
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 50,
- "minItems": 1,
- "type": "array"
- }
- ],
- "description": "\"everyone\", or the people to remind: member ids (mem_…) or person ids."
- },
- "tz": {
- "type": "string"
- }
- },
- "required": [
- "at",
- "tz",
- "to",
- "text"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "reminder",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "details": {
- "additionalProperties": {
- "anyOf": [
- {
- "maxLength": 500,
- "type": "string"
- },
- {
- "type": "number"
- },
- {
- "type": "boolean"
- }
- ]
- },
- "description": "Number, issuer, reference, anything else: only its owner and those it's shared with see these.",
- "propertyNames": {
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "type": "object"
- },
- "expires": {
- "description": "Seen by the trip.",
- "format": "date",
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
- "type": "string"
- },
- "kind": {
- "description": "passport, visa, insurance, licence, vaccination, or another kind.",
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- },
- "shared_with": {
- "anyOf": [
- {
- "const": "everyone",
- "type": "string"
- },
- {
- "items": {
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 50,
- "type": "array"
- }
- ],
- "description": "Who else sees the details: \"everyone\" in the trip, or member ids. Nobody when left out."
- },
- "status": {
- "description": "Seen by the trip: \"valid\", \"applied\", \"approved\"...",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "kind",
- "title"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "document",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "fields": {
- "additionalProperties": false,
- "properties": {
- "about": {
- "description": "The ids (or $refs) of the items it's about; none for the trip in general.",
- "items": {
- "type": "string"
- },
- "maxItems": 50,
- "type": "array"
- },
- "sources": {
- "items": {
- "format": "uri",
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "text": {
- "description": "The answer as short labelled bullets (\"- **Single tickets:** ¥41,000\").",
- "maxLength": 4000,
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "description": "The question: \"JR Pass vs single tickets\".",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title",
- "text"
- ],
- "type": "object"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "ref": {
- "pattern": "^[A-Za-z0-9_-]{1,40}$",
- "type": "string"
- },
- "type": {
- "const": "research",
- "type": "string"
- }
- },
- "required": [
- "op",
- "type",
- "fields"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "if_version": {
- "description": "Fail unless the record is still at this version.",
- "exclusiveMinimum": 0,
- "maximum": 9007199254740991,
- "type": "integer"
- },
- "op": {
- "const": "update",
- "type": "string"
- },
- "set": {
- "additionalProperties": {},
- "description": "Fields to set. Keys are field names or dotted paths one level deep, e.g. \"when.start\".",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "unset": {
- "description": "Fields to remove, same keys as set.",
- "items": {
- "type": "string"
- },
- "type": "array"
- }
- },
- "required": [
- "op",
- "id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "op": {
- "const": "delete",
- "type": "string"
- }
- },
- "required": [
- "op",
- "id"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "amenities": {
+ "items": {
+ "maxLength": 80,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "best_time": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "booking": {
+ "additionalProperties": false,
+ "properties": {
+ "booked_by": {
+ "type": "string"
+ },
+ "booker": {
+ "type": "string"
+ },
+ "cancellation": {
+ "additionalProperties": false,
+ "properties": {
+ "steps": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "refund": {
+ "anyOf": [
+ {
+ "const": "full",
+ "type": "string"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "percent": {
+ "maximum": 100,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "percent"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "minimum": 0,
+ "type": "number"
+ },
+ "currency": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "until": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "required": [
+ "until",
+ "refund"
+ ],
+ "type": "object"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "text": {
+ "maxLength": 1000,
+ "type": "string"
+ }
+ },
+ "required": [
+ "steps"
+ ],
+ "type": "object"
+ },
+ "cancelled_on": {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ "for": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "provider": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "ref": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "booking_needed": {
+ "type": "boolean"
+ },
+ "books_from": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "days_before": {
+ "maximum": 400,
+ "minimum": 1,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "days_before"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "category": {
+ "maxLength": 40,
+ "type": "string"
+ },
+ "charges": {
+ "description": "What a card on file will be charged later, on a day: [{by, amount, currency, method, on}]. See guide { topic: \"money\" }.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "exclusiveMinimum": 0,
+ "type": "number"
+ },
+ "by": {
+ "description": "Whose card it goes on: their member id (mem_…) or person id.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "currency": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "method": {
+ "description": "Which card, by name: \"Mei's Visa\". Never its digits.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "on": {
+ "description": "The day the card is charged, in the booking's own time zone.",
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "by",
+ "amount",
+ "currency",
+ "on"
+ ],
+ "type": "object"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "closed": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "cons": {
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 12,
+ "type": "array"
+ },
+ "contact": {
+ "additionalProperties": false,
+ "properties": {
+ "email": {
+ "format": "email",
+ "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
+ "type": "string"
+ },
+ "phone": {
+ "pattern": "^\\+?[\\d\\s().-]{5,30}$",
+ "type": "string"
+ },
+ "social": {
+ "description": "Its Instagram or other pages.",
+ "items": {
+ "format": "uri",
+ "type": "string"
+ },
+ "maxItems": 5,
+ "type": "array"
+ },
+ "website": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "cost": {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "minimum": 0,
+ "type": "number"
+ },
+ "category": {
+ "enum": [
+ "stays",
+ "transport",
+ "food",
+ "activities",
+ "other"
+ ],
+ "type": "string"
+ },
+ "currency": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "estimate": {
+ "type": "boolean"
+ },
+ "per": {
+ "enum": [
+ "person",
+ "group"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ },
+ "data": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "due": {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ "duration": {
+ "maxLength": 40,
+ "type": "string"
+ },
+ "from": {
+ "additionalProperties": false,
+ "properties": {
+ "address": {
+ "maxLength": 300,
+ "type": "string"
+ },
+ "city": {
+ "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "lat": {
+ "maximum": 90,
+ "minimum": -90,
+ "type": "number"
+ },
+ "lng": {
+ "maximum": 180,
+ "minimum": -180,
+ "type": "number"
+ },
+ "name": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "precision": {
+ "enum": [
+ "spot",
+ "area",
+ "city",
+ "region",
+ "country",
+ "none"
+ ],
+ "type": "string"
+ },
+ "radius_m": {
+ "exclusiveMinimum": 0,
+ "maximum": 1000000,
+ "type": "number"
+ },
+ "ref": {
+ "maxLength": 500,
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision"
+ ],
+ "type": "object"
+ },
+ "getting_around": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "how": {
+ "description": "walk, bus, train, taxi, shuttle… (walk if not said)",
+ "maxLength": 40,
+ "type": "string"
+ },
+ "minutes": {
+ "maximum": 600,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "note": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "to": {
+ "description": "Where to: \"Nagano Station (JR, Shinkansen)\", \"Haneda Airport\".",
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "to"
+ ],
+ "type": "object"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "good_to_know": {
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "hours": {
+ "maxLength": 300,
+ "type": "string"
+ },
+ "important": {
+ "description": "Tasks: missing it costs money or the trip (a visa, a deposit, tickets that sell out). Everyone in the trip hears when it's done, moved, reassigned or removed.",
+ "type": "boolean"
+ },
+ "links": {
+ "items": {
+ "format": "uri",
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "nearby": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "minutes": {
+ "description": "Minutes' walk.",
+ "maximum": 120,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "name": {
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ },
+ "note": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "what": {
+ "description": "food, shops, convenience store, sight…",
+ "maxLength": 60,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name"
+ ],
+ "type": "object"
+ },
+ "maxItems": 15,
+ "type": "array"
+ },
+ "notes": {
+ "maxLength": 4000,
+ "type": "string"
+ },
+ "order": {
+ "type": "number"
+ },
+ "origin": {
+ "additionalProperties": false,
+ "properties": {
+ "by": {
+ "description": "Which AI; Tripmo fills it in from the connection.",
+ "maxLength": 100,
+ "type": "string"
+ },
+ "kind": {
+ "const": "ai",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind"
+ ],
+ "type": "object"
+ },
+ "owner": {
+ "type": "string"
+ },
+ "paid": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "exclusiveMinimum": 0,
+ "type": "number"
+ },
+ "by": {
+ "description": "The person who paid: their member id (mem_…) or person id.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "currency": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "method": {
+ "description": "How it was paid, in a few words, the card by name: \"Visa\", \"Mei's Visa\", \"Cash\", \"Bank transfer\", \"Citi Prestige points\". Never its digits.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "by",
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "parent": {
+ "type": "string"
+ },
+ "photos": {
+ "description": "Up to five pictures of it from the web, the best first, references only. See guide { topic: \"photos\" }.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "credit": {
+ "description": "Who to credit: the site's or the photographer's name (\"Wikimedia Commons\", \"Kyoto City\").",
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "source": {
+ "description": "The page it was found on; tapping the credit opens it.",
+ "format": "uri",
+ "maxLength": 2000,
+ "type": "string"
+ },
+ "url": {
+ "description": "The image itself (https), a mid-size version: Wikimedia's /960px- thumbnail, say.",
+ "format": "uri",
+ "maxLength": 2000,
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "source",
+ "credit"
+ ],
+ "type": "object"
+ },
+ "maxItems": 5,
+ "type": "array"
+ },
+ "pros": {
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 12,
+ "type": "array"
+ },
+ "recommended_by": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "description": "The friend's name, spelled as the trip already spells it.",
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "pad": {
+ "description": "The pad it came through, when it did.",
+ "type": "string"
+ },
+ "said": {
+ "description": "Their own words, never rewritten.",
+ "maxLength": 1000,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name"
+ ],
+ "type": "object"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "refunds": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "exclusiveMinimum": 0,
+ "type": "number"
+ },
+ "currency": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "received": {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ "to": {
+ "description": "The person it goes back to: their member id (mem_…) or person id.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "to",
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "status": {
+ "enum": [
+ "idea",
+ "planned",
+ "booked",
+ "cancelled",
+ "done",
+ "skipped",
+ "missed",
+ "dropped",
+ "todo",
+ "option",
+ "not_chosen"
+ ],
+ "type": "string"
+ },
+ "tags": {
+ "items": {
+ "maxLength": 40,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "title": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "to": {
+ "additionalProperties": false,
+ "properties": {
+ "address": {
+ "maxLength": 300,
+ "type": "string"
+ },
+ "city": {
+ "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "lat": {
+ "maximum": 90,
+ "minimum": -90,
+ "type": "number"
+ },
+ "lng": {
+ "maximum": 180,
+ "minimum": -180,
+ "type": "number"
+ },
+ "name": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "precision": {
+ "enum": [
+ "spot",
+ "area",
+ "city",
+ "region",
+ "country",
+ "none"
+ ],
+ "type": "string"
+ },
+ "radius_m": {
+ "exclusiveMinimum": 0,
+ "maximum": 1000000,
+ "type": "number"
+ },
+ "ref": {
+ "maxLength": 500,
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision"
+ ],
+ "type": "object"
+ },
+ "type": {
+ "enum": [
+ "place",
+ "goal",
+ "choice",
+ "stay",
+ "move",
+ "task",
+ "info"
+ ],
+ "type": "string"
+ },
+ "when": {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "precision": {
+ "const": "none",
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "end": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "pattern": "^day [1-9]\\d{0,2}$",
+ "type": "string"
+ }
+ ]
+ },
+ "precision": {
+ "const": "days",
+ "type": "string"
+ },
+ "start": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "pattern": "^day [1-9]\\d{0,2}$",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "required": [
+ "precision",
+ "start",
+ "end"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "day": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "pattern": "^day [1-9]\\d{0,2}$",
+ "type": "string"
+ }
+ ]
+ },
+ "precision": {
+ "const": "day",
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision",
+ "day"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "day": {
+ "anyOf": [
+ {
+ "format": "date",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ {
+ "pattern": "^day [1-9]\\d{0,2}$",
+ "type": "string"
+ }
+ ]
+ },
+ "part": {
+ "enum": [
+ "morning",
+ "afternoon",
+ "evening",
+ "night"
+ ],
+ "type": "string"
+ },
+ "precision": {
+ "const": "part",
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision",
+ "part"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "end": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ },
+ "precision": {
+ "const": "window",
+ "type": "string"
+ },
+ "start": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ },
+ "tz": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision",
+ "start",
+ "end",
+ "tz"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "end": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ },
+ "end_tz": {
+ "type": "string"
+ },
+ "precision": {
+ "const": "exact",
+ "type": "string"
+ },
+ "start": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ },
+ "tz": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision",
+ "start",
+ "tz"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "where": {
+ "additionalProperties": false,
+ "properties": {
+ "address": {
+ "maxLength": 300,
+ "type": "string"
+ },
+ "city": {
+ "description": "The city or town it's in, as people say it, never the ward or the prefecture: \"Tokyo\" for Oimachi, Shinagawa; \"Ikaho\", not Gunma; \"Seoul\", not Jung-gu. On every stay: it heads the stay's group on the map.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "lat": {
+ "maximum": 90,
+ "minimum": -90,
+ "type": "number"
+ },
+ "lng": {
+ "maximum": 180,
+ "minimum": -180,
+ "type": "number"
+ },
+ "name": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "precision": {
+ "enum": [
+ "spot",
+ "area",
+ "city",
+ "region",
+ "country",
+ "none"
+ ],
+ "type": "string"
+ },
+ "radius_m": {
+ "exclusiveMinimum": 0,
+ "maximum": 1000000,
+ "type": "number"
+ },
+ "ref": {
+ "maxLength": 500,
+ "type": "string"
+ }
+ },
+ "required": [
+ "precision"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "type",
+ "title"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "description": "A name for this new item; later operations in the same batch can use it as $name.",
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "item",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "going": {
+ "enum": [
+ "yes",
+ "no",
+ "maybe"
+ ],
+ "type": "string"
+ },
+ "item": {
+ "description": "The item's id, or $ref of an item created earlier in this batch.",
+ "type": "string"
+ },
+ "tier": {
+ "description": "\"no\" (not interested), \"maybe\" or \"yes\" (really want it).",
+ "enum": [
+ "no",
+ "maybe",
+ "yes"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "item"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "type": {
+ "const": "interest",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "items": {
+ "description": "The ids (or $refs) of the places, goals or options it's about; none leaves it in the inbox.",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "note": {
+ "maxLength": 1000,
+ "type": "string"
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "required": [
+ "url"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "link",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "for": {
+ "description": "The friend's name.",
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "name": {
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "prompt": {
+ "description": "What we'd like tips on.",
+ "maxLength": 500,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "for"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "pad",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "on": {
+ "description": "What it's on: an item (or $ref), research (rsr_…), the trip's id, or a member id (mem_…).",
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "maxLength": 4000,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "on",
+ "text"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "note",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "about": {
+ "description": "The item it's about, if any (an id or $ref).",
+ "type": "string"
+ },
+ "options": {
+ "items": {
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "minItems": 2,
+ "type": "array"
+ },
+ "text": {
+ "maxLength": 1000,
+ "minLength": 1,
+ "type": "string"
+ },
+ "to": {
+ "anyOf": [
+ {
+ "const": "everyone",
+ "type": "string"
+ },
+ {
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 50,
+ "minItems": 1,
+ "type": "array"
+ }
+ ],
+ "description": "\"everyone\", or the people asked: member ids (mem_…) or person ids."
+ }
+ },
+ "required": [
+ "to",
+ "text"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "ask",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "ask": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "choice": {
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "maxLength": 2000,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "ask"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "type": {
+ "const": "answer",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "about": {
+ "description": "The item it's about, if any (an id or $ref).",
+ "type": "string"
+ },
+ "at": {
+ "description": "Local time at the place, e.g. 2026-11-18T09:00.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$",
+ "type": "string"
+ },
+ "text": {
+ "maxLength": 500,
+ "minLength": 1,
+ "type": "string"
+ },
+ "to": {
+ "anyOf": [
+ {
+ "const": "everyone",
+ "type": "string"
+ },
+ {
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 50,
+ "minItems": 1,
+ "type": "array"
+ }
+ ],
+ "description": "\"everyone\", or the people to remind: member ids (mem_…) or person ids."
+ },
+ "tz": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "at",
+ "tz",
+ "to",
+ "text"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "reminder",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "fields": {
+ "additionalProperties": false,
+ "properties": {
+ "about": {
+ "description": "The ids (or $refs) of the items it's about; none for the trip in general.",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "sources": {
+ "items": {
+ "format": "uri",
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "text": {
+ "description": "The answer as short labelled bullets (\"- **Single tickets:** ¥41,000\").",
+ "maxLength": 4000,
+ "minLength": 1,
+ "type": "string"
+ },
+ "title": {
+ "description": "The question: \"JR Pass vs single tickets\".",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title",
+ "text"
+ ],
+ "type": "object"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "ref": {
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "type": {
+ "const": "research",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "type",
+ "fields"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "if_version": {
+ "description": "Fail unless the record is still at this version.",
+ "exclusiveMinimum": 0,
+ "maximum": 9007199254740991,
+ "type": "integer"
+ },
+ "op": {
+ "const": "update",
+ "type": "string"
+ },
+ "set": {
+ "additionalProperties": {},
+ "description": "Fields to set. Keys are field names or dotted paths one level deep, e.g. \"when.start\".",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "unset": {
+ "description": "Fields to remove, same keys as set.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "op",
+ "id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "op": {
+ "const": "delete",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "id"
+ ],
+ "type": "object"
+ }
+]