{"servers":[{"url":"https://api.tonnr.app/v1"}],"info":{"title":"Tonnr API","version":"1.0.0","description":"Every call names its caller: an account, by the session cookie it gets when it signs in, or a program, by an API key. A key reads the data everyone shares. What belongs to an account takes that account's session, and each such route says so. The instance's web app also reads the data everyone shares for a visitor who has no account, while the instance is open to them: `GET /visitors` says whether it is."},"components":{"securitySchemes":{"key":{"type":"http","scheme":"bearer","description":"An API key, which an operator of the instance makes."},"session":{"type":"apiKey","in":"cookie","name":"__Secure-better-auth.session_token","description":"The cookie that signing in at `/api/auth/sign-in/email` sets. A write sent with it also names the site it comes from, in `Origin`."}}},"security":[{"key":[]},{"session":[]}],"openapi":"3.1.1","paths":{"/account":{"get":{"operationId":"account.get","summary":"The caller's account, and whether it runs the instance","description":"Takes a signed-in session. The `id` is what `job operator` takes to make an account an operator of the instance.","tags":["Account"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"isOperator":{"type":"boolean"},"emailVerified":{"type":"boolean"},"checksAddresses":{"type":"boolean"}},"required":["id","name","username","email","isOperator","emailVerified","checksAddresses"]}}}}},"security":[{"session":[]}]}},"/account/verification":{"post":{"operationId":"account.sendVerification","summary":"Send the caller the mail that checks its address, again","description":"Takes a signed-in session. The mail holds a link, good for a day, which marks the address as checked and opens the web app at `/verified`, or under the prefix of the mail's language, such as `/fr/verified` for a mail in French. It signs no one in. The answer is 409 when the address is already checked, 429 with `Retry-After` when the account has had its mails for the hour or the day, and 503 when the instance sends no mail, has sent its mails for the day, or its provider did not take this one: the mail may still arrive then. Decision 026.","tags":["Account"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"locale":{"enum":["en","fr","es","pt"],"type":"string","default":"en"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"const":true}},"required":["sent"]}}}}},"security":[{"session":[]}]}},"/activity":{"post":{"operationId":"activity.record","summary":"Record daily app use","tags":["Activity"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true}},"required":["ok"]}}}}}}},"/accounts":{"get":{"operationId":"accounts.list","summary":"The accounts that signed up, the newest first","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. It gives each account's name, username and address, and nothing else of it: an operator reads who signed up, not what they keep. Pages follow one another through `after`.","tags":["Accounts"],"parameters":[{"name":"q","in":"query","schema":{"type":"string","minLength":1,"maxLength":80},"allowEmptyValue":true,"allowReserved":true},{"name":"after","in":"query","schema":{"type":"string","minLength":1,"maxLength":200},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"isOperator":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","username","email","emailVerified","createdAt","isOperator","suspendedAt"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]},"total":{"type":"number"}},"required":["accounts","next","total"]}}}}},"security":[{"session":[]}]}},"/accounts/{id}":{"get":{"operationId":"accounts.get","summary":"An account, as an operator sees it","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. It gives who the account is, whether it is suspended, and how many sessions it has open. Nothing of what the account keeps, and nothing of where its sessions came from.","tags":["Accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"isOperator":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"sessions":{"type":"number"},"sessionRenewedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","username","email","emailVerified","createdAt","isOperator","suspendedAt","sessions","sessionRenewedAt"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"accounts.update","summary":"Suspend an account, or let it in again","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A suspended account has its sessions closed and cannot sign in: the sign-in answers 403 with the code `ACCOUNT_SUSPENDED`. What it owns stays, and what it shared stays visible. An operator is not suspended: the answer is 409. Letting an account in again does not bring its sessions back. Decision 025.","tags":["Accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"suspended":{"type":"boolean"}},"required":["suspended"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"isOperator":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"sessions":{"type":"number"},"sessionRenewedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","username","email","emailVerified","createdAt","isOperator","suspendedAt","sessions","sessionRenewedAt"]}}}}},"security":[{"session":[]}]}},"/accounts/{id}/sessions":{"delete":{"operationId":"accounts.signOut","summary":"Close every session of an account","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Each device of the account signs in again. It works on any account, an operator's and the caller's own included. A request already let in goes to its end, and a sign-in that arrives at the same moment may open a session that stays: closing sessions keeps nobody out, suspending does. Decision 025.","tags":["Accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"closed":{"type":"number"}},"required":["closed"]}}}}},"security":[{"session":[]}]}},"/accounts/{id}/username":{"delete":{"operationId":"accounts.removeUsername","summary":"Take an account's username away","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. What the account wrote in a guide stays, and names nobody until the account chooses another username, which it must before it contributes again. Its friends read no name of it meanwhile. Nobody takes that username again, this account no more than another. The record of the action does not hold the username. Decision 041.","tags":["Accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"isOperator":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"sessions":{"type":"number"},"sessionRenewedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","username","email","emailVerified","createdAt","isOperator","suspendedAt","sessions","sessionRenewedAt"]}}}}},"security":[{"session":[]}]}},"/actions":{"get":{"operationId":"actions.list","summary":"What the operators did to the developer accounts, the keys, the accounts and the instance","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The latest first. Each change made through the API is recorded with it: creating, changing, suspending, resuming and deleting a developer account, adding a member to it and taking one out, making and revoking a key, closing an account's sessions, suspending an account and letting it in again, closing the instance to the visitors of its web app and opening it again, and changing, merging and deleting a break of the catalogue and deciding what a list proposes to it. A record of a member names the developer account and the account. A key is named and never shown. The commands run on the server are not recorded: whoever runs them is no account. A record is kept thirteen months. Pages follow one another through `after`.","tags":["Operator actions"],"parameters":[{"name":"developerId","in":"query","schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"accountId","in":"query","schema":{"type":"string","minLength":1,"maxLength":200},"allowEmptyValue":true,"allowReserved":true},{"name":"after","in":"query","schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"at":{"type":"string","format":"date-time","x-native-type":"date"},"action":{"type":"string","description":"One of: developer.create, developer.update, developer.suspend, developer.resume, developer.delete, developer.member_add, developer.member_remove, key.create, key.revoke, account.sign_out, account.suspend, account.resume, account.username_remove, spot.publish, spot.refuse, contribution.accept, contribution.refuse, contribution.keep, visitors.close, visitors.open, errors.off, errors.on, break.update, break.merge, break.delete, candidate.add, candidate.merge, candidate.ignore, candidate.later, candidate.reopen. A later version may add to them."},"operatorName":{"anyOf":[{"type":"string"},{"type":"null"}]},"developerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"developerName":{"anyOf":[{"type":"string"},{"type":"null"}]},"keyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountName":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","properties":{"name":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"callsPerHour":{"type":"object","properties":{"from":{"anyOf":[{"type":"number"},{"type":"null"}]},"to":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from","to"]},"contact":{"const":true},"note":{"const":true},"sessions":{"type":"number"},"breakId":{"type":"string"},"contributionId":{"type":"string"},"mergedId":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"candidate":{"type":"object","properties":{"list":{"type":"string"},"ref":{"type":"string"}},"required":["list","ref"]}}},{"type":"null"}]}},"required":["id","at","action","operatorName","developerId","developerName","keyName","accountId","accountName","changes"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["actions","next"]}}}}},"security":[{"session":[]}]}},"/agents":{"get":{"operationId":"agents.list","summary":"The assistants the caller signed in to read their account","description":"An assistant is an agent's client that the account allowed, on the web app's page, to read what it keeps through the MCP server. Its name is the one it gave itself.","tags":["Agents"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"agents":{"type":"array","items":{"type":"object","properties":{"clientId":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"site":{"anyOf":[{"type":"string"},{"type":"null"}]},"since":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["clientId","name","site","since"]}}},"required":["agents"]}}}}},"security":[{"session":[]}]}},"/agents/{clientId}":{"delete":{"operationId":"agents.disconnect","summary":"Take back what the caller allowed an assistant","description":"The assistant reads nothing more of the account from the next request on, and what it holds gets it no new token. It may ask the account again.","tags":["Agents"],"parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"clientId":{"type":"string"}},"required":["clientId"]}}}}},"security":[{"session":[]}]}},"/alerts":{"post":{"operationId":"alerts.create","summary":"Set an alert on one spot, or on several that work in the same conditions","description":"The conditions are checked at each of the spots, with that spot's own forecast and tide. A spot may be in several alerts, each with its name and its conditions.","tags":["Alerts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"spotIds":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"string"}},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean","default":true},"shortestMinutes":{"type":"integer","minimum":60,"maximum":1440,"multipleOf":60,"description":"The shortest window worth telling, in minutes: whole hours, one at least.","default":120},"zoneIfNone":{"type":"string","maxLength":64,"description":"The time zone to take if the account has none yet. It keeps the one it has."},"localeIfNone":{"enum":["en","fr","es","pt"],"type":"string","description":"The language to take if the account has none yet. It keeps the one it has."},"byMailIfNone":{"type":"boolean","description":"Whether the account wants its alerts by mail, if it never said. It keeps the answer it gave. Mail leaves once its address is checked."}},"required":["name","spotIds","criteria"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean"},"shortestMinutes":{"type":"number"},"spotIds":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","criteria","enabled","shortestMinutes","spotIds","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"get":{"operationId":"alerts.list","summary":"The caller's alerts","tags":["Alerts"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"alerts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean"},"shortestMinutes":{"type":"number"},"spotIds":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","criteria","enabled","shortestMinutes","spotIds","createdAt","updatedAt"]}}},"required":["alerts"]}}}}},"security":[{"session":[]}]}},"/alerts/{id}":{"get":{"operationId":"alerts.get","summary":"One of the caller's alerts","tags":["Alerts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean"},"shortestMinutes":{"type":"number"},"spotIds":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","criteria","enabled","shortestMinutes","spotIds","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"alerts.update","summary":"Change one of the caller's alerts","description":"What is left out stays as it is. `spotIds`, when given, are all the spots of the alert from then on. New conditions start the alert over, and so does switching it off: what it saw of the sea and what it told are forgotten, and nothing is called off.","tags":["Alerts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"spotIds":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"string"}},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean"},"shortestMinutes":{"type":"integer","minimum":60,"maximum":1440,"multipleOf":60,"description":"The shortest window worth telling, in minutes: whole hours, one at least."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"enabled":{"type":"boolean"},"shortestMinutes":{"type":"number"},"spotIds":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","criteria","enabled","shortestMinutes","spotIds","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"alerts.delete","summary":"Delete one of the caller's alerts","description":"Its spots stay. What it told stays in the caller's notifications.","tags":["Alerts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/alerts/preview":{"post":{"operationId":"alerts.preview","summary":"What conditions would give at some of the caller's spots, before they are saved","description":"For each spot: the forecast and the tide hour by hour, the conditions each hour does not meet, the windows in which all are met, and the hours of those windows the caller can use, by the settings of their account. Nothing is saved and nothing is told.","tags":["Alerts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spotIds":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"string"}},"criteria":{"type":"object","properties":{"waveHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"wavePeakPeriodSeconds":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":40},"max":{"type":"number","minimum":0,"maximum":40}}},"waveDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"primarySwellHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":30},"max":{"type":"number","minimum":0,"maximum":30}}},"primarySwellDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"windSpeedMetersPerSecond":{"type":"object","properties":{"min":{"type":"number","minimum":0,"maximum":120},"max":{"type":"number","minimum":0,"maximum":120}}},"windDirectionDegrees":{"type":"object","properties":{"from":{"type":"number","minimum":0,"maximum":360},"to":{"type":"number","minimum":0,"maximum":360}},"required":["from","to"]},"tideHeightMeters":{"type":"object","properties":{"min":{"type":"number","minimum":-5,"maximum":20},"max":{"type":"number","minimum":-5,"maximum":20}}},"tideTrend":{"enum":["rising","falling"],"type":"string"}},"additionalProperties":false},"shortestMinutes":{"type":"integer","minimum":60,"maximum":1440,"multipleOf":60,"description":"The shortest window worth telling, in minutes: whole hours, one at least.","default":120},"days":{"type":"integer","minimum":1,"maximum":7,"default":7}},"required":["spotIds","criteria"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"spots":{"type":"array","items":{"type":"object","properties":{"spotId":{"type":"string"},"hasSea":{"type":"boolean"},"hasTide":{"type":"boolean"},"hours":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","format":"date-time","x-native-type":"date"},"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]},"unmet":{"type":"array","items":{"enum":["waveHeightMeters","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windDirectionDegrees","tideHeightMeters","tideTrend"],"type":"string"}}},"required":["time","waveHeightMeters","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windDirectionDegrees","tideHeightMeters","tideTrend","unmet"]}},"windows":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time","x-native-type":"date"},"end":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["start","end"]}},"open":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time","x-native-type":"date"},"end":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["start","end"]}},"forecastFetchedAt":{"type":"string","format":"date-time","x-native-type":"date"},"forecastStale":{"type":"boolean"}},"required":["spotId","hasSea","hasTide","hours","windows","open","forecastFetchedAt","forecastStale"]}},"forecastSource":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"attribution":{"type":"string"},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]},"credits":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"url":{"type":"string"}},"required":["text","url"]}},"notice":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","url","attribution","license","credits","notice"]}},"required":["spots","forecastSource"]}}}}},"security":[{"session":[]}]}},"/alert-settings":{"get":{"operationId":"alerts.getSettings","summary":"How the caller wants to be told, for all their alerts","description":"An account that has set nothing is given the defaults.","tags":["Alerts"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"horizonDays":{"type":"number"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}]},"locale":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"onFound":{"type":"boolean"},"onEvening":{"type":"boolean"},"eveningMinutes":{"type":"number"},"onChange":{"type":"boolean"},"onBegin":{"type":"boolean"},"noticeMinutes":{"type":"number"},"daylightOnly":{"type":"boolean"},"week":{"anyOf":[{"type":"array","items":{"type":"array","maxItems":6,"items":{"type":"object","properties":{"from":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60},"to":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60}},"required":["from","to"]}}},{"type":"null"}]},"awayUntil":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"quietFrom":{"anyOf":[{"type":"number"},{"type":"null"}]},"quietTo":{"anyOf":[{"type":"number"},{"type":"null"}]},"byMail":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"namesInSubject":{"type":"boolean"},"mail":{"enum":["ready","unchecked","off"],"type":"string"}},"required":["horizonDays","zone","locale","onFound","onEvening","eveningMinutes","onChange","onBegin","noticeMinutes","daylightOnly","week","awayUntil","quietFrom","quietTo","byMail","namesInSubject","mail"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"alerts.updateSettings","summary":"Change how the caller wants to be told","description":"What is left out stays as it is. A setting changes what is told from then on: it calls nothing off, and tells nothing again. `zoneIfNone` and `localeIfNone` are taken by an account that has no time zone or no language yet, and by no other.","tags":["Alerts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"horizonDays":{"type":"integer","minimum":1,"maximum":5},"zone":{"type":"string","maxLength":64},"locale":{"enum":["en","fr","es","pt"],"type":"string"},"onFound":{"type":"boolean"},"onEvening":{"type":"boolean"},"eveningMinutes":{"type":"integer","minimum":0,"maximum":1439},"onChange":{"type":"boolean"},"onBegin":{"type":"boolean"},"noticeMinutes":{"type":"integer","minimum":0,"maximum":240,"multipleOf":15},"daylightOnly":{"type":"boolean"},"week":{"anyOf":[{"type":"array","minItems":7,"maxItems":7,"items":{"type":"array","maxItems":6,"items":{"type":"object","properties":{"from":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60},"to":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60}},"required":["from","to"]}}},{"type":"null"}]},"awayUntil":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"quietFrom":{"anyOf":[{"type":"integer","minimum":0,"maximum":1439},{"type":"null"}]},"quietTo":{"anyOf":[{"type":"integer","minimum":0,"maximum":1439},{"type":"null"}]},"byMail":{"type":"boolean"},"namesInSubject":{"type":"boolean"},"zoneIfNone":{"type":"string","maxLength":64,"description":"The time zone to take if the account has none yet. It keeps the one it has."},"localeIfNone":{"enum":["en","fr","es","pt"],"type":"string","description":"The language to take if the account has none yet. It keeps the one it has."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"horizonDays":{"type":"number"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}]},"locale":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"onFound":{"type":"boolean"},"onEvening":{"type":"boolean"},"eveningMinutes":{"type":"number"},"onChange":{"type":"boolean"},"onBegin":{"type":"boolean"},"noticeMinutes":{"type":"number"},"daylightOnly":{"type":"boolean"},"week":{"anyOf":[{"type":"array","items":{"type":"array","maxItems":6,"items":{"type":"object","properties":{"from":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60},"to":{"type":"integer","minimum":0,"maximum":1440,"multipleOf":60}},"required":["from","to"]}}},{"type":"null"}]},"awayUntil":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"quietFrom":{"anyOf":[{"type":"number"},{"type":"null"}]},"quietTo":{"anyOf":[{"type":"number"},{"type":"null"}]},"byMail":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"namesInSubject":{"type":"boolean"},"mail":{"enum":["ready","unchecked","off"],"type":"string"}},"required":["horizonDays","zone","locale","onFound","onEvening","eveningMinutes","onChange","onBegin","noticeMinutes","daylightOnly","week","awayUntil","quietFrom","quietTo","byMail","namesInSubject","mail"]}}}}},"security":[{"session":[]}]}},"/alert-mails/off":{"post":{"operationId":"alerts.mailOff","summary":"Stop the alert mails of an account, from the link of one of them","description":"What the link at the foot of an alert mail does, and what a mail program asks when its reader presses \"unsubscribe\": it takes no session and no key of the API. `u` and `k` are the two values the link carries. It switches alert mails off for that account and does nothing else: it reads nothing, and switches nothing on.","tags":["Alerts"],"parameters":[{"name":"u","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"The account, as the link names it."},"allowEmptyValue":true,"allowReserved":true},{"name":"k","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"The key the link carries."},"allowEmptyValue":true,"allowReserved":true},{"name":"l","in":"query","required":false,"schema":{"type":"string","maxLength":8,"description":"The language of the mail, which the page uses."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"off":{"type":"boolean"}},"required":["off"]}}}}},"security":[]},"get":{"operationId":"alerts.mailOffPage","summary":"Go to the page that stops the alert mails of an account","description":"Where a mail program lands when it opens the address of a mail's `List-Unsubscribe` header instead of posting to it: the page of the web app with the one button that stops alert mails. Following it switches nothing off.","tags":["Alerts"],"parameters":[{"name":"u","in":"query","schema":{"type":"string","maxLength":200,"description":"The account, as the link names it."},"allowEmptyValue":true,"allowReserved":true},{"name":"k","in":"query","schema":{"type":"string","maxLength":200,"description":"The key the link carries."},"allowEmptyValue":true,"allowReserved":true},{"name":"l","in":"query","schema":{"type":"string","maxLength":8,"description":"The language of the mail the link is in."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"303":{"description":"OK","headers":{"location":{"schema":{"type":"string"},"required":true}}}},"security":[]}},"/breaks":{"get":{"operationId":"breaks.list","summary":"The catalogue of surf breaks, in an area or by name","description":"The breaks the instance knows, to pick a spot from, each with what is known of it. Of the spots users created, the catalogue holds those an operator accepted to make public, with `community` as their provider. Pages follow one another through `after`, so the whole catalogue can be read.","tags":["Breaks"],"parameters":[{"name":"bbox","in":"query","schema":{"type":"string","description":"An area as \"west,south,east,north\" in decimal degrees, the longitudes first: \"-5.2,47.6,-4.0,48.5\". West is greater than east for a box across the antimeridian."},"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","minLength":2,"maxLength":80,"description":"Part of the name, in any case and with or without its accents."},"allowEmptyValue":true,"allowReserved":true},{"name":"after","in":"query","schema":{"type":"string","format":"uuid","description":"The `next` of the page before."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":2000,"default":500},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"breaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","url","attribution","license"]}},"required":["id","name","latitude","longitude","characteristics","location","timezone","description","source"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["breaks","next"]}}}}}}},"/breaks/search":{"get":{"operationId":"breaks.search","summary":"Surf breaks by their name or their town's, the likeliest first","description":"The breaks whose name holds `q`, whatever its case and its marks: \"guethary\" finds \"Guéthary\". A name that begins with it comes first, then one in which a word does, then one that holds it, and last the breaks of a place whose name holds it: a town finds its breaks. Given together, `latitude` and `longitude` bring forward the breaks nearest that point among those, as the middle of a map does. No page follows: a search that finds too many is typed further.","tags":["Breaks"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":80,"description":"The name of a break or of its town, or its beginning."},"allowEmptyValue":true,"allowReserved":true},{"name":"latitude","in":"query","required":false,"schema":{"type":"number","minimum":-90,"maximum":90},"allowEmptyValue":true,"allowReserved":true},{"name":"longitude","in":"query","required":false,"schema":{"type":"number","minimum":-180,"maximum":180},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":20,"default":8},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"breaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","url","attribution","license"]}},"required":["id","name","latitude","longitude","characteristics","location","timezone","description","source"]}}},"required":["breaks"]}}}}}}},"/breaks/{id}":{"get":{"operationId":"breaks.get","summary":"One surf break of the catalogue","tags":["Breaks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"A break's `id`, as a list or a search of breaks gives it."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","url","attribution","license"]}},"required":["id","name","latitude","longitude","characteristics","location","timezone","description","source"]}}}}}}},"/breaks/{id}/name":{"get":{"operationId":"breaks.named","summary":"The name of a surf break, for a link to it","description":"Takes neither a key nor a session, even while the instance is closed to visitors: the web app names a break this way where its short address is shown before it is opened, in a message. It answers the name and nothing else.","tags":["Breaks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}}},"security":[]}},"/candidates":{"get":{"operationId":"candidates.list","summary":"The breaks lists propose to the catalogue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The candidates in one state, of every list or of one, in the order their list gives them, with how many there are in each state and in each region. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"status","in":"query","schema":{"enum":["waiting","later","added","merged","ignored"],"type":"string","default":"waiting"},"allowEmptyValue":true,"allowReserved":true},{"name":"list","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"region","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt"]}},"counts":{"type":"object","propertyNames":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"additionalProperties":{"type":"number"}},"regions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"total":{"type":"number"}},"required":["name","total"]}},"lists":{"type":"array","items":{"type":"string"}}},"required":["candidates","counts","regions","lists"]}}}}},"security":[{"session":[]}]}},"/candidates/{id}":{"get":{"operationId":"candidates.get","summary":"One break a list proposes, with what to decide it on","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The candidate with everything its list says of it, the break it went into or is proposed to go into, the breaks within 3000 meters, and the next that waits. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/candidates/images/{list}/{name}":{"get":{"operationId":"candidates.image","summary":"A picture a list's candidates show","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Such as a page of a guide's map. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"list","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","contentMediaType":"*/*"}}}}},"security":[{"session":[]}]}},"/candidates/{id}/add":{"post":{"operationId":"candidates.add","summary":"Add a candidate to the catalogue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A break is made of it with `values`, and named by its list and its reference, with no source page, attribution or licence: those of a list are not published. What the list said besides is kept aside with it. `updatedAt` is the candidate's as it was read. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"values":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]}},"required":["name","latitude","longitude","characteristics","description"]}},"required":["updatedAt","values"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/candidates/{id}/merge":{"post":{"operationId":"candidates.merge","summary":"Merge a candidate into a break of the catalogue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The break `breakId` takes `values`, and what the list said of the candidate is kept aside with it. Both `updatedAt` are as they were read. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"breakId":{"type":"string"},"breakUpdatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"values":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]}},"required":["name","latitude","longitude","characteristics","description"]}},"required":["updatedAt","breakId","breakUpdatedAt","values"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/candidates/{id}/ignore":{"post":{"operationId":"candidates.ignore","summary":"Leave a candidate out of the catalogue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. It stays, decided, and may be put back in the queue. `note` says why, for the operator. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"note":{"type":"string","maxLength":500}},"required":["updatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/candidates/{id}/later":{"post":{"operationId":"candidates.later","summary":"Put off a candidate, to read it after the others","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["updatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/candidates/{id}/reopen":{"post":{"operationId":"candidates.reopen","summary":"Put a candidate that was left out or put off back in the queue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. One that became a break, or was merged into one, waits again once that break is deleted. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["updatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"candidate":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"status":{"enum":["waiting","later","added","merged","ignored"],"type":"string"},"action":{"anyOf":[{"enum":["add","merge","hold"],"type":"string"},{"type":"null"}]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"pointNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"pointUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"proposal":{"anyOf":[{"type":"object","properties":{"action":{"enum":["add","merge","hold"],"type":"string"},"breakId":{"type":"string"},"others":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"note":{"type":"string"},"doubts":{"type":"array","items":{"type":"string"}}},"required":["action"]},{"type":"null"}]},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"note":{"type":"string"}},"required":["url"]}},"texts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"language":{"type":"string"},"text":{"type":"string"}},"required":["label","text"]}},"figures":{"type":"array","items":{"type":"object","properties":{"image":{"type":"string"},"crop":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"mark":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]},"caption":{"type":"string"}},"required":["image"]}},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","list","ref","name","location","status","action","latitude","longitude","decidedAt","pointNote","pointUrl","characteristics","proposal","evidence","texts","figures","details","note","breakId","updatedAt"]},"target":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},{"type":"null"}]},"others":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"anyOf":[{"type":"number"},{"type":"null"}]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}},"next":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["candidate","target","others","nearby","next"]}}}}},"security":[{"session":[]}]}},"/catalogue/map":{"get":{"operationId":"catalogue.map","summary":"Every break of the catalogue, to draw on a map","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Each break with its point, its list, and whether anything is known of it and whether it has a description, in one answer. Decision 049.","tags":["Catalogue"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"breaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"known":{"type":"boolean"},"described":{"type":"boolean"}},"required":["id","name","latitude","longitude","provider","known","described"]}}},"required":["breaks"]}}}}},"security":[{"session":[]}]}},"/catalogue/{id}":{"get":{"operationId":"catalogue.get","summary":"One break of the catalogue, as an operator reads it","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The break with what the catalogue holds and what accounts confirmed of it, what uses it, what each list said of it, the candidates that went into it, and the breaks within 1000 meters. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"break":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},"uses":{"type":"object","properties":{"spots":{"type":"number"},"lists":{"type":"number"},"sessions":{"type":"number"},"contributions":{"type":"number"},"answers":{"type":"number"},"publications":{"type":"number"}},"required":["spots","lists","sessions","contributions","answers","publications"]},"listings":{"type":"array","items":{"type":"object","properties":{"list":{"type":"string"},"ref":{"type":"string"},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]}},"required":["list","ref","details"]}},"candidates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","list","ref","name","status"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}}},"required":["break","uses","listings","candidates","nearby"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"catalogue.update","summary":"Change a break of the catalogue","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Its name, its point, what it is like and its description, all given. `updatedAt` is the break's as it was read: one that changed since is not changed, and the answer is 409. What accounts confirmed of a line still shows over the catalogue's words. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"values":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]}},"required":["name","latitude","longitude","characteristics","description"]}},"required":["updatedAt","values"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"break":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},"uses":{"type":"object","properties":{"spots":{"type":"number"},"lists":{"type":"number"},"sessions":{"type":"number"},"contributions":{"type":"number"},"answers":{"type":"number"},"publications":{"type":"number"}},"required":["spots","lists","sessions","contributions","answers","publications"]},"listings":{"type":"array","items":{"type":"object","properties":{"list":{"type":"string"},"ref":{"type":"string"},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]}},"required":["list","ref","details"]}},"candidates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","list","ref","name","status"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}}},"required":["break","uses","listings","candidates","nearby"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"catalogue.remove","summary":"Delete a break of the catalogue that no account uses","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A break that a spot, a list, a session, a guide or a request uses is not deleted: the answer is 409, with what uses it, and the break is merged into another instead. The candidates that went into it wait to be decided again. Adding its list again does not bring it back. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["updatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/catalogue/{id}/merge":{"post":{"operationId":"catalogue.merge","summary":"Merge another break into this one","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The break `mergeId` goes: the spots, lists, sessions, answers and listings that named it name this one, which takes `values`, and the source of the one `sourceOf` says. A break that accounts wrote in the guide of, or that was made of a spot, does not go: the answer is 409, and the other is merged into it. Both `updatedAt` are as they were read. Decision 049.","tags":["Catalogue"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"mergeId":{"type":"string"},"mergeUpdatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"values":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]}},"required":["name","latitude","longitude","characteristics","description"]},"sourceOf":{"enum":["kept","merged"],"type":"string","default":"kept"}},"required":["updatedAt","mergeId","mergeUpdatedAt","values"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"break":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"confirmed":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}}},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"language":{"enum":["en","fr"],"type":"string"}},"required":["text","language"]},{"type":"null"}]},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"ref":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"}},"required":["type","url"]},{"type":"null"}]}},"required":["provider","ref","url","attribution","license"]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","confirmed","description","location","timezone","source","createdAt","updatedAt"]},"uses":{"type":"object","properties":{"spots":{"type":"number"},"lists":{"type":"number"},"sessions":{"type":"number"},"contributions":{"type":"number"},"answers":{"type":"number"},"publications":{"type":"number"}},"required":["spots","lists","sessions","contributions","answers","publications"]},"listings":{"type":"array","items":{"type":"object","properties":{"list":{"type":"string"},"ref":{"type":"string"},"details":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]}},"required":["list","ref","details"]}},"candidates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"list":{"type":"string"},"ref":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id","list","ref","name","status"]}},"nearby":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"meters":{"type":"number"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","latitude","longitude","meters","provider"]}}},"required":["break","uses","listings","candidates","nearby"]}}}}},"security":[{"session":[]}]}},"/console":{"get":{"operationId":"console.get","summary":"The developer accounts the caller is a member of, with their keys","description":"Takes the signed-in session of an account that an operator made a member of the developer account. No key calls this. Each account comes with its limit, the calls its keys were let through in the hour under way, and its keys by name. A key itself is not here: it was shown once, when it was made. An account that is a member of none gets an empty list.","tags":["Console"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"developers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"callsPerHour":{"anyOf":[{"type":"number"},{"type":"null"}]},"callsThisHour":{"type":"number"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","prefix","createdAt","lastUsedAt","revokedAt"]}}},"required":["id","name","callsPerHour","callsThisHour","suspendedAt","keys"]}}},"required":["developers"]}}}}},"security":[{"session":[]}]}},"/console/usage/series":{"get":{"operationId":"console.series","summary":"The calls of a developer account's keys over time, by the hour or by the day","description":"Takes the signed-in session of an account that an operator made a member of the developer account. No key calls this. The counts are approximate and up to thirty seconds late: the API writes them every thirty seconds, and loses some when it is killed. They are kept thirteen months. An hour or a day without a call is left out. A developer account the caller is no member of answers 404, as one that does not exist.","tags":["Console"],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"developerId","in":"query","required":true,"schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"way","in":"query","required":false,"schema":{"enum":["api","mcp"],"type":"string","description":"Only the calls that came this way: `api` for `/v1` and `/rpc`, `mcp` for `/mcp`."},"allowEmptyValue":true,"allowReserved":true},{"name":"step","in":"query","required":false,"schema":{"enum":["hour","day"],"type":"string","default":"hour"},"allowEmptyValue":true,"allowReserved":true},{"name":"timeZone","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"UTC"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"answered":{"type":"number"},"invalid":{"type":"number"},"refused":{"type":"number"},"limited":{"type":"number"},"failed":{"type":"number"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["answered","invalid","refused","limited","failed","at"]}}},"required":["points"]}}}}},"security":[{"session":[]}]}},"/console/usage/breakdown":{"get":{"operationId":"console.breakdown","summary":"The calls of a developer account's keys in a span, by key or by what was called","description":"Takes the signed-in session of an account that an operator made a member of the developer account. No key calls this. The counts are approximate and up to thirty seconds late: the API writes them every thirty seconds, and loses some when it is killed. They are kept thirteen months. `by=way` tells the calls that came by the MCP server from the others. The rows with the most calls come first, a hundred at most. A developer account the caller is no member of answers 404.","tags":["Console"],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"developerId","in":"query","required":true,"schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"way","in":"query","required":false,"schema":{"enum":["api","mcp"],"type":"string","description":"Only the calls that came this way: `api` for `/v1` and `/rpc`, `mcp` for `/mcp`."},"allowEmptyValue":true,"allowReserved":true},{"name":"by","in":"query","required":true,"schema":{"enum":["key","way","procedure"],"type":"string"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"answered":{"type":"number"},"invalid":{"type":"number"},"refused":{"type":"number"},"limited":{"type":"number"},"failed":{"type":"number"},"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["answered","invalid","refused","limited","failed","id","name"]}}},"required":["rows"]}}}}},"security":[{"session":[]}]}},"/contributions":{"post":{"operationId":"contributions.propose","summary":"Write a line of a break's guide","description":"Takes a signed-in session of an account that has a username: the line is read under it. `line` is one of the guide's lists of words, with `value` a list of the catalogue's words for it, or one of its four texts (`access`, `entry`, `hazards`, `rules`), with `value` a text of 3 to 500 characters and `language` the language it is written in. `agreed` says that the account gives it under the Open Database License, and a text under the Database Contents License: the row keeps which. A contribution waits for an operator of the instance to read it. A list of words from an account that had three contributions confirmed shows at once, as waiting to be confirmed. Writing a line again takes back what waited of it. The answer is 409 when the guide already says so, 403 for an account with no username or with 30 contributions waiting, and 429 after 60 in a day. Decision 041.","tags":["Contributions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"breakId":{"type":"string","format":"uuid"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","maxItems":40,"items":{"type":"string","maxLength":40}},{"type":"string","maxLength":2000}]},"language":{"enum":["en","fr","es","pt"],"type":"string"},"agreed":{"const":true}},"required":["breakId","line","value","agreed"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},{"type":"null"}]},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules","place"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"confirmedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","break","line","value","language","status","reason","createdAt","confirmedAt"]}}}}},"security":[{"session":[]}]},"get":{"operationId":"contributions.mine","summary":"What the caller wrote, and where it stands","description":"Takes a signed-in session. The caller's contributions, the latest first, with what became of each, and its standing: a score, computed from the contributions that were confirmed and kept nowhere, and a rank, which is kept once it is reached. A line of a break counts once, 5 points for a list of words and 10 for a text. A spot that became a break of the catalogue counts 20, and an account made through the caller's link 15, once it had a contribution confirmed. The ranks are `qs` from 20 points, `cs` from 150 and `ct` from 600. Decision 041.","tags":["Contributions"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"score":{"type":"number"},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]},"next":{"anyOf":[{"type":"object","properties":{"rank":{"enum":["qs","cs","ct"],"type":"string"},"from":{"type":"number"}},"required":["rank","from"]},{"type":"null"}]},"confirmed":{"type":"number"},"sponsorships":{"type":"number"},"trusted":{"type":"boolean"},"contributions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},{"type":"null"}]},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules","place"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"confirmedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","break","line","value","language","status","reason","createdAt","confirmedAt"]}}},"required":["username","score","rank","next","confirmed","sponsorships","trusted","contributions"]}}}}},"security":[{"session":[]}]}},"/contributions/{id}":{"delete":{"operationId":"contributions.withdraw","summary":"Take back a contribution of the caller's that waits","description":"Takes a signed-in session. A contribution that waits to be read or to be confirmed is closed, and its row stays. One that was confirmed or refused is not taken back: the answer is 404. Decision 041.","tags":["Contributions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"withdrawn":{"const":true}},"required":["withdrawn"]}}}}},"security":[{"session":[]}]}},"/contributions/{id}/confirmation":{"put":{"operationId":"contributions.confirm","summary":"Say that a contribution of another account is right","description":"Takes a signed-in session of an account that keeps the break: it holds it in a list of its own, or has a spot of its own on it. Its address is checked, where the instance checks addresses, and one of its own contributions was confirmed. It is said of a contribution that shows as waiting to be confirmed, once, by an account that did not write it. 2 accounts make it confirmed: it is then what its line says. An account that contested it does not confirm it: the answer is 409. Who said so is answered to nobody. Decision 041.","tags":["Contributions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"confirmations":{"type":"number"}},"required":["status","confirmations"]}}}}},"security":[{"session":[]}]}},"/contributions/{id}/contest":{"put":{"operationId":"contributions.contest","summary":"Say that a contribution of another account is wrong, and why","description":"Takes a signed-in session of an account that keeps the break. It is said of a contribution that shows, confirmed or not, once, with a reason that an operator of the instance reads. It changes nothing by itself: the contribution stays as it is until the operator refuses it, or keeps it. Neither the reason nor who gave it is answered to another account. An account contests at most 20 contributions in a day. Decision 041.","tags":["Contributions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":280}},"required":["reason"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"contested":{"const":true}},"required":["contested"]}}}}},"security":[{"session":[]}]}},"/developers":{"get":{"operationId":"developers.list","summary":"The developer accounts of the instance, by name","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020.","tags":["Developer accounts"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"developers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"callsPerHour":{"anyOf":[{"type":"number"},{"type":"null"}]},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"keys":{"type":"number"},"callsThisHour":{"type":"number"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","contact","note","callsPerHour","suspendedAt","createdAt","keys","callsThisHour","lastUsedAt"]}}},"required":["developers"]}}}}},"security":[{"session":[]}]},"post":{"operationId":"developers.create","summary":"Create a developer account","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A developer account is whoever consumes the API with keys. It is not an account that signs in: it has no password and no session.","tags":["Developer accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"contact":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"default":null},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"default":null},"callsPerHour":{"anyOf":[{"type":"integer","minimum":1,"maximum":1000000},{"type":"null"}],"default":null}},"required":["name"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"callsPerHour":{"anyOf":[{"type":"number"},{"type":"null"}]},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"keys":{"type":"number"},"callsThisHour":{"type":"number"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","contact","note","callsPerHour","suspendedAt","createdAt","keys","callsThisHour","lastUsedAt"]}}}}},"security":[{"session":[]}]}},"/developers/{id}":{"patch":{"operationId":"developers.update","summary":"Change a developer account, suspend it, or resume it","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. What is left out stays as it is. While an account is suspended none of its keys works. They work again once it is resumed, the revoked ones aside.","tags":["Developer accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"contact":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"callsPerHour":{"anyOf":[{"type":"integer","minimum":1,"maximum":1000000},{"type":"null"}]},"suspended":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"callsPerHour":{"anyOf":[{"type":"number"},{"type":"null"}]},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"keys":{"type":"number"},"callsThisHour":{"type":"number"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","contact","note","callsPerHour","suspendedAt","createdAt","keys","callsThisHour","lastUsedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"developers.delete","summary":"Delete a developer account, with its keys and their counts","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Its keys stop working at once, and nothing of the account is kept. To stop an account and keep its history, suspend it instead.","tags":["Developer accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]}}}}},"security":[{"session":[]}]}},"/developers/{id}/members":{"get":{"operationId":"developers.members","summary":"The accounts that may read a developer account in the console","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A member reads the account's name, its limit, its keys by name and their calls, and changes nothing. Decision 027.","tags":["Developer accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"addedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","email","emailVerified","suspendedAt","addedAt"]}}},"required":["members"]}}}}},"security":[{"session":[]}]},"post":{"operationId":"developers.addMember","summary":"Let an account read a developer account in the console","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The account is named by its identifier, which the list of accounts gives. An address proves nothing of who holds an account, checked or not: name the account you know to be theirs. Adding a member that is one already changes nothing.","tags":["Developer accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accountId":{"type":"string","minLength":1,"maxLength":200}},"required":["accountId"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"addedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","email","emailVerified","suspendedAt","addedAt"]}}},"required":["members"]}}}}},"security":[{"session":[]}]}},"/developers/{id}/members/{accountId}":{"delete":{"operationId":"developers.removeMember","summary":"Take the console of a developer account from an account","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The account reads nothing of the developer account from its next call. Removing one that is no member changes nothing.","tags":["Developer accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"accountId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"suspendedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"addedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","email","emailVerified","suspendedAt","addedAt"]}}},"required":["members"]}}}}},"security":[{"session":[]}]}},"/error-reports":{"get":{"operationId":"errorReports.get","summary":"Whether the web app sends error reports","description":"Takes neither a key nor a session. The web app sends an error report from a browser whose person accepted the analytics and did not turn the reports off, until an operator turns them off for every browser. Decision 054.","tags":["Instance"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"]}}}}},"security":[]},"put":{"operationId":"errorReports.update","summary":"Turn the web app's error reports off for every browser, or on again","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Off, the web app sends no error report, whatever a person chose, from the next page it loads. On, it sends them again from a browser whose person accepted them. Turning off what is off changes nothing and records nothing, and so does turning on what is on. The API's own fault reports do not depend on it.","tags":["Instance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"pausedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["pausedAt"]}}}}},"security":[{"session":[]}]}},"/forecasts":{"get":{"operationId":"forecasts.get","summary":"Hourly wave, wind, and weather forecast at a point","tags":["Forecasts"],"parameters":[{"name":"latitude","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Decimal degrees, north positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"longitude","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Decimal degrees, east positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":7,"default":3,"description":"How many days of hours, from the start of today in UTC."},"allowEmptyValue":true,"allowReserved":true},{"name":"pastDays","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":2,"default":0,"description":"Days before today to add at the start. Their hours are what the models last computed for them, not the forecast as it was first issued."},"allowEmptyValue":true,"allowReserved":true},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The first hour to answer, ISO 8601 in UTC. Given with `end`, it takes the place of `days` and `pastDays`: a period of one's own, from 2 days before today to 7 days from the start of today."},"allowEmptyValue":true,"allowReserved":true},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The hour to stop before, ISO 8601 in UTC: after `start`."},"allowEmptyValue":true,"allowReserved":true},{"name":"stepHours","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":12,"default":1,"description":"One hour in so many, counted from the first hour answered: 3 gives 00:00, 03:00 and 06:00 when the first is midnight. An hour that is kept is the models' value at that hour, not a mean of the hours left out."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"point":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]},"source":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"attribution":{"type":"string"},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]},"credits":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"url":{"type":"string"}},"required":["text","url"]}},"notice":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","url","attribution","license","credits","notice"]},"waveModels":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"producer":{"type":"string"},"resolutionKilometers":{"type":"number"},"from":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["name","producer","resolutionKilometers","from"]}},"swellModels":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"producer":{"type":"string"},"resolutionKilometers":{"type":"number"},"from":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["name","producer","resolutionKilometers","from"]}},"fetchedAt":{"type":"string","format":"date-time","x-native-type":"date"},"stale":{"type":"boolean"},"hours":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","format":"date-time","x-native-type":"date"},"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["time","waveHeightMeters","wavePeriodSeconds","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","cloudCoverPercent","precipitationMillimeters","airTemperatureCelsius"]}}},"required":["point","source","waveModels","swellModels","fetchedAt","stale","hours"]}}}}}}},"/friends/link":{"get":{"operationId":"friends.link","summary":"The link the caller gives to whoever it wants as a friend","description":"Takes a signed-in session. The link is made the first time it is asked for. An account made through it has the caller as its sponsor, and the two are friends. An account that exists already and opens it becomes a friend. The link of an account that has no username opens nothing until it has one: a friend is read by it. Decision 041.","tags":["Friends"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}}}},"security":[{"session":[]}]}},"/friends/link/renew":{"post":{"operationId":"friends.renewLink","summary":"Give the caller a new link","description":"Takes a signed-in session. The link before opens nothing from then on. The friends it made stay. Decision 041.","tags":["Friends"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}}}},"security":[{"session":[]}]}},"/friends/open":{"post":{"operationId":"friends.open","summary":"Whose link this is","description":"Takes neither a key nor a session: the link is what says whose it is, to whoever was given it. It answers the username and the rank of its owner, and nothing else. A link whose owner has no username opens nothing. To sign up through it, send it with the sign-up, as `invitation`: the new account then has the owner as its sponsor. Decision 041.","tags":["Friends"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":64}},"required":["token"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]}},"required":["username","rank"]}}}}},"security":[]}},"/friends":{"post":{"operationId":"friends.accept","summary":"Become the friend of the account whose link this is","description":"Takes a signed-in session of an account that has a username. The two accounts are friends from then on: each reads the other's username, rank and confirmed contributions, and nothing of its spots, its alerts or its lists. It makes no sponsor: only an account made through a link has one. The answer is 409 for the caller's own link, and 403 when the link's owner ended the friendship, which its link no longer makes, or when either has 200 friends. Decision 041.","tags":["Friends"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":64}},"required":["token"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]},"since":{"type":"string","format":"date-time","x-native-type":"date"},"sponsored":{"anyOf":[{"enum":["waiting","counted"],"type":"string"},{"type":"null"}]}},"required":["id","username","rank","since","sponsored"]}}}}},"security":[{"session":[]}]},"get":{"operationId":"friends.list","summary":"The caller's friends","description":"Takes a signed-in session. Each friend comes with its username and its rank, the latest first. `sponsored` says of an account made through the caller's link whether it counts for the caller yet. Decision 041.","tags":["Friends"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"friends":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]},"since":{"type":"string","format":"date-time","x-native-type":"date"},"sponsored":{"anyOf":[{"enum":["waiting","counted"],"type":"string"},{"type":"null"}]}},"required":["id","username","rank","since","sponsored"]}}},"required":["friends"]}}}}},"security":[{"session":[]}]}},"/friends/{id}":{"get":{"operationId":"friends.get","summary":"What a friend wrote in the guides","description":"Takes a signed-in session. The answer is 404 for an account that is not the caller's friend. It gives the friend's username, its rank, and its contributions that were confirmed, the latest first: what anyone reads in the guides under that username. A spot the friend asked to make public is not among them: a break names no account. Decision 041.","tags":["Friends"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]},"since":{"type":"string","format":"date-time","x-native-type":"date"},"sponsored":{"anyOf":[{"enum":["waiting","counted"],"type":"string"},{"type":"null"}]},"contributions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},{"type":"null"}]},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"confirmedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","break","line","value","language","confirmedAt"]}}},"required":["id","username","rank","since","sponsored","contributions"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"friends.remove","summary":"End a friendship","description":"Takes a signed-in session. Neither reads the other's contributions as a friend from then on. The other does not make the friendship again by the caller's link: the caller does, by opening the other's. Decision 041.","tags":["Friends"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ended":{"const":true}},"required":["ended"]}}}}},"security":[{"session":[]}]}},"/breaks/{breakId}/guide":{"get":{"operationId":"guides.get","summary":"What is written of a surf break, line by line","description":"The guide of a break of the catalogue: its lists of words, as `GET /breaks/{id}` gives them in `characteristics`, and four short texts, on the access, on where to enter the water, on the hazards and on the rules of the place. Each line says where its value comes from: the list the break was added from, or a contribution of an account, which an operator or the accounts that keep the break confirmed. A contribution names its author by a username and a rank. A text is given in the language asked for when someone wrote one, and in another otherwise. `proposed` holds what was written and not confirmed yet. `answers` says how the accounts that answered spread on three questions, once 3 of them did. Decision 041.","tags":["Guides"],"parameters":[{"name":"breakId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"A break's `id`, as a list or a search of breaks gives it."}},{"name":"language","in":"query","schema":{"enum":["en","fr","es","pt"],"type":"string","default":"en","description":"The language to read the texts in, when someone wrote one in it."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"breakId":{"type":"string"},"lines":{"type":"array","items":{"type":"object","properties":{"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},{"type":"null"}]},"origin":{"anyOf":[{"enum":["list","contribution"],"type":"string"},{"type":"null"}]},"contributionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"by":{"anyOf":[{"type":"object","properties":{"username":{"type":"string"},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]}},"required":["username","rank"]},{"type":"null"}]},"at":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"license":{"anyOf":[{"enum":["ODbL-1.0","DbCL-1.0"],"type":"string"},{"type":"null"}]},"proposed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"by":{"anyOf":[{"type":"object","properties":{"username":{"type":"string"},"rank":{"anyOf":[{"enum":["qs","cs","ct"],"type":"string"},{"type":"null"}]}},"required":["username","rank"]},{"type":"null"}]},"at":{"type":"string","format":"date-time","x-native-type":"date"},"confirmations":{"type":"number"}},"required":["id","value","language","by","at","confirmations"]}}},"required":["line","value","origin","contributionId","by","at","language","license","proposed"]}},"answers":{"type":"array","items":{"type":"object","properties":{"question":{"enum":["crowd","locals","level"],"type":"string"},"total":{"type":"number"},"counts":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},{"type":"null"}]}},"required":["question","total","counts"]}}},"required":["breakId","lines","answers"]}}}}}}},"/breaks/{breakId}/guide/mine":{"get":{"operationId":"guides.mine","summary":"What the caller wrote of a break, and what it may do there","description":"Takes a signed-in session. It gives the caller's contributions that wait, what it said of the contributions of others, its answers to the three questions, and whether it keeps the break: an account that holds a break in a list of its own, or has a spot of its own on it, may contest what is written there, and confirm it once one of its own contributions was confirmed. Decision 041.","tags":["Guides"],"parameters":[{"name":"breakId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"trusted":{"type":"boolean"},"keeps":{"type":"boolean"},"mayConfirm":{"type":"boolean"},"waiting":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"status":{"enum":["pending","shown"],"type":"string"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","line","value","language","status","createdAt"]}},"verdicts":{"type":"array","items":{"type":"object","properties":{"contributionId":{"type":"string"},"verdict":{"enum":["confirm","contest"],"type":"string"}},"required":["contributionId","verdict"]}},"answers":{"type":"object","propertyNames":{"enum":["crowd","locals","level"],"type":"string"},"additionalProperties":{"type":"string"}}},"required":["username","trusted","keeps","mayConfirm","waiting","verdicts","answers"]}}}}},"security":[{"session":[]}]}},"/breaks/{breakId}/guide/answers/{question}":{"put":{"operationId":"guides.answer","summary":"Answer one of the questions about a break, or take the answer back","description":"Takes a signed-in session. How many people surf a break, how they take a visitor and the level it asks are not one account's to state: each account gives its own answer, once, and changes it here. `answer` null takes it back. The guide shows how the answers spread once 3 accounts gave one, and never whose they are. An answer gives no points. Decision 041.","tags":["Guides"],"parameters":[{"name":"breakId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"question","in":"path","required":true,"schema":{"enum":["crowd","locals","level"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"answer":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]}},"required":["answer"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"spread":{"type":"object","properties":{"question":{"enum":["crowd","locals","level"],"type":"string"},"total":{"type":"number"},"counts":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},{"type":"null"}]}},"required":["question","total","counts"]},"answer":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["spread","answer"]}}}}},"security":[{"session":[]}]}},"/ideas":{"post":{"operationId":"ideas.send","summary":"Send whoever makes the product an idea, or a message","description":"Takes a visitor of the web app or an account, from the web app's site, and no key and no link: an idea is a person's, sent from the landing, and so is a message, sent from the contact page, which `about: message` says. It goes by mail to whoever makes the product, with the address given as where an answer goes, and nothing of it is kept. The instance sends 20 a day at most, ideas and messages together, within its mails for the day, whether or not it answers visitors. `sent: false` says why: `off`, the instance sends no mail; `full`, it has sent its ideas or its mails for the day, in UTC; `failed`, the provider did not take the mail. Decision 026.","tags":["Instance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"pattern":"^[^\\p{Cc}]+$"},"email":{"type":"string","maxLength":254},"idea":{"type":"string","minLength":1,"maxLength":4000},"locale":{"enum":["en","fr","es","pt"],"type":"string"},"about":{"enum":["idea","message"],"type":"string","default":"idea"}},"required":["name","email","idea","locale"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"sent":{"const":true}},"required":["sent"]},{"type":"object","properties":{"sent":{"const":false},"why":{"enum":["off","full","failed"],"type":"string"}},"required":["sent","why"]}]}}}}},"security":[]}},"/health":{"get":{"operationId":"instance.health","summary":"Whether the API and the worker run, and since when","description":"Answers anyone, and is not counted. It says when this API process started, and of the worker process that started last: when it started, when it had scheduled its queues, when it was last seen, and whether that was in the last two minutes. Each comes with `revision`, the commit its image was built from, null for a program that does not know it. A deployment took once a start is later than the moment it was asked for: `pnpm run deploy:api` and `pnpm run deploy:worker` wait for that. The answer is up to five seconds old. Decision 022.","tags":["Instance"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"at":{"type":"string","format":"date-time","x-native-type":"date"},"api":{"type":"object","properties":{"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"revision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["startedAt","revision"]},"worker":{"anyOf":[{"type":"object","properties":{"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"readyAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"seenAt":{"type":"string","format":"date-time","x-native-type":"date"},"running":{"type":"boolean"},"revision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["startedAt","readyAt","seenAt","running","revision"]},{"type":"null"}]}},"required":["at","api","worker"]}}}}},"security":[]}},"/instance/overview":{"get":{"operationId":"instance.overview","summary":"The instance at a glance: its accounts, its calls, its forecasts, its worker","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. A few numbers, for an operator who wants to know in a moment whether many people are here and whether the instance keeps up. The accounts active this week are those with a session that was used in the last seven days. The calls are those of the last twenty-four hours, by the kind of caller, as the counts of decision 020 keep them: approximate, written every thirty seconds. The forecasts are the requests sent to the provider today, UTC, against each share of the day: decision 023.","tags":["Instance"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"at":{"type":"string","format":"date-time","x-native-type":"date"},"accounts":{"type":"object","properties":{"total":{"type":"number"},"newThisWeek":{"type":"number"},"activeThisWeek":{"type":"number"},"suspended":{"type":"number"}},"required":["total","newThisWeek","activeThisWeek","suspended"]},"calls":{"type":"object","properties":{"total":{"type":"number"},"byVia":{"type":"array","items":{"type":"object","properties":{"via":{"enum":["key","session","link","visitor","none"],"type":"string"},"calls":{"type":"number"}},"required":["via","calls"]}}},"required":["total","byVia"]},"forecasts":{"type":"object","properties":{"people":{"type":"object","properties":{"calls":{"type":"number"},"limit":{"type":"number"}},"required":["calls","limit"]},"alerts":{"type":"object","properties":{"calls":{"type":"number"},"limit":{"type":"number"}},"required":["calls","limit"]},"cells":{"type":"number"}},"required":["people","alerts","cells"]},"visitors":{"type":"object","properties":{"open":{"type":"boolean"},"busy":{"type":"boolean"},"closedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["open","busy","closedAt"]},"worker":{"type":"object","properties":{"running":{"type":"boolean"},"late":{"type":"number"},"failed":{"type":"number"}},"required":["running","late","failed"]}},"required":["at","accounts","calls","forecasts","visitors","worker"]}}}}},"security":[{"session":[]}]}},"/instance":{"get":{"operationId":"instance.state","summary":"The state of the instance: its worker, its jobs, its providers, and this API","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The worker writes what it does and this reads it: decision 022. A job is `late` when no attempt of it started for longer than its schedule leaves between two runs. What failed is given as a kind, never as the error's text: `expired` for a run that took longer than a run may, `stopped` for one whose worker stopped under it. `api` is the process that answered this call, which may be one of several.","tags":["Instance"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"at":{"type":"string","format":"date-time","x-native-type":"date"},"api":{"type":"object","properties":{"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"revision":{"anyOf":[{"type":"string"},{"type":"null"}]},"webOrigin":{"type":"string"},"adminSites":{"type":"array","items":{"type":"string"}},"usageWrittenAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"usageLostCalls":{"type":"number"}},"required":["startedAt","revision","webOrigin","adminSites","usageWrittenAt","usageLostCalls"]},"workers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"readyAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"seenAt":{"type":"string","format":"date-time","x-native-type":"date"},"running":{"type":"boolean"},"revision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","startedAt","readyAt","seenAt","running","revision"]}},"jobs":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"schedule":{"type":"string"},"everySeconds":{"type":"number"},"state":{"enum":["waiting","running","succeeded","degraded","failed","expired","late"],"type":"string"},"startedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"finishedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"counts":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},{"type":"null"}]},"failure":{"anyOf":[{"type":"object","properties":{"kind":{"enum":["provider","format","database","expired","stopped","other"],"type":"string"},"status":{"type":"number"},"host":{"type":"string"}},"required":["kind"]},{"type":"null"}]},"lastSuccessAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"lastFailureAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"lastFailure":{"anyOf":[{"type":"object","properties":{"kind":{"enum":["provider","format","database","expired","stopped","other"],"type":"string"},"status":{"type":"number"},"host":{"type":"string"}},"required":["kind"]},{"type":"null"}]},"failuresInARow":{"type":"number"}},"required":["name","schedule","everySeconds","state","startedAt","finishedAt","counts","failure","lastSuccessAt","lastFailureAt","lastFailure","failuresInARow"]}},"providers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"stations":{"type":"number"},"recent":{"type":"number"},"latestReadingAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","stations","recent","latestReadingAt"]}},"database":{"type":"object","properties":{"sizeBytes":{"type":"number"}},"required":["sizeBytes"]},"visitors":{"type":"object","properties":{"closedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"busy":{"type":"boolean"},"closesAt":{"type":"number"}},"required":["closedAt","busy","closesAt"]},"errorReports":{"type":"object","properties":{"pausedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["pausedAt"]},"mail":{"type":"object","properties":{"via":{"anyOf":[{"enum":["unosend","smtp"],"type":"string"},{"type":"null"}]},"today":{"type":"number"},"dailyLimit":{"type":"number"}},"required":["via","today","dailyLimit"]},"forecasts":{"type":"object","properties":{"cells":{"type":"number"},"calls":{"type":"array","items":{"type":"object","properties":{"bucket":{"enum":["day:people","day:alerts","hour","minute"],"type":"string"},"calls":{"type":"number"},"limit":{"type":"number"}},"required":["bucket","calls","limit"]}}},"required":["cells","calls"]}},"required":["at","api","workers","jobs","providers","database","visitors","errorReports","mail","forecasts"]}}}}},"security":[{"session":[]}]}},"/keys":{"get":{"operationId":"keys.list","summary":"The API keys of the instance, or of one developer account, the newest first","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. A key cannot make, list or revoke keys. The keys are the instance's: every operator lists them all.","tags":["Keys"],"parameters":[{"name":"developerId","in":"query","schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"developerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","prefix","developerId","createdAt","lastUsedAt","revokedAt"]}}},"required":["keys"]}}}}},"security":[{"session":[]}]},"post":{"operationId":"keys.create","summary":"Make an API key for a developer account","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. A key cannot make, list or revoke keys. The answer holds the key, and nothing gives it again: the instance keeps only its hash. A program sends it as `Authorization: Bearer <key>`, and reads with it the data everyone shares, nothing of an account.","tags":["Keys"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"developerId":{"type":"string","format":"uuid"}},"required":["name","developerId"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"developerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"key":{"type":"string"}},"required":["id","name","prefix","developerId","createdAt","lastUsedAt","revokedAt","key"]}}}}},"security":[{"session":[]}]}},"/keys/{id}":{"delete":{"operationId":"keys.revoke","summary":"Revoke an API key","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. A key cannot make, list or revoke keys. A revoked key stops working at once, and never works again.","tags":["Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"developerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["id","name","prefix","developerId","createdAt","lastUsedAt","revokedAt"]}}}}},"security":[{"session":[]}]}},"/lists":{"get":{"operationId":"lists.list","summary":"The caller's lists of stations, surf breaks and spots, the favorites first","tags":["Lists"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"lists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}},"joined":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"size":{"type":"number"}},"required":["id","name","isDefault","size"]}}},"required":["lists","joined"]}}}}},"security":[{"session":[]}]},"post":{"operationId":"lists.create","summary":"Create a list","tags":["Lists"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60}},"required":["name"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}":{"patch":{"operationId":"lists.update","summary":"Rename a list the caller owns","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60}},"required":["name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"lists.delete","summary":"Delete a list the caller owns","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/stations/{stationId}":{"put":{"operationId":"lists.addStation","summary":"Add a station to one of the caller's lists","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"stationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"lists.removeStation","summary":"Remove a station from one of the caller's lists","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"stationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/breaks/{breakId}":{"put":{"operationId":"lists.addBreak","summary":"Add a surf break of the catalogue to one of the caller's lists","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"breakId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"lists.removeBreak","summary":"Remove a surf break from one of the caller's lists","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"breakId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/spots/{spotId}":{"put":{"operationId":"lists.addSpot","summary":"Add one of the caller's spots to one of their lists","description":"A list holds spots of its owner's alone. A spot that is someone else's is reported as missing, as it is everywhere.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"spotId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"lists.removeSpot","summary":"Remove a spot from one of the caller's lists","description":"The spot itself stays: it leaves the list, and is deleted by `DELETE /spots/{id}`.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}},{"name":"spotId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/share":{"put":{"operationId":"lists.share","summary":"Share one of the caller's lists by a link, or change its password","description":"Whoever has the link reads the list: its stations, its breaks, and the owner's spots in it, which no one else reads otherwise. They need no account. The first call makes the link, and a later one keeps it. `password`, when given, is asked of whoever opens the link from then on, and null asks none. Left out, it stays as it is. Decision 035.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"anyOf":[{"type":"string","minLength":4,"maxLength":72},{"type":"null"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"lists.unshare","summary":"Stop sharing a list","description":"Its link opens nothing from then on, and the accounts that kept the list no longer read it. Stopping what is not shared changes nothing.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/share/renew":{"post":{"operationId":"lists.renewShare","summary":"Give a shared list a new link, which ends the one before","description":"The link before opens nothing from then on. The password stays, and so do the accounts that kept the list: `DELETE /lists/{id}/share` is what ends it for all.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A list's id, or \"favorites\" for the caller's default list."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spotIds":{"type":"array","items":{"type":"string"}},"share":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"hasPassword":{"type":"boolean"},"members":{"type":"number"}},"required":["token","hasPassword","members"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","isDefault","stationIds","breakIds","spotIds","share","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/view":{"get":{"operationId":"lists.view","summary":"A list with its spots, for its owner or an account that kept it","description":"What `POST /shared/open` answers to whoever has the list's link, for an account that needs the link no more: the list's owner, and an account that kept it. A list that is neither's is reported as missing.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"access":{"enum":["owner","member","link"],"type":"string"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}},"required":["id","name","isDefault","access","stationIds","breakIds","spots"]}}}}},"security":[{"session":[]}]}},"/lists/{id}/membership":{"delete":{"operationId":"lists.leave","summary":"Let go of a list of someone else's that the caller kept","description":"Letting go of a list that was not kept changes nothing.","tags":["Lists"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/maps/wave-height":{"get":{"operationId":"maps.waveHeight","summary":"Where to get map tiles of the significant wave height, and how to read them","tags":["Maps"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tileUrlTemplate":{"type":"string"},"tileSize":{"const":256},"minZoom":{"type":"number"},"maxZoom":{"type":"number"},"encoding":{"type":"object","properties":{"type":{"const":"grayscale"},"minMeters":{"type":"number"},"maxMeters":{"type":"number"},"metersByLevel":{"type":"array","minItems":256,"maxItems":256,"items":{"type":"number"}}},"required":["type","minMeters","maxMeters","metersByLevel"]},"direction":{"anyOf":[{"type":"object","properties":{"tileUrlTemplate":{"type":"string"},"encoding":{"type":"object","properties":{"type":{"const":"grayscale"},"minDegrees":{"type":"number"},"maxDegrees":{"type":"number"},"degreesByLevel":{"type":"array","minItems":256,"maxItems":256,"items":{"type":"number"}}},"required":["type","minDegrees","maxDegrees","degreesByLevel"]}},"required":["tileUrlTemplate","encoding"]},{"type":"null"}]},"times":{"type":"object","properties":{"start":{"type":"string","format":"date-time","x-native-type":"date"},"end":{"type":"string","format":"date-time","x-native-type":"date"},"stepSeconds":{"type":"number"}},"required":["start","end","stepSeconds"]},"source":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"attribution":{"type":"string"},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]}},"required":["name","url","attribution","license"]}},"required":["tileUrlTemplate","tileSize","minZoom","maxZoom","encoding","direction","times","source"]}}}}}}},"/notifications":{"get":{"operationId":"notifications.list","summary":"What the caller's alerts told them, newest first","tags":["Notifications"],"parameters":[{"name":"unreadOnly","in":"query","schema":{"anyOf":[{"type":"boolean"},{"type":"string"}],"default":false},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"notifications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"alertId":{"anyOf":[{"type":"string"},{"type":"null"}]},"moment":{"enum":["found","moved","gone","evening","begins"],"type":"string"},"payload":{"type":"object","properties":{"alertName":{"anyOf":[{"type":"string"},{"type":"null"}]},"zone":{"type":"string"},"day":{"type":"string"},"lines":{"type":"array","items":{"type":"object","properties":{"spotId":{"type":"string"},"spotName":{"type":"string"},"forecastFetchedAt":{"type":"string"},"alertId":{"type":"string"},"alertName":{"type":"string"},"open":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]}},"before":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]}},"sea":{"type":"object","properties":{"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]}},"required":["waveHeightMeters","wavePeakPeriodSeconds","waveDirectionDegrees","windSpeedMetersPerSecond","windDirectionDegrees","tideHeightMeters","tideTrend"]},"buoy":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"attribution":{"type":"string"}},"required":["stationId","name","distanceKm","observedAt","significantHeightMeters","peakPeriodSeconds","peakDirectionDegrees"]},{"type":"null"}]}},"required":["spotId","spotName","open"]}}},"required":["alertName","zone","lines"]},"readAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","alertId","moment","payload","readAt","createdAt"]}}},"required":["notifications"]}}}}},"security":[{"session":[]}]}},"/notifications/{id}/read":{"post":{"operationId":"notifications.markRead","summary":"Mark one of the caller's notifications as read","tags":["Notifications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"readAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","readAt"]}}}}},"security":[{"session":[]}]}},"/places":{"get":{"operationId":"places.search","summary":"Places by their name, to find a point of the map","description":"Towns, their parts, and what OpenStreetMap names on the ground, a beach or a headland, whose name matches. Streets and houses are left out. Given together, `latitude` and `longitude` bring forward the places near that point, and `zoom` says how wide near is: the zoom of the map the search is made from. The instance asks a search service for them and keeps nothing of a search. An account may search so many times a minute: beyond, the answer is 429. It is 503 when the service fails and while it is then left alone. Both say in `Retry-After` when to ask again.","tags":["Places"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120},"allowEmptyValue":true,"allowReserved":true},{"name":"latitude","in":"query","required":false,"schema":{"type":"number","minimum":-90,"maximum":90},"allowEmptyValue":true,"allowReserved":true},{"name":"longitude","in":"query","required":false,"schema":{"type":"number","minimum":-180,"maximum":180},"allowEmptyValue":true,"allowReserved":true},{"name":"zoom","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":22},"allowEmptyValue":true,"allowReserved":true},{"name":"locale","in":"query","required":false,"schema":{"enum":["en","fr","es","pt"],"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10,"default":5},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"places":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"location":{"type":"array","items":{"type":"string"}},"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["name","location","latitude","longitude"]}},"source":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"attribution":{"type":"string"},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]}},"required":["name","url","attribution","license"]}},"required":["places","source"]}}}}},"security":[{"session":[]}]}},"/publications":{"get":{"operationId":"publications.list","summary":"The spots their owners asked to make public","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The requests that wait come the oldest first, the answered ones the latest first. Each comes with the spot as it is now, the breaks of the catalogue within 500 meters of it, and how many other accounts keep a spot of their own within 150 meters. Decision 034.","tags":["Publications"],"parameters":[{"name":"status","in":"query","schema":{"enum":["pending","accepted","refused"],"type":"string","default":"pending"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"publications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"accountId":{"type":"string"},"spot":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","updatedAt"]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"nearbyBreaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"meters":{"type":"number"}},"required":["id","name","meters"]}},"otherAccountsHere":{"type":"number"}},"required":["id","status","note","reason","requestedAt","decidedAt","accountId","spot","breakId","nearbyBreaks","otherAccountsHere"]}}},"required":["publications"]}}}}},"security":[{"session":[]}]}},"/publications/{id}/accept":{"post":{"operationId":"publications.accept","summary":"Make a break of the catalogue of a spot","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The break takes the spot's name, its point and what its owner says it is like, under the Open Database License, and names no account. The spot stays its owner's, and what they change in it afterwards does not change the break. `spotUpdatedAt` is the spot's as it was read: a spot that changed since is not published, and the answer is 409. Decision 034.","tags":["Publications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spotUpdatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["spotUpdatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"accountId":{"type":"string"},"spot":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","updatedAt"]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"nearbyBreaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"meters":{"type":"number"}},"required":["id","name","meters"]}},"otherAccountsHere":{"type":"number"}},"required":["id","status","note","reason","requestedAt","decidedAt","accountId","spot","breakId","nearbyBreaks","otherAccountsHere"]}}}}},"security":[{"session":[]}]}},"/publications/{id}/refuse":{"post":{"operationId":"publications.refuse","summary":"Refuse to make a spot public, and say why","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The spot stays its owner's alone, and its owner reads the reason. They may ask again. Decision 034.","tags":["Publications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":280}},"required":["reason"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"accountId":{"type":"string"},"spot":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","name","latitude","longitude","characteristics","updatedAt"]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"nearbyBreaks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"meters":{"type":"number"}},"required":["id","name","meters"]}},"otherAccountsHere":{"type":"number"}},"required":["id","status","note","reason","requestedAt","decidedAt","accountId","spot","breakId","nearbyBreaks","otherAccountsHere"]}}}}},"security":[{"session":[]}]}},"/push/key":{"get":{"operationId":"push.key","summary":"Whether the instance sends push, and the key a browser subscribes with","description":"`publicKey` is what a browser gives its push service as `applicationServerKey`. It is null on an instance that sends no push.","tags":["Push"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"publicKey":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["publicKey"]}}}}},"security":[{"session":[]}]}},"/push/devices":{"get":{"operationId":"push.devices","summary":"The browsers the caller's alerts are pushed to","description":"An account that has one is told by push, and one that has none is not. The address of a device's subscription is never given back.","tags":["Push"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"devices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"seenAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","label","createdAt","seenAt"]}}},"required":["devices"]}}}}},"security":[{"session":[]}]},"post":{"operationId":"push.subscribe","summary":"Push the caller's alerts to this browser","description":"Takes what the browser's `PushSubscription` holds. A browser has one subscription, and it goes with whoever is signed in there: an address that another account kept becomes the caller's, as a new device. A device goes with the session it was made in: signing out there forgets it. An account keeps 10 devices at most: one more is refused with 403, whose `data` gives that `limit`. An address that is not a browser's push service is refused with 400, and the answer is 503 on an instance that sends no push.","tags":["Push"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"string","maxLength":2048,"description":"Where the browser's push service takes a message for it: `PushSubscription.endpoint`."},"keys":{"type":"object","properties":{"p256dh":{"type":"string","pattern":"^B[A-Za-z0-9_-]{85}[AEIMQUYcgkosw048]$","description":"The browser's public key: the `p256dh` of `PushSubscription.toJSON().keys`."},"auth":{"type":"string","pattern":"^[A-Za-z0-9_-]{21}[AQgw]$","description":"The browser's secret: the `auth` of `PushSubscription.toJSON().keys`."}},"required":["p256dh","auth"]},"label":{"type":"string","minLength":1,"maxLength":80,"description":"What the browser calls itself, for the account to tell its devices apart."},"account":{"type":"string","maxLength":200,"description":"The account the page acts for, by its id. A caller that is another account is refused with 409: the session changed under the page that asks."}},"required":["endpoint","keys"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"seenAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","label","createdAt","seenAt"]}}}}},"security":[{"session":[]}]}},"/push/devices/renew":{"post":{"operationId":"push.renew","summary":"Say again what this browser holds, for the device it is","description":"What a browser does when its app loads: a push service changes an address now and then, and the device then keeps the new one. The browser names its device by the `id` it was given. Without an id, or with one the caller has no device for, it is the device of the caller's that has this address. The answer is 404 when the caller has neither, because the device was removed from another one or because the browser is another account's now: the browser then forgets its subscription. It never makes a device.","tags":["Push"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The id of a device, as the API gave it."},"endpoint":{"type":"string","maxLength":2048,"description":"Where the browser's push service takes a message for it: `PushSubscription.endpoint`."},"keys":{"type":"object","properties":{"p256dh":{"type":"string","pattern":"^B[A-Za-z0-9_-]{85}[AEIMQUYcgkosw048]$","description":"The browser's public key: the `p256dh` of `PushSubscription.toJSON().keys`."},"auth":{"type":"string","pattern":"^[A-Za-z0-9_-]{21}[AQgw]$","description":"The browser's secret: the `auth` of `PushSubscription.toJSON().keys`."}},"required":["p256dh","auth"]},"label":{"type":"string","minLength":1,"maxLength":80,"description":"What the browser calls itself, for the account to tell its devices apart."},"account":{"type":"string","maxLength":200,"description":"The account the page acts for, by its id. A caller that is another account is refused with 409: the session changed under the page that asks."}},"required":["endpoint","keys"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"seenAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","label","createdAt","seenAt"]}}}}},"security":[{"session":[]}]}},"/push/devices/forget":{"post":{"operationId":"push.forget","summary":"Stop pushing the caller's alerts to this browser","description":"Takes the address of the browser's subscription, in the body. What switching push off on a device does, and signing out. `forgotten` is false when the caller kept no such address: nothing is said of another account's.","tags":["Push"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"string","maxLength":2048},"account":{"type":"string","maxLength":200,"description":"The account the page acts for, by its id. A caller that is another account is refused with 409: the session changed under the page that asks."}},"required":["endpoint"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"forgotten":{"type":"boolean"}},"required":["forgotten"]}}}}},"security":[{"session":[]}]}},"/push/devices/{id}":{"delete":{"operationId":"push.remove","summary":"Remove one of the caller's devices","description":"From any of them: a browser that was removed forgets its subscription when its app next loads.","tags":["Push"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The id of a device, as the API gave it."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"account":{"type":"string","maxLength":200,"description":"The account the page acts for, by its id. A caller that is another account is refused with 409: the session changed under the page that asks."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/reviews":{"get":{"operationId":"reviews.list","summary":"The contributions to the guides, as an operator reads them","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. `queue` is `pending` for those that wait to be read, `contested` for those that show and that an account which keeps the break contested, `shown` for those that show and that nobody confirmed yet, `confirmed` or `refused` for what was answered. The first three come the oldest first, the last two the latest first. Each comes with its break, what its line says now, its author and the contests that wait. Decision 041.","tags":["Reviews"],"parameters":[{"name":"queue","in":"query","schema":{"enum":["pending","contested","shown","confirmed","refused"],"type":"string","default":"pending"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"reviews":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"license":{"enum":["ODbL-1.0","DbCL-1.0"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["id","name","latitude","longitude","location"]},{"type":"null"}]},"current":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},{"type":"null"}]},"author":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmed":{"type":"number"}},"required":["id","username","confirmed"]},{"type":"null"}]},"confirmations":{"type":"number"},"contests":{"type":"array","items":{"type":"object","properties":{"accountId":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["accountId","username","reason","at"]}}},"required":["id","status","line","value","language","license","reason","createdAt","decidedAt","break","current","author","confirmations","contests"]}},"total":{"type":"number"}},"required":["reviews","total"]}}}}},"security":[{"session":[]}]}},"/reviews/{id}/accept":{"post":{"operationId":"reviews.accept","summary":"Confirm a contribution: it becomes what its line says","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. It is said of a contribution that waits to be read, or that shows and that nobody confirmed yet. The guide then says it, under its author's username, and it counts for its author. A contribution to a break that left the catalogue is not confirmed: the answer is 409. Decision 041.","tags":["Reviews"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"license":{"enum":["ODbL-1.0","DbCL-1.0"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["id","name","latitude","longitude","location"]},{"type":"null"}]},"current":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},{"type":"null"}]},"author":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmed":{"type":"number"}},"required":["id","username","confirmed"]},{"type":"null"}]},"confirmations":{"type":"number"},"contests":{"type":"array","items":{"type":"object","properties":{"accountId":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["accountId","username","reason","at"]}}},"required":["id","status","line","value","language","license","reason","createdAt","decidedAt","break","current","author","confirmations","contests"]}}}}},"security":[{"session":[]}]}},"/reviews/{id}/refuse":{"post":{"operationId":"reviews.refuse","summary":"Refuse a contribution, and say why","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Its author reads the reason. It is said of a contribution that waits, that shows, or that was confirmed: a line that said it then says what it said before, and the contribution no longer counts for its author, who keeps the rank it reached. Decision 041.","tags":["Reviews"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":280}},"required":["reason"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"license":{"enum":["ODbL-1.0","DbCL-1.0"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["id","name","latitude","longitude","location"]},{"type":"null"}]},"current":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},{"type":"null"}]},"author":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmed":{"type":"number"}},"required":["id","username","confirmed"]},{"type":"null"}]},"confirmations":{"type":"number"},"contests":{"type":"array","items":{"type":"object","properties":{"accountId":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["accountId","username","reason","at"]}}},"required":["id","status","line","value","language","license","reason","createdAt","decidedAt","break","current","author","confirmations","contests"]}}}}},"security":[{"session":[]}]}},"/reviews/{id}/keep":{"post":{"operationId":"reviews.keep","summary":"Keep a contribution that was contested","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The contests that the operator read are closed: `through` is the moment of the latest of them, and one that came since still waits. A contribution that showed as waiting to be confirmed is confirmed by it: an operator read it. The answer is 409 when no contest waits. Decision 041.","tags":["Reviews"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"through":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["through"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["pending","shown","confirmed","refused","withdrawn","superseded"],"type":"string"},"line":{"enum":["breakTypes","waveDirections","bottomTypes","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","access","entry","hazards","rules"],"type":"string"},"value":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"language":{"anyOf":[{"enum":["en","fr","es","pt"],"type":"string"},{"type":"null"}]},"license":{"enum":["ODbL-1.0","DbCL-1.0"],"type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"break":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"location":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["id","name","latitude","longitude","location"]},{"type":"null"}]},"current":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},{"type":"null"}]},"author":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmed":{"type":"number"}},"required":["id","username","confirmed"]},{"type":"null"}]},"confirmations":{"type":"number"},"contests":{"type":"array","items":{"type":"object","properties":{"accountId":{"type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["accountId","username","reason","at"]}}},"required":["id","status","line","value","language","license","reason","createdAt","decidedAt","break","current","author","confirmations","contests"]}}}}},"security":[{"session":[]}]}},"/sessions":{"post":{"operationId":"sessions.create","summary":"Write a session in the caller's log","description":"A session is at a break of the catalogue or at a spot of the caller's own: one of `breakId` and `spotId`. It takes the place's name and its point, and keeps them as its own. It may be written long after it was surfed. What the sea did while it lasted is read then and kept with it: what the models last computed of its hours, the tide, and what the nearest buoy and wind station measured. `waveSize` and `setSize` say how big most of the waves and the sets looked, against a surfer standing beside them: the sets are never smaller than the waves. The models answer for the last 90 days: a session further back keeps the tide and the stations alone. A part that could not be had is null, and the session is written all the same.","tags":["Sessions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"breakId":{"type":"string"},"spotId":{"type":"string"},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":15,"maximum":720,"default":90},"rating":{"type":"number","minimum":0.5,"maximum":5,"multipleOf":0.5},"note":{"type":"string","maxLength":2000},"waveSize":{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},"setSize":{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"}},"required":["startedAt"]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spotId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","latitude","longitude","breakId","spotId"]},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rating":{"anyOf":[{"type":"number"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"waveSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"setSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"figures":{"type":"object","properties":{"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"shoreWind":{"anyOf":[{"enum":["offshore","cross_offshore","cross_shore","cross_onshore","onshore"],"type":"string"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]},"tideLevel":{"anyOf":[{"type":"number"},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"periodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","significantHeightMeters","periodSeconds","directionDegrees","waterTemperatureCelsius"]},{"type":"null"}]},"measuredWind":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"speedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"gustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","speedMetersPerSecond","gustMetersPerSecond","directionDegrees"]},{"type":"null"}]}},"required":["waveHeightMeters","wavePeakPeriodSeconds","wavePeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","shoreWind","airTemperatureCelsius","cloudCoverPercent","precipitationMillimeters","tideHeightMeters","tideTrend","tideLevel","buoy","measuredWind"]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"conditionsTakenAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"conditions":{"anyOf":[{"type":"object","properties":{"model":{"anyOf":[{"type":"object","properties":{"point":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]},"waveModels":{"type":"array","items":{"type":"string"}},"swellModels":{"type":"array","items":{"type":"string"}},"hours":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["time","waveHeightMeters","wavePeriodSeconds","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","cloudCoverPercent","precipitationMillimeters","airTemperatureCelsius"]}}},"required":["point","waveModels","swellModels","hours"]},{"type":"null"}]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"tide":{"anyOf":[{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"}},"required":["id","name","distanceKm"]},"datum":{"type":"string"},"heights":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"heightMeters":{"type":"number"}},"required":["time","heightMeters"]}},"extremes":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"type":{"enum":["high","low"],"type":"string"},"heightMeters":{"type":"number"}},"required":["time","type","heightMeters"]}}},"required":["station","datum","heights","extremes"]},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"wind":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["model","modelMissing","tide","buoy","wind","offshoreDirectionDegrees"]},{"type":"null"}]}},"required":["id","place","startedAt","durationMinutes","rating","note","waveSize","setSize","figures","modelMissing","conditionsTakenAt","createdAt","updatedAt","conditions"]}}}}},"security":[{"session":[]}]},"get":{"operationId":"sessions.list","summary":"The caller's sessions, the latest first","description":"All of them, or those at one place: `breakId` or `spotId`. Each comes with its figures, and without the conditions they were read from, which `GET /sessions/{id}` gives. Pages follow one another through `before`.","tags":["Sessions"],"parameters":[{"name":"breakId","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"spotId","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"before","in":"query","schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"sessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spotId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","latitude","longitude","breakId","spotId"]},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rating":{"anyOf":[{"type":"number"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"waveSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"setSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"figures":{"type":"object","properties":{"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"shoreWind":{"anyOf":[{"enum":["offshore","cross_offshore","cross_shore","cross_onshore","onshore"],"type":"string"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]},"tideLevel":{"anyOf":[{"type":"number"},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"periodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","significantHeightMeters","periodSeconds","directionDegrees","waterTemperatureCelsius"]},{"type":"null"}]},"measuredWind":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"speedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"gustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","speedMetersPerSecond","gustMetersPerSecond","directionDegrees"]},{"type":"null"}]}},"required":["waveHeightMeters","wavePeakPeriodSeconds","wavePeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","shoreWind","airTemperatureCelsius","cloudCoverPercent","precipitationMillimeters","tideHeightMeters","tideTrend","tideLevel","buoy","measuredWind"]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"conditionsTakenAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","place","startedAt","durationMinutes","rating","note","waveSize","setSize","figures","modelMissing","conditionsTakenAt","createdAt","updatedAt"]}},"next":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["sessions","next"]}}}}},"security":[{"session":[]}]}},"/sessions/recap":{"get":{"operationId":"sessions.recap","summary":"What the caller's log comes to","description":"How many sessions and how long in the water, in all, this year and this month, and the places surfed most, each with how the caller rated its sessions there. `zone` is the time zone the year and the month are counted in, UTC when left out.","tags":["Sessions"],"parameters":[{"name":"zone","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9_+\\-/]{1,64}$"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count","minutes"]},"year":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count","minutes"]},"month":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count","minutes"]},"placeCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"places":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spotId":{"anyOf":[{"type":"string"},{"type":"null"}]},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"averageRating":{"anyOf":[{"type":"number"},{"type":"null"}]},"lastAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["name","breakId","spotId","count","minutes","averageRating","lastAt"]}}},"required":["total","year","month","placeCount","places"]}}}}},"security":[{"session":[]}]}},"/sessions/{id}":{"get":{"operationId":"sessions.get","summary":"One session, with the conditions kept with it","tags":["Sessions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spotId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","latitude","longitude","breakId","spotId"]},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rating":{"anyOf":[{"type":"number"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"waveSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"setSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"figures":{"type":"object","properties":{"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"shoreWind":{"anyOf":[{"enum":["offshore","cross_offshore","cross_shore","cross_onshore","onshore"],"type":"string"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]},"tideLevel":{"anyOf":[{"type":"number"},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"periodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","significantHeightMeters","periodSeconds","directionDegrees","waterTemperatureCelsius"]},{"type":"null"}]},"measuredWind":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"speedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"gustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","speedMetersPerSecond","gustMetersPerSecond","directionDegrees"]},{"type":"null"}]}},"required":["waveHeightMeters","wavePeakPeriodSeconds","wavePeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","shoreWind","airTemperatureCelsius","cloudCoverPercent","precipitationMillimeters","tideHeightMeters","tideTrend","tideLevel","buoy","measuredWind"]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"conditionsTakenAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"conditions":{"anyOf":[{"type":"object","properties":{"model":{"anyOf":[{"type":"object","properties":{"point":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]},"waveModels":{"type":"array","items":{"type":"string"}},"swellModels":{"type":"array","items":{"type":"string"}},"hours":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["time","waveHeightMeters","wavePeriodSeconds","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","cloudCoverPercent","precipitationMillimeters","airTemperatureCelsius"]}}},"required":["point","waveModels","swellModels","hours"]},{"type":"null"}]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"tide":{"anyOf":[{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"}},"required":["id","name","distanceKm"]},"datum":{"type":"string"},"heights":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"heightMeters":{"type":"number"}},"required":["time","heightMeters"]}},"extremes":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"type":{"enum":["high","low"],"type":"string"},"heightMeters":{"type":"number"}},"required":["time","type","heightMeters"]}}},"required":["station","datum","heights","extremes"]},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"wind":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["model","modelMissing","tide","buoy","wind","offshoreDirectionDegrees"]},{"type":"null"}]}},"required":["id","place","startedAt","durationMinutes","rating","note","waveSize","setSize","figures","modelMissing","conditionsTakenAt","createdAt","updatedAt","conditions"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"sessions.update","summary":"Change a session: when it was, how long, its rating, its note, its sizes","description":"What is left out stays, and `rating`, `note`, `waveSize` or `setSize` given as null is taken away. The sets are never smaller than the waves, as the session stands once it is changed. The conditions are read again when the session moves in time, and when the models could not be asked the time before: a request that changes nothing asks them once more.","tags":["Sessions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":15,"maximum":720},"rating":{"anyOf":[{"type":"number","minimum":0.5,"maximum":5,"multipleOf":0.5},{"type":"null"}]},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"waveSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"setSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spotId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","latitude","longitude","breakId","spotId"]},"startedAt":{"type":"string","format":"date-time","x-native-type":"date"},"durationMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"rating":{"anyOf":[{"type":"number"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"waveSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"setSize":{"anyOf":[{"enum":["ankle","knee","waist","chest","shoulder","head","overhead","double_overhead","triple_overhead"],"type":"string"},{"type":"null"}]},"figures":{"type":"object","properties":{"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"shoreWind":{"anyOf":[{"enum":["offshore","cross_offshore","cross_shore","cross_onshore","onshore"],"type":"string"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"tideTrend":{"anyOf":[{"enum":["rising","falling"],"type":"string"},{"type":"null"}]},"tideLevel":{"anyOf":[{"type":"number"},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"periodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","significantHeightMeters","periodSeconds","directionDegrees","waterTemperatureCelsius"]},{"type":"null"}]},"measuredWind":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"distanceKm":{"type":"number"},"speedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"gustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["name","distanceKm","speedMetersPerSecond","gustMetersPerSecond","directionDegrees"]},{"type":"null"}]}},"required":["waveHeightMeters","wavePeakPeriodSeconds","wavePeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","shoreWind","airTemperatureCelsius","cloudCoverPercent","precipitationMillimeters","tideHeightMeters","tideTrend","tideLevel","buoy","measuredWind"]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"conditionsTakenAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"},"conditions":{"anyOf":[{"type":"object","properties":{"model":{"anyOf":[{"type":"object","properties":{"point":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]},"waveModels":{"type":"array","items":{"type":"string"}},"swellModels":{"type":"array","items":{"type":"string"}},"hours":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"waveHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"wavePeakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"primarySwellDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"cloudCoverPercent":{"anyOf":[{"type":"number"},{"type":"null"}]},"precipitationMillimeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"airTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["time","waveHeightMeters","wavePeriodSeconds","wavePeakPeriodSeconds","waveDirectionDegrees","primarySwellHeightMeters","primarySwellDirectionDegrees","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","cloudCoverPercent","precipitationMillimeters","airTemperatureCelsius"]}}},"required":["point","waveModels","swellModels","hours"]},{"type":"null"}]},"modelMissing":{"anyOf":[{"enum":["no_sea","too_old","unavailable"],"type":"string"},{"type":"null"}]},"tide":{"anyOf":[{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"}},"required":["id","name","distanceKm"]},"datum":{"type":"string"},"heights":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"heightMeters":{"type":"number"}},"required":["time","heightMeters"]}},"extremes":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"type":{"enum":["high","low"],"type":"string"},"heightMeters":{"type":"number"}},"required":["time","type","heightMeters"]}}},"required":["station","datum","heights","extremes"]},{"type":"null"}]},"buoy":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"wind":{"anyOf":[{"type":"object","properties":{"stationId":{"type":"string"},"name":{"type":"string"},"distanceKm":{"type":"number"},"attribution":{"type":"string"},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","peakDirectionDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees"]}}},"required":["stationId","name","distanceKm","attribution","readings"]},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["model","modelMissing","tide","buoy","wind","offshoreDirectionDegrees"]},{"type":"null"}]}},"required":["id","place","startedAt","durationMinutes","rating","note","waveSize","setSize","figures","modelMissing","conditionsTakenAt","createdAt","updatedAt","conditions"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"sessions.delete","summary":"Delete a session","tags":["Sessions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/shared/open":{"post":{"operationId":"shared.open","summary":"The list a link opens","description":"Takes neither a key nor a session: the link is what opens the list. A link that asks for a password answers `locked` until it is given one, and 403 for a wrong one. Ten wrong ones in a quarter of an hour close it for the rest of it. With the list comes `pass`, for a list with a password, which this route takes in its place from then on: a reader sends `Authorization: List <token>.<pass>`, or `List <token>` without one, to read the stations, the breaks, the forecasts and the tides as an account does. The list's owner and an account that kept it are known by their session, and are asked no password. `owner` is the username of whoever shares the list, null for an account that chose none, and is answered with `locked` too. Decision 035.","tags":["Lists"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","maxLength":64},"password":{"type":"string","maxLength":72},"pass":{"type":"string","maxLength":64}},"required":["token"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"locked":{"const":true},"owner":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["locked","owner"]},{"type":"object","properties":{"locked":{"const":false},"pass":{"anyOf":[{"type":"string"},{"type":"null"}]},"owner":{"anyOf":[{"type":"string"},{"type":"null"}]},"list":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"access":{"enum":["owner","member","link"],"type":"string"},"stationIds":{"type":"array","items":{"type":"string"}},"breakIds":{"type":"array","items":{"type":"string"}},"spots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}},"required":["id","name","isDefault","access","stationIds","breakIds","spots"]}},"required":["locked","pass","owner","list"]}]}}}}},"security":[]}},"/shared/join":{"post":{"operationId":"shared.join","summary":"Keep the list a link opens among the caller's lists","description":"The caller then reads the list without its link, at `GET /lists/{id}/view`, until its owner stops sharing it. The password is asked as it is when the link is opened, and `pass` stands for it as it does there. Keeping one's own list, or a list kept already, changes nothing. An account keeps at most 50 lists of others, and a list is kept by at most 100 accounts.","tags":["Lists"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","maxLength":64},"password":{"type":"string","maxLength":72},"pass":{"type":"string","maxLength":64}},"required":["token"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/spots":{"post":{"operationId":"spots.create","summary":"Save a spot: a place of the caller's own, with a name","description":"The spot starts from a break of the catalogue, or from a point of the caller's own. From a break it takes the name and the point, unless the request gives others. It then keeps them as its own: a later change to the break does not move the spot. It takes nothing of what the catalogue says the break is like: `characteristics` are what the owner says, and null until they do.","tags":["Spots"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"breakId":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"anyOf":[{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},{"type":"null"}],"default":null}},"required":["breakId"]},{"type":"object","properties":{"breakId":{"type":"null"},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"anyOf":[{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},{"type":"null"}],"default":null}},"required":["name","latitude","longitude"]}]}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"get":{"operationId":"spots.list","summary":"The caller's spots","tags":["Spots"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"spots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}},"required":["spots"]}}}}},"security":[{"session":[]}]}},"/spots/{id}":{"get":{"operationId":"spots.get","summary":"One of the caller's spots","description":"A spot is its owner's alone. What is public of it is the break of the catalogue that an operator made of it, at `GET /breaks/{id}`.","tags":["Spots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"patch":{"operationId":"spots.update","summary":"Change a spot the caller owns","description":"What is left out stays as it is. `characteristics`, when given, replaces all that was said of the spot, and null clears it.","tags":["Spots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"anyOf":[{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","maxItems":26,"items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","maxItems":4,"items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","maxItems":14,"items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","maxItems":24,"items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","maxItems":8,"items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","maxItems":10,"items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","maxItems":32,"items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"integer","minimum":0,"maximum":359},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]},"max":{"anyOf":[{"type":"number","minimum":0,"maximum":30},{"type":"null"}]}}},{"type":"null"}]}}},{"type":"null"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"spots.delete","summary":"Delete a spot the caller owns","description":"The spot leaves its alerts. An alert whose last spot is deleted is deleted with it.","tags":["Spots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"security":[{"session":[]}]}},"/spots/{id}/publication":{"put":{"operationId":"spots.requestPublication","summary":"Ask that one of the caller's spots be made public","description":"The spot stays its owner's alone until an operator of the instance accepts: it then becomes a break of the catalogue, with its name, its point and what its owner says it is like, under the Open Database License. The spot's answer says what became of the request, in `publication`. Asking again while a request waits changes its note. An account has at most 10 spots waiting for an answer.","tags":["Spots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string","maxLength":280}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]},"delete":{"operationId":"spots.cancelPublication","summary":"Take back a request to make a spot public, while it waits","description":"A request that was answered stays as it is: a spot that became a break of the catalogue is not taken out of it this way. Taking back a request that does not wait changes nothing.","tags":["Spots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":80},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"characteristics":{"type":"object","properties":{"breakTypes":{"anyOf":[{"type":"array","items":{"enum":["beach","reef","point","jetty","pier","offshore","slab","canyon","peak","rivermouth","man_made","tidal_bore","standing_wave"],"type":"string"}},{"type":"null"}]},"waveDirections":{"anyOf":[{"type":"array","items":{"enum":["left","right"],"type":"string"}},{"type":"null"}]},"bottomTypes":{"anyOf":[{"type":"array","items":{"enum":["sand","rock","coral","lava","uneven_reef","boulders","rock_shelf"],"type":"string"}},{"type":"null"}]},"abilityLevels":{"anyOf":[{"type":"array","items":{"enum":["beginner","intermediate","advanced","pro"],"type":"string"}},{"type":"null"}]},"boardTypes":{"anyOf":[{"type":"array","items":{"enum":["shortboard","fish","funboard","longboard","gun","bodyboard","bodysurf","skimboard","sup","foil","kite","tow"],"type":"string"}},{"type":"null"}]},"bestSeasons":{"anyOf":[{"type":"array","items":{"enum":["spring","summer","autumn","winter"],"type":"string"}},{"type":"null"}]},"bestTides":{"anyOf":[{"type":"array","items":{"enum":["low","mid_low","mid","mid_high","high"],"type":"string"}},{"type":"null"}]},"bestSwellDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"bestWindDirections":{"anyOf":[{"type":"array","items":{"enum":["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"],"type":"string"}},{"type":"null"}]},"offshoreDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waveSizeMeters":{"anyOf":[{"type":"object","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["min","max"]},{"type":"null"}]}},"required":["breakTypes","waveDirections","bottomTypes","abilityLevels","boardTypes","bestSeasons","bestTides","bestSwellDirections","bestWindDirections","offshoreDirectionDegrees","waveSizeMeters"]},"publication":{"anyOf":[{"type":"object","properties":{"status":{"enum":["pending","accepted","refused"],"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"breakId":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestedAt":{"type":"string","format":"date-time","x-native-type":"date"},"decidedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]}},"required":["status","note","reason","breakId","requestedAt","decidedAt"]},{"type":"null"}]},"alertIds":{"type":"array","items":{"type":"string"}},"isOwner":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","x-native-type":"date"},"updatedAt":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["id","breakId","name","latitude","longitude","characteristics","publication","alertIds","isOwner","createdAt","updatedAt"]}}}}},"security":[{"session":[]}]}},"/stations":{"get":{"operationId":"stations.list","summary":"Buoys with their latest reading","tags":["Stations"],"parameters":[{"name":"bbox","in":"query","schema":{"type":"string","description":"An area as \"west,south,east,north\" in decimal degrees, the longitudes first: \"-5.2,47.6,-4.0,48.5\". West is greater than east for a box across the antimeridian."},"allowEmptyValue":true,"allowReserved":true},{"name":"provider","in":"query","schema":{"type":"string","description":"Only the stations of one network, as a station's `provider` names it."},"allowEmptyValue":true,"allowReserved":true},{"name":"measures","in":"query","schema":{"enum":["waves","wind"],"type":"string","description":"Only the stations that report this."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"allowEmptyValue":true,"allowReserved":true},{"name":"places","in":"query","schema":{"enum":["all","one"],"type":"string","default":"all","description":"With `measures=wind`, \"one\" keeps one station for each place: of the stations within 2 km of each other, the one that measured in the last two hours, then the one that gives gusts, then the one that measures most often. When that leaves more than `limit`, the stations are kept further apart, 4 km, then 8, until they fit, so that they spread over the whole box. For a map."},"allowEmptyValue":true,"allowReserved":true},{"name":"prefer","in":"query","schema":{"enum":["sea"],"type":"string","description":"With `places=one`, \"sea\" puts the stations at sea or within 10 km of the shore before the others once they are kept further apart than 2 km, after those that measured in the last two hours. A wide map then shows the wind of the coast, and an inland area its own station where none by the sea stands near."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"stations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"attribution":{"type":"string"},"measures":{"type":"array","items":{"enum":["waves","wind"],"type":"string"}},"exposure":{"anyOf":[{"enum":["open","sheltered"],"type":"string"},{"type":"null"}],"description":"How the station's waves compare with those of the stations within 60 km on rough days. \"open\": it has had at least half their height on two days. \"sheltered\": it stayed under a fifth of it on every rough day, as a site in a harbour or an estuary does. Null when the days seen so far establish neither."},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["type","url","commercialUse"]},"latestReading":{"anyOf":[{"type":"object","properties":{"observedAt":{"type":"string","format":"date-time","x-native-type":"date"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"significantPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionalSpreadDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"validated":{"type":"boolean"}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","significantPeriodSeconds","peakDirectionDegrees","directionalSpreadDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","validated"]},{"type":"null"}]}},"required":["id","provider","name","latitude","longitude","attribution","measures","exposure","license","latestReading"]}},"apartKm":{"type":"number","description":"With `places=one`, the distance under which one station was kept: 2, or more when the box held more places than `limit` and some were left out."},"truncated":{"type":"boolean","description":"With `places=one`, true when the box held more than 20,000 wind stations: the first 20,000 by id were weighed, and the others left out. Narrow the box."}},"required":["stations"]}}}}}}},"/stations/{id}":{"get":{"operationId":"stations.get","summary":"One buoy with its latest reading","tags":["Stations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A station's `id`, as a list of stations gives it: \"candhis-05602\"."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"attribution":{"type":"string"},"measures":{"type":"array","items":{"enum":["waves","wind"],"type":"string"}},"exposure":{"anyOf":[{"enum":["open","sheltered"],"type":"string"},{"type":"null"}],"description":"How the station's waves compare with those of the stations within 60 km on rough days. \"open\": it has had at least half their height on two days. \"sheltered\": it stayed under a fifth of it on every rough day, as a site in a harbour or an estuary does. Null when the days seen so far establish neither."},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["type","url","commercialUse"]},"latestReading":{"anyOf":[{"type":"object","properties":{"observedAt":{"type":"string","format":"date-time","x-native-type":"date"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"significantPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionalSpreadDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"validated":{"type":"boolean"}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","significantPeriodSeconds","peakDirectionDegrees","directionalSpreadDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","validated"]},{"type":"null"}]}},"required":["id","provider","name","latitude","longitude","attribution","measures","exposure","license","latestReading"]}}}}}}},"/stations/{id}/name":{"get":{"operationId":"stations.named","summary":"The name of a station, for a link to it","description":"Takes neither a key nor a session, even while the instance is closed to visitors: the web app names a station this way where its short address is shown before it is opened, in a message. It answers the name and nothing else.","tags":["Stations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A station's `id`, as a list of stations gives it: \"candhis-05602\"."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}}},"security":[]}},"/stations/{id}/readings":{"get":{"operationId":"stations.readings","summary":"A buoy's readings over a period, newest first","tags":["Stations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"A station's `id`, as a list of stations gives it: \"candhis-05602\"."}},{"name":"start","in":"query","schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The start of the period, ISO 8601 in UTC. Two days before `end` if left out."},"allowEmptyValue":true,"allowReserved":true},{"name":"end","in":"query","schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The end of the period, ISO 8601 in UTC. Now if left out."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":2000,"default":500},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"attribution":{"type":"string"},"measures":{"type":"array","items":{"enum":["waves","wind"],"type":"string"}},"exposure":{"anyOf":[{"enum":["open","sheltered"],"type":"string"},{"type":"null"}],"description":"How the station's waves compare with those of the stations within 60 km on rough days. \"open\": it has had at least half their height on two days. \"sheltered\": it stayed under a fifth of it on every rough day, as a site in a harbour or an estuary does. Null when the days seen so far establish neither."},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["type","url","commercialUse"]}},"required":["id","provider","name","latitude","longitude","attribution","measures","exposure","license"]},"readings":{"type":"array","items":{"type":"object","properties":{"observedAt":{"type":"string","format":"date-time","x-native-type":"date"},"significantHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"maxHeightMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"significantPeriodSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"peakDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"directionalSpreadDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"waterTemperatureCelsius":{"anyOf":[{"type":"number"},{"type":"null"}]},"windSpeedMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windGustMetersPerSecond":{"anyOf":[{"type":"number"},{"type":"null"}]},"windDirectionDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"validated":{"type":"boolean"}},"required":["observedAt","significantHeightMeters","maxHeightMeters","peakPeriodSeconds","meanPeriodSeconds","significantPeriodSeconds","peakDirectionDegrees","directionalSpreadDegrees","waterTemperatureCelsius","windSpeedMetersPerSecond","windGustMetersPerSecond","windDirectionDegrees","validated"]}}},"required":["station","readings"]}}}}}}},"/tides/extremes":{"get":{"operationId":"tides.extremes","summary":"High and low tides near a point","tags":["Tides"],"parameters":[{"name":"latitude","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Decimal degrees, north positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"longitude","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Decimal degrees, east positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The start of the period, ISO 8601 in UTC."},"allowEmptyValue":true,"allowReserved":true},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The end of the period, ISO 8601 in UTC: after start, 31 days at most."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"distanceKm":{"type":"number"},"source":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url"]},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]}},"required":["id","name","latitude","longitude","distanceKm","source","license"]},"datum":{"type":"string"},"extremes":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","format":"date-time","x-native-type":"date"},"type":{"enum":["high","low"],"type":"string"},"heightMeters":{"type":"number"}},"required":["time","type","heightMeters"]}}},"required":["station","datum","extremes"]}}}}}}},"/tides/timeline":{"get":{"operationId":"tides.timeline","summary":"Tide height at regular intervals near a point","tags":["Tides"],"parameters":[{"name":"latitude","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Decimal degrees, north positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"longitude","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Decimal degrees, east positive."},"allowEmptyValue":true,"allowReserved":true},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The start of the period, ISO 8601 in UTC."},"allowEmptyValue":true,"allowReserved":true},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date","description":"The end of the period, ISO 8601 in UTC: after start, 31 days at most."},"allowEmptyValue":true,"allowReserved":true},{"name":"stepMinutes","in":"query","required":false,"schema":{"type":"integer","minimum":5,"maximum":60,"default":10},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"distanceKm":{"type":"number"},"source":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url"]},"license":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string"},"commercialUse":{"type":"boolean"}},"required":["type","url","commercialUse"]}},"required":["id","name","latitude","longitude","distanceKm","source","license"]},"datum":{"type":"string"},"timeline":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","format":"date-time","x-native-type":"date"},"heightMeters":{"type":"number"}},"required":["time","heightMeters"]}}},"required":["station","datum","timeline"]}}}}}}},"/usage/series":{"get":{"operationId":"usage.series","summary":"The calls over time, by the hour or by the day","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The counts are approximate and up to thirty seconds late: the API writes them every thirty seconds, and loses some when it is killed. They are kept thirteen months. An hour or a day without a call is left out. A count is kept by UTC's hour, so a day is exact in a time zone that is a whole number of hours from UTC, and off by part of an hour elsewhere.","tags":["Usage"],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"step","in":"query","required":false,"schema":{"enum":["hour","day"],"type":"string","default":"hour"},"allowEmptyValue":true,"allowReserved":true},{"name":"timeZone","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"UTC"},"allowEmptyValue":true,"allowReserved":true},{"name":"developerId","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"keyId","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"way","in":"query","required":false,"schema":{"enum":["api","mcp"],"type":"string","description":"Only the calls that came this way: `api` for `/v1` and `/rpc`, `mcp` for `/mcp`."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"answered":{"type":"number"},"invalid":{"type":"number"},"refused":{"type":"number"},"limited":{"type":"number"},"failed":{"type":"number"},"at":{"type":"string","format":"date-time","x-native-type":"date"}},"required":["answered","invalid","refused","limited","failed","at"]}}},"required":["points"]}}}}},"security":[{"session":[]}]}},"/usage/breakdown":{"get":{"operationId":"usage.breakdown","summary":"The calls of a span of time, by who called or by what was called","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. The counts are approximate and up to thirty seconds late: the API writes them every thirty seconds, and loses some when it is killed. They are kept thirteen months. `by` chooses the rows: `via` for the kind of caller (a key, the accounts as a whole, or no one), `way` for the way a call came in (`api` for `/v1` and `/rpc`, `mcp` for the MCP server), `developer` and `key` for the calls made with keys, `procedure` for what was called. `way` as an input keeps the calls that came one way: with `by=developer` it says which developer accounts' agents call by MCP, and how much. The rows with the most calls come first, a hundred at most.","tags":["Usage"],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","x-native-type":"date"},"allowEmptyValue":true,"allowReserved":true},{"name":"by","in":"query","required":true,"schema":{"enum":["via","way","developer","key","procedure"],"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"developerId","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"allowEmptyValue":true,"allowReserved":true},{"name":"way","in":"query","required":false,"schema":{"enum":["api","mcp"],"type":"string","description":"Only the calls that came this way: `api` for `/v1` and `/rpc`, `mcp` for `/mcp`."},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"answered":{"type":"number"},"invalid":{"type":"number"},"refused":{"type":"number"},"limited":{"type":"number"},"failed":{"type":"number"},"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["answered","invalid","refused","limited","failed","id","name"]}}},"required":["rows"]}}}}},"security":[{"session":[]}]}},"/visitors":{"get":{"operationId":"visitors.get","summary":"Whether the instance answers the visitors of its web app","description":"Takes neither a key nor a session. A visitor is whoever opens the web app without an account: the API answers their requests, which name the web app's site in `Origin`, with the data everyone shares, until an operator closes the instance to them, or demand is strong: once the instance has sent 4400 requests to its forecast provider in a day, UTC's, for the people who look, and until that day ends. It then answers them 401, with `visitors: closed` in the error's `data`, and the web app asks for an account. A program calls with a key either way. Decision 039.","tags":["Instance"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"open":{"type":"boolean"}},"required":["open"]}}}}},"security":[]},"put":{"operationId":"visitors.update","summary":"Close the instance to the visitors of its web app, or open it to them again","description":"Takes the signed-in session of an operator of the instance, in a request that names the admin's site in `Origin`. No key calls this: decision 020. Closed, the instance answers the accounts, the keys and the links of shared lists as before, and no visitor: the web app asks them for an account. It takes effect at the next call of each visitor. Closing an instance that is closed changes nothing and records nothing, and so does opening one that is open. An instance that an operator opens still answers no visitor while demand is strong: `busy` says so.","tags":["Instance"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"open":{"type":"boolean"}},"required":["open"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"open":{"type":"boolean"},"closedAt":{"anyOf":[{"type":"string","format":"date-time","x-native-type":"date"},{"type":"null"}]},"busy":{"type":"boolean"}},"required":["open","closedAt","busy"]}}}}},"security":[{"session":[]}]}}}}