{"openapi":"3.1.0","info":{"title":"Fernscout dev — v2 API","version":"2","description":"Generated from the frozen Zod contract in lib/api/v2/schemas/ — every field, enum and required/optional marker here is what a validator actually checks, not a second hand-typed copy of it. Every path below is relative to https://dev.fernscout.ch, and every \"{user}\" is a journal's username (e.g. \"example\")."},"servers":[{"url":"https://dev.fernscout.ch"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An agent token from POST /api/auth/codes + /verify."}}},"paths":{"/api/v2/openapi.json":{"get":{"summary":"This document. No auth.","responses":{"200":{"description":"the v2 OpenAPI 3.1 document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"405":{"description":"a verb this route does not answer"}}}},"/api/v2/status":{"get":{"summary":"What this instance can do, and what things cost. No auth.","responses":{"200":{"description":"the instance's capabilities, limits and pricing","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"capabilities":{"type":"object","propertyNames":{"type":"string","enum":["reactions","costs","push","applePush","mail","whatsapp","whatsappInbound","sms","smsInbound","auth","signup","contacts","postcards","photobook","logging","credits","addressLookup","weather","analytics","helper","transcription","extract","routeRecording","mapRelief","iosApp"]},"additionalProperties":{"type":"boolean"}},"limits":{"type":"object","properties":{"imageMaxEdge":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"imageMaxPixels":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"imageMaxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"videoMaxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"videoMaxSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"itemsPerDay":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"contactsImportMaxRows":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"jsonBodyMaxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"costLinesMax":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"costLabelMaxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["imageMaxEdge","imageMaxPixels","imageMaxBytes","videoMaxBytes","videoMaxSeconds","itemsPerDay","contactsImportMaxRows","jsonBodyMaxBytes","costLinesMax","costLabelMaxChars"],"additionalProperties":false},"media":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string","enum":["photo","bank_export","gps_history","document"]}},"imageFormats":{"type":"array","items":{"type":"string"}},"videoFormats":{"type":"array","items":{"type":"string"}},"importFormats":{"type":"object","properties":{"bank_export":{"type":"array","items":{"type":"string"}},"gps_history":{"type":"array","items":{"type":"string"}}},"required":["bank_export","gps_history"],"additionalProperties":false}},"required":["kinds","imageFormats","videoFormats","importFormats"],"additionalProperties":false},"pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number","minimum":0}},"weather":{"type":"object","properties":{"reservedSources":{"type":"array","items":{"type":"string"}}},"required":["reservedSources"],"additionalProperties":false}},"required":["capabilities","limits","media","pricing","weather"],"additionalProperties":false}}}},"405":{"description":"a verb this route does not answer"}}}},"/api/v2/journals/available":{"get":{"summary":"Whether a username is free to sign up with — send ?username=.","responses":{"200":{"description":"always 200 — availability is reported in the body, not the status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":"string","enum":["invalid_username","username_taken","reserved_username"]}},"required":["username","available"],"additionalProperties":false}}}},"400":{"description":"`invalid_request` — no ?username= given","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}}}}},"/api/v2/journals":{"post":{"summary":"Create a journal, spending a signup token minted by POST /api/auth/codes.","requestBody":{"description":"the new journal's document","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string","minLength":1},"title":{"type":"string","minLength":1,"maxLength":200},"ownerName":{"type":"string","minLength":1},"ownerNickname":{"type":"string","minLength":1},"tagline":{"type":"string","minLength":1},"visibility":{"type":"string"},"defaultLocale":{"type":"string"},"locales":{"type":"array","items":{"type":"string"}},"baseCurrency":{"type":"string"},"displayCurrencies":{"type":"array","items":{"type":"string"}},"units":{"type":"string","enum":["metric","imperial"]},"tips":{"type":"boolean"}},"required":["username","title","ownerName","ownerNickname"],"additionalProperties":false}}}},"responses":{"201":{"description":"the journal exists; a one-time sign-in link and the agent token ride along","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"user":{"type":"string"},"url":{"type":"string"},"signIn":{"type":"string"},"signInNote":{"type":"string"},"documentation":{"type":"string"},"localesNote":{"type":"string"},"visibility":{"type":"string"},"token":{"type":"string"},"expires":{"type":"string"},"scope":{"type":"array","items":{"type":"string"}},"welcomeMailed":{"type":"boolean"},"note":{"type":"string"},"next":{"type":"string"}},"required":["ok","user","url","documentation","visibility","token","expires","scope","welcomeMailed","next"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `phone_required`; `invalid_username`; `invalid_title`; `invalid_owner`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"phone_required":{"value":{"error":"phone_required","message":"A journal needs a proven telephone number as well as a proven address. POST /api/auth/signup/phone with the signup token, then /api/auth/signup/phone/redeem with the code, and retry."}},"invalid_username":{"value":{"error":"invalid_username","message":"A username is 2–31 characters of lowercase letters, digits and dashes, starting with a letter or digit. It becomes the address of the journal."}},"invalid_title":{"value":{"error":"invalid_title","message":"The title is not usable — it must be one line. A line break would end the frontmatter block early, so it is refused rather than folded; put the longer version in the prose."}},"invalid_owner":{"value":{"error":"invalid_owner","message":"The owner's name or the name this journal calls them by is missing or empty. Both are asked, and neither is guessed from the other."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`signup_not_invited` — this instance is invite-only and the address is not on its list; `reserved_username`; `too_many_journals`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_not_invited":{"value":{"error":"signup_not_invited","message":"This instance is invite-only: only addresses its operator has named can make a journal here. Nothing has been sent to this address. Ask the person who runs it to add you, then start again."}},"reserved_username":{"value":{"error":"reserved_username","message":"That username would shadow a route this server serves, or the operator has reserved it. Pick another."}},"too_many_journals":{"value":{"error":"too_many_journals","message":"This address already owns as many journals as this server allows (the refusal names them). Do not sign up again: ask for a write token for the journal it owns, via /api/auth/codes and /api/auth/codes/redeem with `\"for\": \"write\"`."}}}}}},"404":{"description":"`signup_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_disabled":{"value":{"error":"signup_disabled","message":"This server does not take new journals."}}}}}},"409":{"description":"`username_taken`; `tel_taken`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"username_taken":{"value":{"error":"username_taken","message":"That username already belongs to a journal on this server. Pick another."}},"tel_taken":{"value":{"error":"tel_taken","message":"That phone number already proves a different journal. One number, one journal."}}}}}},"410":{"description":"`deleted_username`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"deleted_username":{"value":{"error":"deleted_username","message":"A journal used to live at that name and was deleted; its name is not coming back on this server. Pick another."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests` — per-IP creation/refusal rate limit","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}}},"/api/v2/me/home":{"get":{"summary":"What this address may open, and its own device list. No bearer token — an fs_identity cookie, or nobody.","responses":{"200":{"description":"always 200 — `id: null` is a stranger, not a refusal","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":["string","null"]},"email":{"type":["string","null"]},"admin":{"type":"boolean"},"journals":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string"},"title":{"type":"string"},"tagline":{"type":"string"},"href":{"type":"string"},"role":{"type":"string","enum":["admin","owner","traveller","guest"]},"trips":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"required":["username","title","tagline","href","role","trips"],"additionalProperties":false}},"devices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"publicId":{"type":"string"},"createdAt":{"type":"string"},"lastSeenAt":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"current":{"type":"boolean"}},"required":["id","publicId","createdAt","lastSeenAt","userAgent","current"],"additionalProperties":false}}},"required":["id","email","admin","journals","devices"],"additionalProperties":false}}}},"405":{"description":"a verb this route does not answer"}}}},"/api/v2/me/devices":{"delete":{"summary":"Sign out everywhere: end every browser sign-in this address holds — each device's identity and each journal's reader cookie. Agent keys and GPS tokens are not touched. Browser cookie only.","responses":{"200":{"description":"how many sign-ins ended; this browser's cookies are cleared too","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"revoked":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ok","revoked"],"additionalProperties":false}}}},"401":{"description":"`not_signed_in`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_signed_in":{"value":{"error":"not_signed_in","message":"This route takes a browser session cookie, not a bearer token. An agent cannot call it."}}}}}},"403":{"description":"`foreign_origin`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"foreign_origin":{"value":{"error":"foreign_origin","message":"This request's Origin is not this site. A cookie-only door that ends sessions answers only the site's own pages; retry from the site itself."}}}}}},"404":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}}}}},"/api/v2/me/devices/{id}":{"delete":{"summary":"End one device's identity. The id is checked against this address's own list.","responses":{"200":{"description":"revoked","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"current":{"type":"boolean"}},"required":["ok","current"],"additionalProperties":false}}}},"401":{"description":"`not_signed_in`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_signed_in":{"value":{"error":"not_signed_in","message":"This route takes a browser session cookie, not a bearer token. An agent cannot call it."}}}}}},"404":{"description":"`auth_disabled`; `no_such_device`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}},"no_such_device":{"value":{"error":"no_such_device","message":"No device of that id on this account."}}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/geocode":{"post":{"summary":"A place name into candidate coordinates, never a guess.","requestBody":{"description":"a query, and optional hints","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1},"countryHint":{"type":"string"},"regionHint":{"type":"string"},"contextCoordinates":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false}}},"required":["query"],"additionalProperties":false}}}},"responses":{"200":{"description":"a ranked shortlist, possibly empty","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"displayName":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string"},"adminRegion":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"type":{"type":"string"}},"required":["displayName","country","lat","lon"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"404":{"description":"`address_lookup_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"address_lookup_disabled":{"value":{"error":"address_lookup_disabled","message":"This journal does not have place lookup switched on, so this server will not geocode a place name for it. /api/health says whether `addressLookup` is on and why not; ask the person for coordinates directly in the meantime."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"502":{"description":"`provider_unavailable`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"provider_unavailable":{"value":{"error":"provider_unavailable","message":"The provider could not be reached, or refused the request — Stripe for a payment, Gelato for a photobook print. Nothing was charged. Read this response's own `message`: it says whether the failure is transient (retrying is reasonable) or the provider refused this server's own account (retrying will not help; this needs the operator)."}}}}}}}}},"/api/v2/{user}":{"get":{"summary":"The journal document.","responses":{"200":{"description":"the stored journal, with its ETag","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","nickname","email"],"additionalProperties":false},"locales":{"minItems":1,"type":"array","items":{"type":"string"}},"baseCurrency":{"type":"string","minLength":3,"maxLength":3},"displayCurrencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"units":{"type":"string","enum":["metric","imperial"]},"visibility":{"type":"string","enum":["public","guest"]},"tagline":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"set"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["tagline","figures"]},"additionalProperties":{"type":"string","minLength":10}},"username":{"type":"string"},"tips":{"type":"boolean"}},"required":["title","owner","locales","baseCurrency","displayCurrencies","units","visibility","username","tips"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"patch":{"summary":"Merge-patch the journal document. A CHANGED owner.email does not write — it starts a verification at `.../owner/email/redeem` instead, and answers 202.","requestBody":{"description":"only the fields being changed","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","nickname","email"],"additionalProperties":false},"locales":{"minItems":1,"type":"array","items":{"type":"string"}},"baseCurrency":{"type":"string","minLength":3,"maxLength":3},"displayCurrencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"units":{"type":"string","enum":["metric","imperial"]},"visibility":{"type":"string","enum":["public","guest"]},"tagline":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"set"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["tagline","figures"]},"additionalProperties":{"type":"string","minLength":10}}},"additionalProperties":false}}}},"responses":{"200":{"description":"the merged, re-validated document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","nickname","email"],"additionalProperties":false},"locales":{"minItems":1,"type":"array","items":{"type":"string"}},"baseCurrency":{"type":"string","minLength":3,"maxLength":3},"displayCurrencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"units":{"type":"string","enum":["metric","imperial"]},"visibility":{"type":"string","enum":["public","guest"]},"tagline":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"set"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["tagline","figures"]},"additionalProperties":{"type":"string","minLength":10}},"username":{"type":"string"},"tips":{"type":"boolean"}},"required":["title","owner","locales","baseCurrency","displayCurrencies","units","visibility","username","tips"],"additionalProperties":false}}}},"202":{"description":"owner.email changed to a different, valid address — a code went to it, and nothing was written","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"pending":{"type":"string","const":"owner_email"},"id":{"type":"string"},"next":{"type":"string"}},"required":["pending","id","next"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`stale_document` — If-Match did not cover the current ETag","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete` — the merged document leaves a required section neither answered nor declined","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete":{"value":{"error":"incomplete","message":"The document is missing an answer to something this journal keeps track of. `details.missing` lists every open section at once — each with why it is asked, a schema excerpt of what to send, and how to decline it instead. Ask the person; never invent a value to get past this."}}}}}},"429":{"description":"`too_many_requests` — too many owner-email codes for this address or this journal today","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"503":{"description":"`mail_disabled` — owner.email changed, but this server cannot send the verification code; `mail_failed` — owner.email changed, but the verification code could not be sent","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"mail_disabled":{"value":{"error":"mail_disabled","message":"This server cannot send mail, so anything that would have been mailed has not been."}},"mail_failed":{"value":{"error":"mail_failed","message":"The mail could not be sent. Nothing else about the call failed; tell the person, and do not retry in a loop."}}}}}}}},"delete":{"summary":"Ask to delete the journal — mails the owner a single-use confirmation link. Deletes nothing itself.","responses":{"202":{"description":"a mail is on its way; nothing has been deleted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"deleted":{"type":"boolean","const":false},"status":{"type":"string","const":"confirmation_sent"},"mailedTo":{"type":"string"},"expires":{"type":"string"},"willDelete":{"type":"object","properties":{"journal":{"type":"string"},"trips":{"type":"number"},"days":{"type":"number"},"files":{"type":"number"},"size":{"type":"string"}},"required":["journal","trips","days","files","size"],"additionalProperties":false},"note":{"type":"string"},"next":{"type":"string"}},"required":["ok","deleted","status","mailedTo","expires","willDelete","note","next"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`mail_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"mail_disabled":{"value":{"error":"mail_disabled","message":"This server cannot send mail, so anything that would have been mailed has not been."}}}}}},"410":{"description":"`gone` — already deleted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"gone":{"value":{"error":"gone","message":"This journal or trip was deleted. Its name stays reserved and its old URLs answer 410 rather than 404, so this is not a typo — it is a thing that used to be here."}}}}}},"429":{"description":"`too_many_requests` — too many deletion mails to this address recently","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/status":{"get":{"summary":"Where this journal and this token stand: drafts, trips, storage, inbox.","responses":{"200":{"description":"the journal's live status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"journal":{"type":"string"},"credits":{"type":["number","null"]},"drafts":{"type":"array","items":{"type":"object","properties":{"trip":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"test":{"type":"boolean"}},"required":["trip","slug","title"],"additionalProperties":false}},"trips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"],"additionalProperties":false}},"storage":{"type":"object","properties":{"usedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["usedBytes","maxBytes"],"additionalProperties":false},"inbox":{"type":"object","properties":{"media":{"type":"integer","minimum":0,"maximum":9007199254740991},"files":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["media","files"],"additionalProperties":false},"token":{"type":"object","properties":{"scope":{"type":"string","enum":["owner","trip"]},"trip":{"type":"string"},"expiresAt":{"type":"string"}},"required":["scope","expiresAt"],"additionalProperties":false}},"required":["journal","credits","drafts","trips","storage","inbox","token"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/storage":{"get":{"summary":"Where this journal's storage is going.","responses":{"200":{"description":"usage, breakdown, what could be reclaimed, and the price of more","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"usedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"limitBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"purchasedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"remainingBytes":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"breakdown":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"bytes":{"type":"number"}},"required":["key","label","bytes"],"additionalProperties":false}},"reclaimable":{"type":"object","properties":{"photobooks":{"type":"number"},"postcards":{"type":"number"},"stagedFiles":{"type":"number"},"bytes":{"type":"number"},"files":{"type":"number"}},"required":["photobooks","postcards","stagedFiles","bytes","files"],"additionalProperties":false},"extension":{"type":"object","properties":{"credits":{"type":"number","const":50},"addsBytes":{"type":"number","const":5368709120}},"required":["credits","addsBytes"],"additionalProperties":false}},"required":["usedBytes","limitBytes","purchasedBytes","remainingBytes","breakdown","reclaimable","extension"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/sync/manifest":{"get":{"summary":"Every file this journal's folder holds, with a hash — the up-to-date check for a local mirror, and a complete one: the full-resolution originals are included, so a first pull is large and a later one carries only what the hashes say changed. This journal's position history is in no manifest and behind no route. Owner only.","responses":{"200":{"description":"path, size and hash of every syncable file","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string"},"files":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991},"hash":{"type":"string"}},"required":["path","size","hash"],"additionalProperties":false}},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"next":{"type":"string"}},"required":["user","files","bytes","next"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"404":{"description":"`not_found` — the same refusal whether the journal is unknown, the token is for a different one, or it is merely trip-scoped","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/sync/file/{path}":{"get":{"summary":"One file's bytes, by the path the manifest named. Read-only, owner only.","responses":{"200":{"description":"the file's bytes, with a content-type guessed from its name"},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"404":{"description":"`not_found` — the same refusal whether the journal is unknown, the token is for a different one, or it is merely trip-scoped","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"path","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"A file's path inside the journal folder, exactly as the sync manifest lists it — `trips/<trip>/entries/<slug>.json`. Never absolute, and never climbing out of the folder."}]},"/api/v2/{user}/import":{"get":{"summary":"The kinds and formats this door reads, and the ceiling on a request's size. Owner only.","responses":{"200":{"description":"kinds, formats and the byte ceiling","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string"},"kinds":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["gps","contacts"]},"what":{"type":"string"},"formats":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"additionalProperties":false}}},"required":["kind","what","formats"],"additionalProperties":false}},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"next":{"type":"string"}},"required":["user","kinds","maxBytes","next"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"post":{"summary":"Import a location history (`kind: \"gps\"`, stored as read) or a phone's address book (`kind: \"contacts\"`, read and reported — nothing is written until the agreed rows are sent to POST .../contacts/import). Send ?dryRun to preview. JSON `{kind, format?, inbox|text}`, or multipart with `file`. Owner only, with one exception (B2204): a `write:gps` token — minted at POST /api/auth/{user}/gps-token — may call this too, and only this, and only for `kind: \"gps\"` with `dryRun` false or absent; its response has no `extent`. Everything else about this door refuses that token exactly as it refuses any other non-owner call.","requestBody":{"description":"name the kind; give the bytes as inbox, text, or (multipart only) file","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["gps","contacts"]},"format":{"type":"string"},"inbox":{"type":"string"},"text":{"type":"string"}},"required":["kind"],"additionalProperties":false}}}},"responses":{"200":{"description":"a gps import, stored (or previewed under ?dryRun) — or a contacts import, read and reported, never written","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"gps"},"format":{"type":"string"},"detected":{"type":"boolean"},"read":{"type":"integer","minimum":0,"maximum":9007199254740991},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"stored":{"type":"object","properties":{"read":{"type":"integer","minimum":0,"maximum":9007199254740991},"before":{"type":"integer","minimum":0,"maximum":9007199254740991},"after":{"type":"integer","minimum":0,"maximum":9007199254740991},"months":{"type":"array","items":{"type":"string"}}},"required":["read","months"],"additionalProperties":false},"rederived":{"type":"array","items":{"type":"object","properties":{"tripId":{"type":"string"},"ok":{"type":"boolean"}},"required":["tripId","ok"],"additionalProperties":false}},"dryRun":{"type":"boolean"},"next":{"type":"string"}},"required":["kind","format","detected","read","from","to","dryRun","next"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"contacts"},"format":{"type":"string"},"detected":{"type":"boolean"},"people":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"tel":{"type":"string"}},"required":["name"],"additionalProperties":false}},"withEmail":{"type":"integer","minimum":0,"maximum":9007199254740991},"next":{"type":"string"}},"required":["kind","format","detected","people","withEmail","next"],"additionalProperties":false}]}}}},"400":{"description":"`invalid_request`; `expected_file`; `invalid_body`; `no_file`; `unknown_kind`; `storage_full`; `unreadable`; `contract`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"expected_file":{"value":{"error":"expected_file","message":"This multipart call wants the export under `file`. One file per call."}},"invalid_body":{"value":{"error":"invalid_body","message":"The JSON body was not an object this call understands. The `hint` shows the shape."}},"no_file":{"value":{"error":"no_file","message":"The import call named no file: use `inbox` with an id from the inbox, multipart `file`, or `text` for a few lines inline."}},"unknown_kind":{"value":{"error":"unknown_kind","message":"No such kind of data. A kind is what the data *is* (`gps`); a format is who wrote it. GET the import route for the kinds this instance reads."}},"storage_full":{"value":{"error":"storage_full","message":"This journal has no room left for what you sent, and nothing was written. The message says how much it holds and how much it is allowed. Delete something, or the owner buys more room — an agent cannot."}},"unreadable":{"value":{"error":"unreadable","message":"The importer could not read the file at all. If the format was detected it may be the wrong one — name it explicitly. If you named it, the file is not what you said."}},"contract":{"value":{"error":"contract","message":"The file was read and what came out does not hold up: `problems` says what is wrong in words — coordinates the wrong way round, seconds where milliseconds were meant, an export with no positions. Nothing was written."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_user`; `unknown_inbox_file`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_user":{"value":{"error":"unknown_user","message":"No journal of that name on this instance."}},"unknown_inbox_file":{"value":{"error":"unknown_inbox_file","message":"One of the `inbox` ids names nothing staged in this journal — or names something that is not a photograph. Nothing was written and nothing was taken out of the inbox; GET the inbox and send the ids it lists."}}}}}},"413":{"description":"`body_too_large`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/gps":{"get":{"summary":"Which months of raw location history this journal holds — names, never a fix. Owner only.","responses":{"200":{"description":"YYYY-MM, sorted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"monthsHeld":{"type":"array","items":{"type":"string"}}},"required":["monthsHeld"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/channels":{"get":{"summary":"The owner's own mute switches for the sending channels.","responses":{"200":{"description":"null for a channel this instance does not offer at all","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mail":{"type":["boolean","null"]},"whatsapp":{"type":["boolean","null"]}},"required":["mail","whatsapp"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"patch":{"summary":"Switch mail and/or WhatsApp sending on or off for this journal.","requestBody":{"description":"at least one of mail/whatsapp","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mail":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"the channels as they now stand","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mail":{"type":["boolean","null"]},"whatsapp":{"type":["boolean","null"]}},"required":["mail","whatsapp"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`capability_unavailable`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"capability_unavailable":{"value":{"error":"capability_unavailable","message":"This server does not offer that capability, so a journal cannot switch it on. /api/health says what is missing; switching it off is always allowed."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/owner/tel":{"get":{"summary":"The owner's own telephone number — a notification channel, not the address that owns the journal.","responses":{"200":{"description":"null fields when there is no number on file","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tel":{"type":["string","null"]},"provenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"provenMethod":{"anyOf":[{"type":"string","enum":["sms","operator","whatsapp-inbound"]},{"type":"null"}]}},"required":["tel","provenAt","provenMethod"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"delete":{"summary":"Clear the owner's own number — turns their free WhatsApp copy of a day back off.","responses":{"200":{"description":"tel: null","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tel":{"type":["string","null"]},"provenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"provenMethod":{"anyOf":[{"type":"string","enum":["sms","operator","whatsapp-inbound"]},{"type":"null"}]}},"required":["tel","provenAt","provenMethod"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/owner/tel/verify":{"post":{"summary":"Start proving a number for the owner's own telephone field — sends a one-time code.","requestBody":{"description":"a telephone number with its country code, e.g. \"+41 76 000 00 00\"","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tel":{"type":"string","minLength":1}},"required":["tel"],"additionalProperties":false}}}},"responses":{"202":{"description":"an opaque id — bring it, with the code, to `.../verify/redeem`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`capability_unavailable`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"capability_unavailable":{"value":{"error":"capability_unavailable","message":"This server does not offer that capability, so a journal cannot switch it on. /api/health says what is missing; switching it off is always allowed."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"503":{"description":"`verification_failed`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"verification_failed":{"value":{"error":"verification_failed","message":"The phone code could not be sent. Try again in a minute, or check the number."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/owner/tel/verify/redeem":{"post":{"summary":"Finish proving a number — the code from `.../verify` writes owner.tel, proven, for good.","requestBody":{"description":"the id from `.../verify`, and the code the number received","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["id","code"],"additionalProperties":false}}}},"responses":{"200":{"description":"the number, now proven","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tel":{"type":["string","null"]},"provenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"provenMethod":{"anyOf":[{"type":"string","enum":["sms","operator","whatsapp-inbound"]},{"type":"null"}]}},"required":["tel","provenAt","provenMethod"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`; `invalid_code`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}},"invalid_code":{"value":{"error":"invalid_code","message":"The six-digit code is wrong, used, or more than 30 minutes old. Ask for a new one; the newest is the only live one."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/owner/email/redeem":{"post":{"summary":"Finish moving owner.email — the code the new address received writes it, revokes every session and agent token the old address held for this journal, and mails the old address.","requestBody":{"description":"the id from the PATCH that started this, and the code the new address received","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["id","code"],"additionalProperties":false}}}},"responses":{"200":{"description":"the journal document, with owner.email now moved","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","nickname","email"],"additionalProperties":false},"locales":{"minItems":1,"type":"array","items":{"type":"string"}},"baseCurrency":{"type":"string","minLength":3,"maxLength":3},"displayCurrencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"units":{"type":"string","enum":["metric","imperial"]},"visibility":{"type":"string","enum":["public","guest"]},"tagline":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"set"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["tagline","figures"]},"additionalProperties":{"type":"string","minLength":10}},"username":{"type":"string"},"tips":{"type":"boolean"}},"required":["title","owner","locales","baseCurrency","displayCurrencies","units","visibility","username","tips"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`; `invalid_code`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}},"invalid_code":{"value":{"error":"invalid_code","message":"The six-digit code is wrong, used, or more than 30 minutes old. Ask for a new one; the newest is the only live one."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/trips":{"get":{"summary":"Every trip this token may write, paged.","responses":{"200":{"description":"one page of trip documents","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"},"status":{"type":"string","enum":["upcoming","current","past"]},"track":{"type":"object","properties":{"present":{"type":"boolean"},"updatedAt":{"type":"string"}},"required":["present"],"additionalProperties":false},"notifications":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"kind":{"type":"string","enum":["trip-added","journal-invite"]}},"required":["email","kind"],"additionalProperties":false}}},"required":["id","title","dates","visibility","people","days","status"],"additionalProperties":false}},"next_cursor":{"type":"string"}},"required":["trips"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/trips/{trip}":{"get":{"summary":"One trip. `?days=full|summaries|none` controls how much of each day rides along (default full, dayDoc[]); summaries and none change the shape of `days` away from what `tripDoc` documents for a plain GET.","responses":{"200":{"description":"the trip, with its days inline (mode `full`)","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"},"status":{"type":"string","enum":["upcoming","current","past"]},"track":{"type":"object","properties":{"present":{"type":"boolean"},"updatedAt":{"type":"string"}},"required":["present"],"additionalProperties":false},"notifications":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"kind":{"type":"string","enum":["trip-added","journal-invite"]}},"required":["email","kind"],"additionalProperties":false}}},"required":["id","title","dates","visibility","people","days","status"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"put":{"summary":"Create a trip at a client-chosen id, or replace one (with a matching If-Match).","requestBody":{"description":"the whole trip document","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]}},"required":["src"],"additionalProperties":false}},"costs":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","const":"draft"},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"}},"required":["id","title","dates","visibility","people"],"additionalProperties":false,"x-required-or-declined":[{"field":"rates","whyRequired":"every trip states the currencies its figures may use, or declines them","toDecline":"declined.rates"},{"field":"costs","whyRequired":"every trip carries a budget, or says why costs are not tracked here","toDecline":"declined.costs"},{"field":"plan","whyRequired":"an upcoming trip carries its intended route, or says why there is none","toDecline":"declined.plan"},{"field":"days","whyRequired":"a trip carries its days, or says why there are none yet (e.g. it has not started)","toDecline":"declined.days"},{"field":"translations","whyRequired":"a journal that maintains several languages carries each trip's title and tagline in all of them, or says why not (a single-language journal is exempt — the route skips this check)","toDecline":"declined.translations"},{"field":"accent","whyRequired":"every trip picks the colour its cards are drawn in, or leaves it to the default with a reason","toDecline":"declined.accent"},{"field":"figures","whyRequired":"how the party is drawn as walking figures: {mode: \"off\"}, {mode: \"journal\"} (the journal's default set), or {mode: \"custom\", figures: [ids]} — create figures at /figures first","toDecline":"declined.figures"},{"field":"tagline","whyRequired":"every trip card carries its one-line subtitle, or a reason it has none","toDecline":"declined.tagline"},{"field":"intro","whyRequired":"a trip page opens with a few lines of prose, or says why there are none","toDecline":"declined.intro"}],"allOf":[{"anyOf":[{"required":["rates"]},{"required":["declined"],"properties":{"declined":{"required":["rates"]}}}]},{"anyOf":[{"required":["costs"]},{"required":["declined"],"properties":{"declined":{"required":["costs"]}}}]},{"anyOf":[{"required":["plan"]},{"required":["declined"],"properties":{"declined":{"required":["plan"]}}}]},{"anyOf":[{"required":["days"]},{"required":["declined"],"properties":{"declined":{"required":["days"]}}}]},{"anyOf":[{"required":["translations"]},{"required":["declined"],"properties":{"declined":{"required":["translations"]}}}]},{"anyOf":[{"required":["accent"]},{"required":["declined"],"properties":{"declined":{"required":["accent"]}}}]},{"anyOf":[{"required":["figures"]},{"required":["declined"],"properties":{"declined":{"required":["figures"]}}}]},{"anyOf":[{"required":["tagline"]},{"required":["declined"],"properties":{"declined":{"required":["tagline"]}}}]},{"anyOf":[{"required":["intro"]},{"required":["declined"],"properties":{"declined":{"required":["intro"]}}}]}]}}}},"responses":{"200":{"description":"replaced (If-Match matched the stored ETag)","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"},"status":{"type":"string","enum":["upcoming","current","past"]},"track":{"type":"object","properties":{"present":{"type":"boolean"},"updatedAt":{"type":"string"}},"required":["present"],"additionalProperties":false},"notifications":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"kind":{"type":"string","enum":["trip-added","journal-invite"]}},"required":["email","kind"],"additionalProperties":false}}},"required":["id","title","dates","visibility","people","days","status"],"additionalProperties":false}}}},"201":{"description":"created — carries `next` when this is the journal's first trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"},"status":{"type":"string","enum":["upcoming","current","past"]},"track":{"type":"object","properties":{"present":{"type":"boolean"},"updatedAt":{"type":"string"}},"required":["present"],"additionalProperties":false},"notifications":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"kind":{"type":"string","enum":["trip-added","journal-invite"]}},"required":["email","kind"],"additionalProperties":false}},"next":{"type":"string"}},"required":["id","title","dates","visibility","people","days","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_trip_id`; `invalid_request`; `invalid_trip`; `invalid_translations`; `invalid_cover`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_trip_id":{"value":{"error":"invalid_trip_id","message":"The trip id must be lowercase letters, digits and single hyphens. It is the URL segment and the folder name."}},"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"invalid_trip":{"value":{"error":"invalid_trip","message":"One or more fields of the trip are wrong; `problems` lists them. A field name that is not a field is refused here rather than dropped, and the hint names the field you probably meant."}},"invalid_translations":{"value":{"error":"invalid_translations","message":"A translation names a locale this journal does not declare, or its shape is wrong. Declare the locale first with PATCH /api/v2/{user} (its `locales` field), or drop it."}},"invalid_cover":{"value":{"error":"invalid_cover","message":"`cover` must be a `src` already carried by one of this trip's own days — read GET .../trips/{trip}/days/{slug}/media for each day's list. `null` on a PATCH clears it back to absent."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`stale_document` — exists already, with no or a stale If-Match — carries the stored document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete":{"value":{"error":"incomplete","message":"The document is missing an answer to something this journal keeps track of. `details.missing` lists every open section at once — each with why it is asked, a schema excerpt of what to send, and how to decline it instead. Ask the person; never invent a value to get past this."}}}}}}}},"patch":{"summary":"Merge-patch a trip.","requestBody":{"description":"only the fields being changed","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]}},"required":["src"],"additionalProperties":false}},"costs":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","const":"draft"},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"anyOf":[{"type":"string","enum":["sky","yellow","green","coral","navy"]},{"type":"null"}]},"cover":{"type":["string","null"]},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":["string","null"]},"intro":{"type":["string","null"]},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"the merged, re-validated document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"title":{"type":"string","minLength":1,"maxLength":200},"dates":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"],"additionalProperties":false},"visibility":{"type":"string","enum":["private","public","guest"]},"people":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"nickname":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false}},"teaser":{"type":"boolean"},"rates":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"string","minLength":3,"maxLength":3}},"manual":{"type":"object","propertyNames":{"type":"string","minLength":3,"maxLength":3},"additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["currencies"],"additionalProperties":false},"costs":{"type":"object","properties":{"budget":{"type":"object","properties":{"total":{"type":"number","exclusiveMinimum":0},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["total"],"additionalProperties":false},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"note":{"type":"string"},"visibility":{"type":"string","enum":["public","guests"]}},"additionalProperties":false},"plan":{"type":"object","properties":{"route":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"location":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"note":{"type":"string"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"arrive":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"leave":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"see":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["name","lat","lng"],"additionalProperties":false}},"source":{"type":"string","enum":["typed","maps-link","pin","coordinates"]}},"required":["location","lat","lng"],"additionalProperties":false}},"body":{"type":"string"},"mode":{"type":"string","enum":["nights","dates"]},"readers":{"type":"string","enum":["map","details"]},"private":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}},"stops":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"stay":{"type":"object","properties":{"name":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["name","lat","lng"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"additionalProperties":false}}},"additionalProperties":false}},"required":["route"],"additionalProperties":false},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"tagline":{"type":"string"},"intro":{"type":"string"}},"additionalProperties":false}},"accent":{"type":"string","enum":["sky","yellow","green","coral","navy"]},"cover":{"type":"string"},"figures":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"off"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"journal"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"custom"},"figures":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1}}},"required":["mode","figures"],"additionalProperties":false}]},"tagline":{"type":"string"},"intro":{"type":"string"},"listed":{"type":"boolean"},"reminder":{"type":"object","properties":{"channel":{"type":"string","enum":["mail"]}},"required":["channel"],"additionalProperties":false},"declined":{"type":"object","propertyNames":{"type":"string","enum":["rates","costs","plan","days","translations","accent","cover","figures","tagline","intro","listed"]},"additionalProperties":{"type":"string","minLength":10}},"test":{"type":"boolean"},"status":{"type":"string","enum":["upcoming","current","past"]},"track":{"type":"object","properties":{"present":{"type":"boolean"},"updatedAt":{"type":"string"}},"required":["present"],"additionalProperties":false},"notifications":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"kind":{"type":"string","enum":["trip-added","journal-invite"]}},"required":["email","kind"],"additionalProperties":false}}},"required":["id","title","dates","visibility","people","days","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `invalid_translations`; `invalid_cover`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"invalid_translations":{"value":{"error":"invalid_translations","message":"A translation names a locale this journal does not declare, or its shape is wrong. Declare the locale first with PATCH /api/v2/{user} (its `locales` field), or drop it."}},"invalid_cover":{"value":{"error":"invalid_cover","message":"`cover` must be a `src` already carried by one of this trip's own days — read GET .../trips/{trip}/days/{slug}/media for each day's list. `null` on a PATCH clears it back to absent."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete":{"value":{"error":"incomplete","message":"The document is missing an answer to something this journal keeps track of. `details.missing` lists every open section at once — each with why it is asked, a schema excerpt of what to send, and how to decline it instead. Ask the person; never invent a value to get past this."}}}}}}}},"delete":{"summary":"Ask to delete a trip — mails the owner a single-use confirmation link. Deletes nothing itself.","responses":{"202":{"description":"a mail is on its way; nothing has been deleted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"deleted":{"type":"boolean","const":false},"status":{"type":"string","const":"confirmation_sent"},"mailedTo":{"type":"string"},"expires":{"type":"string"},"willDelete":{"type":"object","properties":{"trip":{"type":"string"},"id":{"type":"string"},"days":{"type":"number"},"files":{"type":"number"},"size":{"type":"string"},"mediaGoesToo":{"type":"boolean","const":true}},"required":["trip","id","days","files","size","mediaGoesToo"],"additionalProperties":false},"note":{"type":"string"},"next":{"type":"string"}},"required":["ok","deleted","status","mailedTo","expires","willDelete","note","next"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"410":{"description":"`gone`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"gone":{"value":{"error":"gone","message":"This journal or trip was deleted. Its name stays reserved and its old URLs answer 410 rather than 404, so this is not a typo — it is a thing that used to be here."}}}}}},"429":{"description":"`too_many_requests` — too many deletion mails to this address recently","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/trips/{trip}/rename":{"post":{"summary":"Rename a trip's id — the folder, trip.json's own id, every database row a trip_id column names, and a redirect record so the old address keeps answering. Never touches gps/.","requestBody":{"description":"the new id","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"renamed — GET the trip at its new id from here on","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"}},"required":["ok","id"],"additionalProperties":false}}}},"400":{"description":"`invalid_trip_id` — not a valid slug, or the same id the trip already has; `invalid_request` — the new id is the trip's current one — nothing to rename","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_trip_id":{"value":{"error":"invalid_trip_id","message":"The trip id must be lowercase letters, digits and single hyphens. It is the URL segment and the folder name."}},"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}},"409":{"description":"`trip_id_taken`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"trip_id_taken":{"value":{"error":"trip_id_taken","message":"This journal already has a trip at that id. Pick a different one. Nothing was written."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/trips/{trip}/days":{"get":{"summary":"Every day in this trip, paged.","responses":{"200":{"description":"one page of day documents","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}},"next_cursor":{"type":"string"}},"required":["trip","days"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/trips/{trip}/days/{slug}":{"get":{"summary":"One day.","responses":{"200":{"description":"the day, with its ETag","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}}}},"put":{"summary":"Create a day at a client-chosen slug, or replace a draft (with a matching If-Match).","requestBody":{"description":"the whole day document","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]}},"required":["src"],"additionalProperties":false}},"costs":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","const":"draft"},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content"],"additionalProperties":false,"x-required-or-declined":[{"field":"media","whyRequired":"a day names the photographs on it (by the src the media door answered with), or says why there are none","toDecline":"declined.media"},{"field":"costs","whyRequired":"a day carries what was spent on it, or says why not (nothing spent / figures lost / owner tracks costs elsewhere)","toDecline":"declined.costs"},{"field":"coordinates","whyRequired":"a day carries where it happened (lat/lng), or says why there is no position","toDecline":"declined.coordinates"},{"field":"weather","whyRequired":"a day asks the server to look its weather up (weather: true), brings a real reading, or declines","toDecline":"declined.weather"},{"field":"time","whyRequired":"a day says when it happened (HH:MM, local), or declines","toDecline":"declined.time"},{"field":"timezone","whyRequired":"the IANA zone the time is local to, or a reason it is not known","toDecline":"declined.timezone"},{"field":"location","whyRequired":"the place this day happened, or why none is named","toDecline":"declined.location"},{"field":"country","whyRequired":"the country this day happened in, or why none is named","toDecline":"declined.country"},{"field":"countryCode","whyRequired":"the ISO-2 code behind the flag the day card draws, or a decline","toDecline":"declined.countryCode"},{"field":"transportMode","whyRequired":"how this day travelled, or a decline for a day with no leg (a rest day)","toDecline":"declined.transportMode"},{"field":"tags","whyRequired":"the day's tags, or a decline","toDecline":"declined.tags"},{"field":"translations","whyRequired":"a journal that maintains several languages carries the day in all of them, or declines — a declined translation falls back to the main language (a single-language journal is exempt; the route skips this check)","toDecline":"declined.translations"},{"field":"visibility","whyRequired":"whether this day is held back (guest or private, narrowing the trip's own gate), or declined — declined means shown to everyone the trip lets in","toDecline":"declined.visibility"},{"field":"status","whyRequired":"a day states it arrives as a draft — status: \"draft\" is the only writable value; publishing stays its own call","toDecline":"declined.status"}],"allOf":[{"anyOf":[{"required":["media"]},{"required":["declined"],"properties":{"declined":{"required":["media"]}}}]},{"anyOf":[{"required":["costs"]},{"required":["declined"],"properties":{"declined":{"required":["costs"]}}}]},{"anyOf":[{"required":["coordinates"]},{"required":["declined"],"properties":{"declined":{"required":["coordinates"]}}}]},{"anyOf":[{"required":["weather"]},{"required":["declined"],"properties":{"declined":{"required":["weather"]}}}]},{"anyOf":[{"required":["time"]},{"required":["declined"],"properties":{"declined":{"required":["time"]}}}]},{"anyOf":[{"required":["timezone"]},{"required":["declined"],"properties":{"declined":{"required":["timezone"]}}}]},{"anyOf":[{"required":["location"]},{"required":["declined"],"properties":{"declined":{"required":["location"]}}}]},{"anyOf":[{"required":["country"]},{"required":["declined"],"properties":{"declined":{"required":["country"]}}}]},{"anyOf":[{"required":["countryCode"]},{"required":["declined"],"properties":{"declined":{"required":["countryCode"]}}}]},{"anyOf":[{"required":["transportMode"]},{"required":["declined"],"properties":{"declined":{"required":["transportMode"]}}}]},{"anyOf":[{"required":["tags"]},{"required":["declined"],"properties":{"declined":{"required":["tags"]}}}]},{"anyOf":[{"required":["translations"]},{"required":["declined"],"properties":{"declined":{"required":["translations"]}}}]},{"anyOf":[{"required":["visibility"]},{"required":["declined"],"properties":{"declined":{"required":["visibility"]}}}]},{"anyOf":[{"required":["status"]},{"required":["declined"],"properties":{"declined":{"required":["status"]}}}]}]}}}},"responses":{"200":{"description":"replaced","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"201":{"description":"created — carries `next` when this is the trip's first day","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"},"next":{"type":"string"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `weather_disabled`; `invalid_entry`; `invalid_translations`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"weather_disabled":{"value":{"error":"weather_disabled","message":"`weather: true` asks this server to look the day up in a public archive, and the weather capability is off for this journal — no lookup would happen at all. Nothing was written, rather than storing a request nobody will service. Send the day without the field; /api/health says whether this server provides weather at all. A reading somebody actually took goes in `weather` as an object with its own `source` — never one you believe."}},"invalid_entry":{"value":{"error":"invalid_entry","message":"One or more fields of the day are wrong. `problems` lists every one at once — field, what arrived, what was expected — so fix them all and send once, rather than a round trip each."}},"invalid_translations":{"value":{"error":"invalid_translations","message":"A translation names a locale this journal does not declare, or its shape is wrong. Declare the locale first with PATCH /api/v2/{user} (its `locales` field), or drop it."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}},"409":{"description":"`stale_document`; `already_published` — PUT replaces a draft only; PATCH a published day","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}},"already_published":{"value":{"error":"already_published","message":"This day is already on the site. Nothing was changed."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete":{"value":{"error":"incomplete","message":"The document is missing an answer to something this journal keeps track of. `details.missing` lists every open section at once — each with why it is asked, a schema excerpt of what to send, and how to decline it instead. Ask the person; never invent a value to get past this."}}}}}}}},"patch":{"summary":"Merge-patch a day. Never moves it between draft and published. A draft may stay incomplete — completeness is asked at publish; a published day must stay complete (422 incomplete). A day that changed while the patch was checked (a publish, another write) answers 409 stale_document.","requestBody":{"description":"only the fields being changed","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]}},"required":["src"],"additionalProperties":false}},"costs":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","const":"draft"},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"the merged, re-validated document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `weather_disabled`; `invalid_entry`; `invalid_translations`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"weather_disabled":{"value":{"error":"weather_disabled","message":"`weather: true` asks this server to look the day up in a public archive, and the weather capability is off for this journal — no lookup would happen at all. Nothing was written, rather than storing a request nobody will service. Send the day without the field; /api/health says whether this server provides weather at all. A reading somebody actually took goes in `weather` as an object with its own `source` — never one you believe."}},"invalid_entry":{"value":{"error":"invalid_entry","message":"One or more fields of the day are wrong. `problems` lists every one at once — field, what arrived, what was expected — so fix them all and send once, rather than a round trip each."}},"invalid_translations":{"value":{"error":"invalid_translations","message":"A translation names a locale this journal does not declare, or its shape is wrong. Declare the locale first with PATCH /api/v2/{user} (its `locales` field), or drop it."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete":{"value":{"error":"incomplete","message":"The document is missing an answer to something this journal keeps track of. `details.missing` lists every open section at once — each with why it is asked, a schema excerpt of what to send, and how to decline it instead. Ask the person; never invent a value to get past this."}}}}}}}},"delete":{"summary":"Delete a draft day outright — no confirmation step, since it was never on the site.","responses":{"200":{"description":"deleted; its media is kept on disk","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"deleted":{"type":"boolean","const":true},"published":{"type":"boolean","const":false},"mediaKept":{"type":"boolean","const":true},"note":{"type":"string"}},"required":["ok","slug","deleted","published","mediaKept","note"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`published_day_not_deletable`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"published_day_not_deletable":{"value":{"error":"published_day_not_deletable","message":"This day is on the site, and a published day is not deleted here — destroying something people have already read is not a self-served step. Take it off the site first with the unpublish call (reversible); once it is a draft again it can be deleted."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/media":{"post":{"summary":"Attach already-stored photographs to this day's gallery — never uploads bytes itself (POST /api/v2/{user}/media does that first). Retracts a stale declined.media.","requestBody":{"description":"the srcs an earlier upload already answered with","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"minItems":1,"type":"array","items":{"type":"object","properties":{"src":{"type":"string","minLength":1},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]}},"required":["src"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"responses":{"200":{"description":"the day, with the photographs attached","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `not_this_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"not_this_trip":{"value":{"error":"not_this_trip","message":"That `gallery` src is not a photograph on this trip's own media — either it names a different trip, or it does not exist. Give a src exactly as a day's gallery already carries it."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"delete":{"summary":"Take photographs off this day's gallery by src — the reversible half; the bytes stay on disk (DELETE /api/v2/{user}/media removes those, and detaches from every day too).","requestBody":{"description":"the srcs to remove, exactly as the day carries them","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"srcs":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}}},"required":["srcs"],"additionalProperties":false}}}},"responses":{"200":{"description":"the day, with the photographs detached","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"title":{"type":"string","maxLength":200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"content":{"type":"string","maxLength":100000},"media":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"caption":{"type":"string"},"visibility":{"type":"string","enum":["guest","private"]},"url":{"type":"string"},"alt":{"type":"string"}},"required":["src","url"],"additionalProperties":false}},"costs":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]},"currency":{"type":"string","minLength":3,"maxLength":3},"stop":{"type":"string"}},"required":["label","amount"],"additionalProperties":false}},"coordinates":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"],"additionalProperties":false},"weather":{"anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"tempMin":{"type":"number","minimum":-90,"maximum":60},"tempMax":{"type":"number","minimum":-90,"maximum":60},"code":{"type":"integer","minimum":0,"maximum":99},"precipitation":{"type":"number","minimum":0,"maximum":2000},"windMax":{"type":"number","minimum":0,"maximum":500},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"source":{"type":"string","minLength":1}},"required":["recordedAt","source"],"additionalProperties":false}]},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"countryCode":{"type":"string","minLength":2,"maxLength":2},"transportMode":{"type":"string","enum":["flight","train","bus","motorbike","bicycle","boat","car","taxi","walk","metro","tram","ferry"]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":30,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"translations":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"visibility":{"type":"string","enum":["guest","private"]},"status":{"type":"string","enum":["draft","published"]},"declined":{"type":"object","propertyNames":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]},"additionalProperties":{"type":"string","minLength":10}},"transportFrom":{"type":"string"},"transportTo":{"type":"string"},"travelScene":{"type":"string","enum":["default","quick","skip"]},"test":{"type":"boolean"}},"required":["slug","title","date","content","status"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`; `unknown_media`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}},"unknown_media":{"value":{"error":"unknown_media","message":"One or more of `src` is not a photograph this day has. `problems` names each one; nothing was removed."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/publish":{"post":{"summary":"Owner only: put a draft day on the site. declineTracked may name only fields the day has neither filled in nor already answered; any other name refuses the whole call (400, details.refused).","requestBody":{"description":"which tracked facts to decline, and whether to send it","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"declineTracked":{"type":"array","items":{"type":"string","enum":["media","costs","coordinates","weather","time","timezone","location","country","countryCode","transportMode","tags","translations","visibility","status"]}},"sendMail":{"type":"boolean"},"sendWhatsapp":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"dryRun — nothing written","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"written":{"type":"boolean","const":false},"dryRun":{"type":"boolean","const":true},"note":{"type":"string"}},"required":["ok","written","dryRun","note"],"additionalProperties":false}}}},"400":{"description":"`invalid_request` — includes declineTracked naming a field that is not blank (details.refused)","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"402":{"description":"`no_credits`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_credits":{"value":{"error":"no_credits","message":"This journal has no credits left for that."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it; `out_of_scope` — a trip-scoped token cannot publish","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`already_published`; `stale_document` — the day changed while the publish was checked; nothing written","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"already_published":{"value":{"error":"already_published","message":"This day is already on the site. Nothing was changed."}},"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"422":{"description":"`incomplete_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"incomplete_day":{"value":{"error":"incomplete_day","message":"The trip keeps track of something this day says nothing about. `missing` names each one, how to send it, **and how to decline it** — `declined: { \"costs\": \"<reason>\" }` means there was none, with why. Ask the person; never invent a value to get past this."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/unpublish":{"post":{"summary":"Owner only: take a published day off the site. Reversible by publishing again.","responses":{"200":{"description":"off the site","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"status":{"type":"string","const":"draft"},"note":{"type":"string"}},"required":["ok","slug","status","note"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it; `out_of_scope` — a trip-scoped token cannot unpublish","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`already_draft`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"already_draft":{"value":{"error":"already_draft","message":"This day is not on the site, so there was nothing to take down. Nothing was changed — and if somebody asked you to take it down because they are worried about who saw it, say that it has not been up."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/send":{"post":{"summary":"Owner only: send (or resend) a published day by mail and/or WhatsApp. The one send door.","requestBody":{"description":"which channels to send on","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["mail","whatsapp"]}}},"required":["channels"],"additionalProperties":false}}}},"responses":{"200":{"description":"per-channel send summaries","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"mail":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"whatsapp":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["ok","slug"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"402":{"description":"`no_credits`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_credits":{"value":{"error":"no_credits","message":"This journal has no credits left for that."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it; `out_of_scope` — a trip-scoped token cannot send","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`not_published`; `test_content`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_published":{"value":{"error":"not_published","message":"This day is still a draft. Publish it before sending it to anybody."}},"test_content":{"value":{"error":"test_content","message":"This is content nobody lived — `test: true`. It cannot be sent to real people, which is the point of the flag."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/move":{"post":{"summary":"Move a day to a different date and/or a different trip, keeping its media the same print masters.","requestBody":{"description":"the destination trip and date","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"toTripId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["toTripId","date"],"additionalProperties":false}}}},"responses":{"200":{"description":"moved — GET the returned tripId/slug to see it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"tripId":{"type":"string"},"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"addressChanged":{"type":"boolean"},"dryRun":{"type":"boolean"}},"required":["ok","tripId","slug","addressChanged"],"additionalProperties":false}}}},"400":{"description":"`invalid_date`; `invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_date":{"value":{"error":"invalid_date","message":"A date is not a real calendar date, or `end` is before `start`. Dates are `2026-09-01`."}},"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`already_exists`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"already_exists":{"value":{"error":"already_exists","message":"A day already lives at the destination date and trip. Pick a different date, or move the other day out of the way first. Nothing was written."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/split":{"post":{"summary":"Split one day's update into two, on the same date. The prose is never cut automatically.","requestBody":{"description":"where to cut the photographs, and both halves' own words","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"photoCutIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"firstContent":{"type":"string"},"secondTitle":{"type":"string"},"secondContent":{"type":"string"},"secondTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["photoCutIndex","firstContent","secondTitle","secondContent"],"additionalProperties":false}}}},"responses":{"200":{"description":"split — GET secondSlug to see the new half, always a draft","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"firstSlug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"secondSlug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"dryRun":{"type":"boolean"}},"required":["ok","firstSlug","secondSlug"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`title_required`; `slug_taken`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"title_required":{"value":{"error":"title_required","message":"The second half of a split needs a real title — it becomes that half's own slug. Nothing was written."}},"slug_taken":{"value":{"error":"slug_taken","message":"The title given to the second half of a split makes a slug this trip already uses on that date. Pick a different title. Nothing was written."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/days/{slug}/merge":{"post":{"summary":"Join two updates on the same trip into one. Refused across trips.","requestBody":{"description":"the other update's own slug","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"withTripId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"withSlug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"}},"required":["withSlug"],"additionalProperties":false}}}},"responses":{"200":{"description":"merged — GET the returned slug to see it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"dryRun":{"type":"boolean"}},"required":["ok","slug"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"409":{"description":"`cross_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"cross_trip":{"value":{"error":"cross_trip","message":"Merge only joins two updates on the same trip — move one of them first if they need to end up together. Nothing was written."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(-[a-z0-9]+)*$"},"description":"The day's slug — `YYYY-MM-DD-something`. It is the day's filename, its address here, and the only identity it has; the date in it is the day's own date."}]},"/api/v2/{user}/trips/{trip}/costs/apply":{"post":{"summary":"Write agreed bank-statement rows onto the days they belong to — a row whose date has no day yet is filed to the trip's own costs.items instead, never dropped.","requestBody":{"description":"the rows a person agreed, from GET .../statements/{src}","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rows":{"minItems":1,"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"label":{"type":"string","minLength":1},"amount":{"type":"number","exclusiveMinimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"category":{"type":"string","enum":["preparation","flights","accommodation","food","transport","activities","other"]}},"required":["date","label","amount","currency","category"],"additionalProperties":false}},"statement":{"type":"string"}},"required":["rows"],"additionalProperties":false}}}},"responses":{"200":{"description":"how many rows landed on a day, and which dates were filed to the trip instead","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"written":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"slug":{"type":"string"},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"kept":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["date","slug","added","kept"],"additionalProperties":false}},"filedToTrip":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"rows":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["date","rows"],"additionalProperties":false}},"message":{"type":"string"},"next":{"type":"string"}},"required":["trip","total","written","filedToTrip","message"],"additionalProperties":false}}}},"400":{"description":"`invalid_costs`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_costs":{"value":{"error":"invalid_costs","message":"The budget or a cost line is not usable; `problems` lists each one."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/media":{"get":{"summary":"One trip's stored media, paged — send ?trip=.","responses":{"200":{"description":"one page of media items","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"kind":{"type":"string","enum":["photo","bank_export","gps_history","document"]},"trip":{"type":"string"},"day":{"type":"string"},"caption":{"type":"string"},"alt":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"url":{"type":"string"},"duplicateOf":{"type":"string"},"uploadedBy":{"type":"string"},"source":{"type":"string","enum":["web","api","helper","whatsapp","import","sync"]},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"takenAt":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"measuredFrom":{"type":"string","enum":["exif","probe"]}},"required":["src","kind","bytes"],"additionalProperties":false}},"next_cursor":{"type":"string"}},"required":["items"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"post":{"summary":"Upload bytes: JSON `{intent, url|inbox}` fetching/resolving the bytes, or `multipart/form-data` with `file` and `intent`. `intent.kind` is one of photo, bank_export, gps_history, document.","requestBody":{"description":"the JSON form's `intent` field — the multipart form carries the same shape as a form field","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["photo","bank_export","gps_history","document"]},"trip":{"type":"string","minLength":1},"day":{"type":"string","minLength":1},"caption":{"type":"string","minLength":1},"format":{"type":"string","minLength":1},"declined":{"type":"object","propertyNames":{"type":"string","enum":["trip","day","caption","format"]},"additionalProperties":{"type":"string","minLength":10}}},"required":["kind"],"additionalProperties":false}}}},"responses":{"201":{"description":"stored","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"src":{"type":"string"},"kind":{"type":"string","enum":["photo","bank_export","gps_history","document"]},"trip":{"type":"string"},"day":{"type":"string"},"caption":{"type":"string"},"alt":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"url":{"type":"string"},"duplicateOf":{"type":"string"},"uploadedBy":{"type":"string"},"source":{"type":"string","enum":["web","api","helper","whatsapp","import","sync"]},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"takenAt":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"measuredFrom":{"type":"string","enum":["exif","probe"]}},"required":["src","kind","bytes"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `expected_urls`; `unknown_inbox_file`; `could_not_fetch`; `expected_multipart`; `storage_full`; `invalid_media`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"expected_urls":{"value":{"error":"expected_urls","message":"The JSON form of this upload needs `url` (fetch a file from there) or `inbox` (a staged inbox file's id) — exactly one of the two. To send bytes instead, use multipart/form-data."}},"unknown_inbox_file":{"value":{"error":"unknown_inbox_file","message":"One of the `inbox` ids names nothing staged in this journal — or names something that is not a photograph. Nothing was written and nothing was taken out of the inbox; GET the inbox and send the ids it lists."}},"could_not_fetch":{"value":{"error":"could_not_fetch","message":"This server could not fetch one of the `urls`. https only, public hosts only, and it is refused after a redirect to a private address."}},"expected_multipart":{"value":{"error":"expected_multipart","message":"This content-type is not one this call takes: multipart/form-data for bytes, application/json for `urls`."}},"storage_full":{"value":{"error":"storage_full","message":"This journal has no room left for what you sent, and nothing was written. The message says how much it holds and how much it is allowed. Delete something, or the owner buys more room — an agent cannot."}},"invalid_media":{"value":{"error":"invalid_media","message":"The upload is not usable — a file this server does not take, one too large, or a `day` that is not a day of this trip. /api/health carries the formats and the limits."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`; `unknown_day`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}}}}}},"413":{"description":"`body_too_large`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"delete":{"summary":"Remove a stored media item by its src.","responses":{"200":{"description":"removed","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"src":{"type":"string"}},"required":["ok","src"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_media`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_media":{"value":{"error":"unknown_media","message":"One or more of `src` is not a photograph this day has. `problems` names each one; nothing was removed."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/trips/{trip}/media/duplicates":{"get":{"summary":"The same photograph, twice — reports only, never deletes.","responses":{"200":{"description":"groups of look-alike photographs, largest first","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"groups":{"type":"array","items":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"day":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["src","day","bytes"],"additionalProperties":false}}},"note":{"type":"string"}},"required":["ok","groups","note"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/gps/zones":{"get":{"summary":"The journal's private zones — a home, a place clipped out of every future track.","responses":{"200":{"description":"the zones, the decline flag, the limits, and an ETag — send it back as If-Match on PUT","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":80},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"radiusM":{"type":"number","minimum":50,"maximum":5000}},"required":["label","lat","lon","radiusM"],"additionalProperties":false}},"homeDeclined":{"type":"boolean"},"limits":{"type":"object","properties":{"maxZones":{"type":"number"},"radiusM":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false}},"required":["maxZones","radiusM"],"additionalProperties":false}},"required":["zones","homeDeclined","limits"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"500":{"description":"`unreadable_zones`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unreadable_zones":{"value":{"error":"unreadable_zones","message":"The private-zones file on disk could not be read as JSON. Refusing to answer rather than reporting fewer zones than are really there — an owner's front door on a public map is the wrong direction to fail in. This is a bug — report it rather than retrying."}}}}}}}},"put":{"summary":"Replace the zone list. Requires If-Match with the ETag GET last answered — refused without one, or with a stale one, as stale_document (409). Label a zone exactly \"home\" to arm the recorder's own gate (B2196/B2198).","requestBody":{"description":"the whole zone list, and optionally homeDeclined","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":80},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"radiusM":{"type":"number","minimum":50,"maximum":5000}},"required":["label","lat","lon","radiusM"],"additionalProperties":false}},"homeDeclined":{"type":"boolean"}},"required":["zones"],"additionalProperties":false}}}},"responses":{"200":{"description":"the zones, the decline flag, and the limits, as stored, with the new ETag","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":80},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"radiusM":{"type":"number","minimum":50,"maximum":5000}},"required":["label","lat","lon","radiusM"],"additionalProperties":false}},"homeDeclined":{"type":"boolean"},"limits":{"type":"object","properties":{"maxZones":{"type":"number"},"radiusM":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false}},"required":["maxZones","radiusM"],"additionalProperties":false}},"required":["zones","homeDeclined","limits"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`stale_document` — no If-Match, or one that does not cover the current ETag — carries the stored document","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"500":{"description":"`unreadable_zones`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unreadable_zones":{"value":{"error":"unreadable_zones","message":"The private-zones file on disk could not be read as JSON. Refusing to answer rather than reporting fewer zones than are really there — an owner's front door on a public map is the wrong direction to fail in. This is a bug — report it rather than retrying."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/inbox":{"get":{"summary":"Files staged with no trip/day yet, plus every photograph filed onto a trip with a declined day.","responses":{"200":{"description":"counts and items with no trip yet, by shelf; tripWaiting for the trip-scoped, still day-less kind","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"counts":{"type":"object","properties":{"media":{"type":"integer","minimum":0,"maximum":9007199254740991},"files":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["media","files"],"additionalProperties":false},"items":{"type":"object","properties":{"media":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"filename":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"stagedAt":{"type":"string"},"caption":{"type":"string"},"takenAt":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"measuredFrom":{"type":"string","enum":["exif","probe"]}},"required":["id","filename","bytes","stagedAt"],"additionalProperties":false}},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"filename":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"stagedAt":{"type":"string"},"caption":{"type":"string"},"takenAt":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"measuredFrom":{"type":"string","enum":["exif","probe"]}},"required":["id","filename","bytes","stagedAt"],"additionalProperties":false}}},"required":["media","files"],"additionalProperties":false},"tripWaiting":{"type":"array","items":{"type":"object","properties":{"trip":{"type":"string"},"file":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"stagedAt":{"type":"string"},"takenAt":{"type":"string"}},"required":["trip","file","bytes","stagedAt"],"additionalProperties":false}}},"required":["counts","items","tripWaiting"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/inbox/{id}":{"delete":{"summary":"Discard one staged file. No confirmation — nothing here has ever been on the site.","responses":{"200":{"description":"removed","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"id":{"type":"string"},"filename":{"type":"string"}},"required":["ok","id","filename"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `not_found`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/{user}/figures":{"get":{"summary":"Every figure in the journal's library, paged.","responses":{"200":{"description":"one page of figures","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"figures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string","minLength":1},"person":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"required":["id"],"additionalProperties":false}},"next_cursor":{"type":"string"}},"required":["figures"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/figures/{id}":{"get":{"summary":"One figure.","responses":{"200":{"description":"the figure","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string","minLength":1},"person":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"required":["id"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `not_found`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}}}},"put":{"summary":"Create a figure at a client-chosen id, or replace one (with a matching If-Match).","requestBody":{"description":"the whole figure document","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string","minLength":1},"person":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"replaced","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string","minLength":1},"person":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"required":["id"],"additionalProperties":false}}}},"201":{"description":"created","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string","minLength":1},"person":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"required":["id"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"delete":{"summary":"Delete a figure — refused while any trip or the journal's own default set still names it.","responses":{"200":{"description":"deleted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"string"},"dryRun":{"type":"boolean"}},"required":["deleted"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `not_found`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}},"409":{"description":"`figure_referenced`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"figure_referenced":{"value":{"error":"figure_referenced","message":"This figure is still named in the journal's own default figures, or a trip's figures — `message` lists which. Deleting it would leave a dangling reference, so nothing was deleted. Remove it from every set that names it first (PATCH the journal or the trip's figures), then delete it again."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/{user}/figures/presets":{"get":{"summary":"The whole vocabulary a figure may be described in, and starting points.","responses":{"200":{"description":"the vocabulary","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string"},"maxFigures":{"type":"number","const":10},"vocabulary":{"type":"object","properties":{"skin":{"type":"array","items":{"type":"string","enum":["light","light-medium","medium","medium-deep","deep","rich"]}},"hair":{"type":"array","items":{"type":"string","enum":["black","dark-brown","brown","auburn","red","blond","grey","white"]}},"eyes":{"type":"array","items":{"type":"string","enum":["brown","dark-brown","hazel","green","blue","grey"]}},"hairStyle":{"type":"array","items":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]}},"outfit":{"type":"array","items":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]}},"build":{"type":"array","items":{"type":"string","enum":["slight","average","broad"]}},"age":{"type":"array","items":{"type":"string","enum":["child","teen","adult","elder"]}},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}},"cloth":{"type":"array","items":{"type":"string","enum":["sky","coral","yellow","green","blue","slate","plum","sand","teal","rust","cream"]}}},"required":["skin","hair","eyes","hairStyle","outfit","build","age","accessories","cloth"],"additionalProperties":false},"fields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"example":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"hex":{"type":"string"},"preview":{"type":"string"},"startingPoints":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"resolve":{}},"required":["name","resolve"],"additionalProperties":false}},"note":{"type":"string"}},"required":["user","maxFigures","vocabulary","fields","example","hex","preview","startingPoints","note"],"additionalProperties":false}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/figures/preview":{"get":{"summary":"Draw one figure (?figure=) or a party (?party=) as an SVG, so a person can confirm it before it is written.","responses":{"200":{"description":"an SVG drawing","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"`nothing_to_draw`; `invalid_json`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"nothing_to_draw":{"value":{"error":"nothing_to_draw","message":"No figure to draw. Send `figure` or `party` as JSON."}},"invalid_json":{"value":{"error":"invalid_json","message":"The body did not parse as JSON. Check the content-type header and the quoting."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/trips/{trip}/travellers/from-photo":{"post":{"summary":"Read a party off a group photograph — proposed, never written. Multipart `photo`, or JSON `{inbox}`/`{gallery}`.","responses":{"200":{"description":"a proposed party, ordered left to right in the photograph","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"figures":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer","minimum":0,"maximum":9007199254740991},"figure":{"type":"object","properties":{"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"additionalProperties":false},"unanswerable":{"type":"array","items":{"type":"string"}}},"required":["position","figure","unanswerable"],"additionalProperties":false}},"party":{"type":"array","items":{"type":"object","properties":{"hairStyle":{"type":"string","enum":["buzz","short","tousled","long","curly","coils","braids","bun","ponytail","bald","headscarf"]},"outfit":{"type":"string","enum":["trousers","shorts","skirt","dress","robe"]},"build":{"type":"string","enum":["slight","average","broad"]},"age":{"type":"string","enum":["child","teen","adult","elder"]},"skin":{"type":"string","minLength":1},"hair":{"type":"string","minLength":1},"eyes":{"type":"string","minLength":1},"shirt":{"type":"string","minLength":1},"pants":{"type":"string","minLength":1},"pack":{"type":"string","minLength":1},"headscarf":{"type":"string","minLength":1},"accessories":{"type":"array","items":{"type":"string","enum":["glasses","sunglasses","hat","cap","beanie","scarf","camera","stick"]}}},"additionalProperties":false}},"preview":{"type":"string"},"spent":{"type":"number","const":2},"provider":{"type":"string","const":"Anthropic"},"note":{"type":"string"}},"required":["ok","figures","party","preview","spent","provider","note"],"additionalProperties":false}}}},"400":{"description":"`expected_photo`; `invalid_media`; `invalid_json`; `unknown_inbox_file`; `not_this_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"expected_photo":{"value":{"error":"expected_photo","message":"Name one photograph — multipart bytes under `photo`, or `inbox` or `gallery` in a JSON body."}},"invalid_media":{"value":{"error":"invalid_media","message":"The upload is not usable — a file this server does not take, one too large, or a `day` that is not a day of this trip. /api/health carries the formats and the limits."}},"invalid_json":{"value":{"error":"invalid_json","message":"The body did not parse as JSON. Check the content-type header and the quoting."}},"unknown_inbox_file":{"value":{"error":"unknown_inbox_file","message":"One of the `inbox` ids names nothing staged in this journal — or names something that is not a photograph. Nothing was written and nothing was taken out of the inbox; GET the inbox and send the ids it lists."}},"not_this_trip":{"value":{"error":"not_this_trip","message":"That `gallery` src is not a photograph on this trip's own media — either it names a different trip, or it does not exist. Give a src exactly as a day's gallery already carries it."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"402":{"description":"`no_credits`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_credits":{"value":{"error":"no_credits","message":"This journal has no credits left for that."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it; `consent_required`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}},"consent_required":{"value":{"error":"consent_required","message":"This journal has not agreed to send photographs to a model. That is asked for on the journal's own page, not by an agent — an owner has to say yes to this themselves."}}}}}},"404":{"description":"`unknown_trip`; `helper_unavailable`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"helper_unavailable":{"value":{"error":"helper_unavailable","message":"This journal has no model-backed features switched on. /api/health says which capabilities are on and why."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"502":{"description":"`model_failed`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"model_failed":{"value":{"error":"model_failed","message":"The model call failed. Nothing was written and any credit charged for it was refunded; retrying is reasonable."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/purchases":{"get":{"summary":"This journal's purchase history, paged.","responses":{"200":{"description":"one page of purchases","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"purchases":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceRappen":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"string"},"discount":{"type":"string"},"status":{"type":"string","enum":["pending","requested","paid","refunded"]},"method":{"anyOf":[{"type":"string","enum":["twint","card"]},{"type":"null"}]},"paymentUrl":{"type":["string","null"]},"mailedTo":{"type":"string"},"createdAt":{"type":"string"},"requestedAt":{"type":["string","null"]},"paidAt":{"type":["string","null"]}},"required":["id","credits","priceRappen","price","discount","status","method","paymentUrl","mailedTo","createdAt","requestedAt","paidAt"],"additionalProperties":false}},"next_cursor":{"type":["string","null"]}},"required":["purchases","next_cursor"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `credits_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"credits_disabled":{"value":{"error":"credits_disabled","message":"This server has credits off."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/purchases/{id}":{"get":{"summary":"One purchase.","responses":{"200":{"description":"the purchase","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceRappen":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"string"},"discount":{"type":"string"},"status":{"type":"string","enum":["pending","requested","paid","refunded"]},"method":{"anyOf":[{"type":"string","enum":["twint","card"]},{"type":"null"}]},"paymentUrl":{"type":["string","null"]},"mailedTo":{"type":"string"},"createdAt":{"type":"string"},"requestedAt":{"type":["string","null"]},"paidAt":{"type":["string","null"]}},"required":["id","credits","priceRappen","price","discount","status","method","paymentUrl","mailedTo","createdAt","requestedAt","paidAt"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `credits_disabled`; `unknown_payment`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"credits_disabled":{"value":{"error":"credits_disabled","message":"This server has credits off."}},"unknown_payment":{"value":{"error":"unknown_payment","message":"No payment of that id."}}}}}}}},"put":{"summary":"Propose buying credits at a client-chosen id. Files a pending transaction and mails the owner — grants nothing itself.","requestBody":{"description":"the amount of credits wanted","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"credits":{"type":"integer","minimum":10,"maximum":500}},"required":["credits"],"additionalProperties":false}}}},"responses":{"200":{"description":"the same id was already this exact amount — a no-op re-read","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceRappen":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"string"},"discount":{"type":"string"},"status":{"type":"string","enum":["pending","requested","paid","refunded"]},"method":{"anyOf":[{"type":"string","enum":["twint","card"]},{"type":"null"}]},"paymentUrl":{"type":["string","null"]},"mailedTo":{"type":"string"},"createdAt":{"type":"string"},"requestedAt":{"type":["string","null"]},"paidAt":{"type":["string","null"]}},"required":["id","credits","priceRappen","price","discount","status","method","paymentUrl","mailedTo","createdAt","requestedAt","paidAt"],"additionalProperties":false}}}},"201":{"description":"created; mail sent","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceRappen":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"string"},"discount":{"type":"string"},"status":{"type":"string","enum":["pending","requested","paid","refunded"]},"method":{"anyOf":[{"type":"string","enum":["twint","card"]},{"type":"null"}]},"paymentUrl":{"type":["string","null"]},"mailedTo":{"type":"string"},"createdAt":{"type":"string"},"requestedAt":{"type":["string","null"]},"paidAt":{"type":["string","null"]}},"required":["id","credits","priceRappen","price","discount","status","method","paymentUrl","mailedTo","createdAt","requestedAt","paidAt"],"additionalProperties":false}}}},"400":{"description":"`invalid_amount`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_amount":{"value":{"error":"invalid_amount","message":"Not a number of credits this server sells — out of range, not a whole number, or off the step. The refusal names the three bounds."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `credits_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"credits_disabled":{"value":{"error":"credits_disabled","message":"This server has credits off."}}}}}},"409":{"description":"`no_owner_address`; `conflict` — the id exists with a different amount","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_owner_address":{"value":{"error":"no_owner_address","message":"This journal's config.json has no owner address, and this call has to mail somebody. That is an edit to the file."}},"conflict":{"value":{"error":"conflict","message":"That id is already in use for something else — a different amount, or another journal's own purchase. Nothing was written. `details.current` carries the stored document when it is yours to see; pick a different id."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"503":{"description":"`no_database`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_database":{"value":{"error":"no_database","message":"This capability stores data and this server has no database configured."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/{user}/credits/ledger":{"get":{"summary":"This journal's credit ledger, paged.","responses":{"200":{"description":"one page of ledger rows","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ledger":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"delta":{"type":"number"},"reason":{"type":"string","enum":["grant","day_mail","day_whatsapp","digest","postcard","photobook","photobook_print","storage","helper","transcription","ask_thread","find_in_journal","travellers_from_photo","invite","day_sms","refund","purchase_refund"]},"ref":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","delta","reason","ref","note","createdAt"],"additionalProperties":false}},"next_cursor":{"type":["string","null"]}},"required":["ledger","next_cursor"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `credits_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"credits_disabled":{"value":{"error":"credits_disabled","message":"This server has credits off."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/contacts/import":{"post":{"summary":"File many pending contacts at once, from rows a person already agreed.","requestBody":{"description":"{rows: [{name, email, tel?}, ...]}","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rows":{"minItems":1,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"required":["rows"],"additionalProperties":false}}}},"responses":{"200":{"description":"per-row outcomes","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"filed":{"type":"integer","minimum":0,"maximum":9007199254740991},"invalid":{"type":"integer","minimum":0,"maximum":9007199254740991},"results":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"next":{"type":"string"}},"required":["filed","invalid","results","next"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`contacts_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"contacts_disabled":{"value":{"error":"contacts_disabled","message":"This server has contacts off, so invitations and approvals are unavailable."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/contacts/self":{"post":{"summary":"Add the owner as their own contact, from this journal's own config.json.","responses":{"200":{"description":"added, or already present","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"contact":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"locale":{"type":["string","null"]},"status":{"type":"string","enum":["pending","active","blocked"]},"hasPostalAddress":{"type":"boolean"},"createdVia":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"confirmedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"approvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"lastSeenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"relationship":{"anyOf":[{"type":"object","properties":{"owner":{"type":"boolean"},"guest":{"type":"boolean"},"buddyOf":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"],"additionalProperties":false}}},"required":["owner","guest","buddyOf"],"additionalProperties":false},{"type":"null"}]},"pendingTrips":{"type":"array","items":{"type":"string"}}},"required":["id","name","locale","status","hasPostalAddress","createdVia","createdAt","confirmedAt","approvedAt","lastSeenAt","relationship","pendingTrips"],"additionalProperties":false},"dryRun":{"type":"boolean"}},"required":["ok"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}},"409":{"description":"`contacts_disabled`; `invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"contacts_disabled":{"value":{"error":"contacts_disabled","message":"This server has contacts off, so invitations and approvals are unavailable."}},"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/statements/{src}":{"get":{"summary":"Read a staged bank export as a report — writes nothing.","responses":{"200":{"description":"merchants, payments and rates","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"src":{"type":"string"},"trip":{"type":"string"},"dateRange":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"to":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]}},"required":["from","to"],"additionalProperties":false},"merchants":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"total":{"type":"number"},"currency":{"type":"string"},"count":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["name","total","currency","count"],"additionalProperties":false}},"payments":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"label":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"},"merchant":{"type":"string"}},"required":["date","label","amount","currency","merchant"],"additionalProperties":false}},"rates":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}}},"required":["src","dateRange","merchants","payments","rates"],"additionalProperties":false}}}},"400":{"description":"`unreadable_statement`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unreadable_statement":{"value":{"error":"unreadable_statement","message":"The bytes at that `src` could not be read as a bank statement by any known importer. `problems` says what came out and why it does not hold up."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`no_such_journal`; `unknown_statement`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_statement":{"value":{"error":"unknown_statement","message":"No media item of that `src`, or it is not a `bank_export` — send the `src` a `POST .../media` upload with `intent.kind: \"bank_export\"` answered with."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"src","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"A stored media item's `src`, exactly as a day or the media list gives it — `/media/<trip>/<day>/<name>`. URL-encode it: it contains slashes."}]},"/api/v2/{user}/postcards/recipients":{"get":{"summary":"Who a postcard may be addressed to — a name, town and country, never a street.","responses":{"200":{"description":"eligible recipients","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"creditsEach":{"type":"number","const":20},"recipients":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"name":{"type":"string"},"city":{"type":"string"},"country":{"type":["string","null"]},"locale":{"type":["string","null"]}},"required":["contactId","name","city","country","locale"],"additionalProperties":false}},"note":{"type":"string"}},"required":["creditsEach","recipients"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`postcards_disabled`; `no_such_journal`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"postcards_disabled":{"value":{"error":"postcards_disabled","message":"This server has postcards off."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/postcards/texts":{"get":{"summary":"Prefill material for a card's message — every day's opening line, per locale. Send ?trip=.","responses":{"200":{"description":"opening lines by day and locale","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"writtenLocale":{"type":"string"},"locales":{"type":"array","items":{"type":"string"}},"days":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"date":{"type":"string"},"title":{"type":"string"},"texts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["slug","date","title","texts"],"additionalProperties":false}}},"required":["trip","writtenLocale","locales","days"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`postcards_disabled`; `no_such_journal`; `unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"postcards_disabled":{"value":{"error":"postcards_disabled","message":"This server has postcards off."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/v2/{user}/postcards/orders/{id}":{"get":{"summary":"One postcard order.","responses":{"200":{"description":"the order","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"anyOf":[{"type":"object","properties":{"trip":{"type":"string","minLength":1},"day":{"type":"string","minLength":1},"photo":{"type":"string","minLength":1}},"required":["trip","day","photo"],"additionalProperties":false},{"type":"object","properties":{"inbox":{"type":"string","minLength":1}},"required":["inbox"],"additionalProperties":false}]},"message":{"type":"string","minLength":1,"maxLength":600},"from":{"type":"string","minLength":1,"maxLength":120},"recipients":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string","minLength":1}},"locale":{"type":"string","minLength":1},"crop":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"zoom":{"type":"number","minimum":1}},"required":["x","y"],"additionalProperties":false},"figures":{"type":"boolean"},"id":{"type":"string"},"status":{"type":"string","enum":["draft","expired","submitted","built","failed"]},"url":{"type":"string"},"credits":{"type":"object","properties":{"each":{"type":"number"},"total":{"type":"number"},"balance":{"type":["number","null"]}},"required":["each","total","balance"],"additionalProperties":false},"expiresAt":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"results":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"},"providerStatus":{"type":"string"}},"required":["contactId","ok"],"additionalProperties":false}}},"required":["source","message","from","recipients","id","status","url","credits","expiresAt","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`postcards_disabled`; `contacts_disabled`; `no_such_journal`; `unknown_order`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"postcards_disabled":{"value":{"error":"postcards_disabled","message":"This server has postcards off."}},"contacts_disabled":{"value":{"error":"contacts_disabled","message":"This server has contacts off, so invitations and approvals are unavailable."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_order":{"value":{"error":"unknown_order","message":"No order of that id — a postcard order or a photobook order, whichever this route deals in."}}}}}}}},"put":{"summary":"Propose a postcard order at a client-chosen id. Charges nothing and prints nothing — the owner presses Send.","requestBody":{"description":"the whole order proposal","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"anyOf":[{"type":"object","properties":{"trip":{"type":"string","minLength":1},"day":{"type":"string","minLength":1},"photo":{"type":"string","minLength":1}},"required":["trip","day","photo"],"additionalProperties":false},{"type":"object","properties":{"inbox":{"type":"string","minLength":1}},"required":["inbox"],"additionalProperties":false}]},"message":{"type":"string","minLength":1,"maxLength":600},"from":{"type":"string","minLength":1,"maxLength":120},"recipients":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string","minLength":1}},"locale":{"type":"string","minLength":1},"crop":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"zoom":{"type":"number","minimum":1}},"required":["x","y"],"additionalProperties":false},"figures":{"type":"boolean"}},"required":["source","message","from","recipients"],"additionalProperties":false}}}},"responses":{"200":{"description":"the id already exists — echoed back, nothing rewritable through this door","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"anyOf":[{"type":"object","properties":{"trip":{"type":"string","minLength":1},"day":{"type":"string","minLength":1},"photo":{"type":"string","minLength":1}},"required":["trip","day","photo"],"additionalProperties":false},{"type":"object","properties":{"inbox":{"type":"string","minLength":1}},"required":["inbox"],"additionalProperties":false}]},"message":{"type":"string","minLength":1,"maxLength":600},"from":{"type":"string","minLength":1,"maxLength":120},"recipients":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string","minLength":1}},"locale":{"type":"string","minLength":1},"crop":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"zoom":{"type":"number","minimum":1}},"required":["x","y"],"additionalProperties":false},"figures":{"type":"boolean"},"id":{"type":"string"},"status":{"type":"string","enum":["draft","expired","submitted","built","failed"]},"url":{"type":"string"},"credits":{"type":"object","properties":{"each":{"type":"number"},"total":{"type":"number"},"balance":{"type":["number","null"]}},"required":["each","total","balance"],"additionalProperties":false},"expiresAt":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"results":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"},"providerStatus":{"type":"string"}},"required":["contactId","ok"],"additionalProperties":false}}},"required":["source","message","from","recipients","id","status","url","credits","expiresAt","createdAt","updatedAt"],"additionalProperties":false}}}},"201":{"description":"proposed","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"anyOf":[{"type":"object","properties":{"trip":{"type":"string","minLength":1},"day":{"type":"string","minLength":1},"photo":{"type":"string","minLength":1}},"required":["trip","day","photo"],"additionalProperties":false},{"type":"object","properties":{"inbox":{"type":"string","minLength":1}},"required":["inbox"],"additionalProperties":false}]},"message":{"type":"string","minLength":1,"maxLength":600},"from":{"type":"string","minLength":1,"maxLength":120},"recipients":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string","minLength":1}},"locale":{"type":"string","minLength":1},"crop":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"zoom":{"type":"number","minimum":1}},"required":["x","y"],"additionalProperties":false},"figures":{"type":"boolean"},"id":{"type":"string"},"status":{"type":"string","enum":["draft","expired","submitted","built","failed"]},"url":{"type":"string"},"credits":{"type":"object","properties":{"each":{"type":"number"},"total":{"type":"number"},"balance":{"type":["number","null"]}},"required":["each","total","balance"],"additionalProperties":false},"expiresAt":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"results":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string"},"providerStatus":{"type":"string"}},"required":["contactId","ok"],"additionalProperties":false}}},"required":["source","message","from","recipients","id","status","url","credits","expiresAt","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`; `test_content`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"test_content":{"value":{"error":"test_content","message":"This is content nobody lived — `test: true`. It cannot be sent to real people, which is the point of the flag."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`postcards_disabled`; `contacts_disabled`; `no_such_journal`; `unknown_photo`; `unknown_trip`; `unknown_day`; `unknown_recipient`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"postcards_disabled":{"value":{"error":"postcards_disabled","message":"This server has postcards off."}},"contacts_disabled":{"value":{"error":"contacts_disabled","message":"This server has contacts off, so invitations and approvals are unavailable."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_photo":{"value":{"error":"unknown_photo","message":"That photo is not a file in the named trip's media, and not a photograph staged in this journal's inbox. Give a `src` a trip's own media already carries, or an id GET .../inbox answered with."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"unknown_day":{"value":{"error":"unknown_day","message":"No day of that slug in this trip. The slug is not derived from anything — it is whatever the caller who created the day chose, forever; GET the days list to see them."}},"unknown_recipient":{"value":{"error":"unknown_recipient","message":"One or more of `recipients` is not a contact id this journal may post to — not an approved contact who asked for a real postcard and left an address. `details.unknown` names which. Nothing was written. GET .../postcards/recipients for the ones that are."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"503":{"description":"`no_database`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_database":{"value":{"error":"no_database","message":"This capability stores data and this server has no database configured."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/{user}/photobooks/drafts/{trip}":{"get":{"summary":"One trip's photobook arrangement, whole — every option, and the limits each is checked against.","responses":{"200":{"description":"the arrangement as stored","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"options":{"type":"object","properties":{"size":{"type":"string","enum":["pocket","square","portrait","large-square"]},"coverType":{"type":"string","enum":["soft","hard"]},"locale":{"type":"string"},"excludePhotos":{"maxItems":20000,"type":"array","items":{"type":"string","maxLength":300}},"days":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"photos":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"keep":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"layout":{"type":"string","enum":["auto","hero","single","pair","grid","text"]},"hero":{"type":"string","maxLength":300},"runOn":{"type":"boolean"},"excluded":{"type":"boolean"},"text":{"type":"boolean"},"textForm":{"type":"string","enum":["runon-auto","textpage"]}},"additionalProperties":false}},"includeText":{"type":"boolean"},"includeMap":{"type":"boolean"},"mapStyle":{"type":"string","enum":["auto","closeup","numbered","chapters","countries","strip"]},"mapPlaces":{"type":"boolean"},"mapTerrain":{"type":"boolean"},"includeChapters":{"type":"boolean"},"includeNames":{"type":"boolean"},"includeFollowers":{"type":"boolean"},"includeTransport":{"type":"boolean"},"includeCosts":{"type":"boolean"},"includeCharts":{"type":"boolean"},"photoBudget":{"type":"string","enum":["highlights","balanced","comprehensive"]},"includeFigureMarks":{"type":"boolean"},"includeVehicles":{"type":"boolean"},"cover":{"type":"string","maxLength":300},"spineText":{"type":"string","maxLength":60},"focalPoints":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"],"additionalProperties":false}},"titleStyle":{"type":"string","enum":["journal","magazine","window","tone","places","fullbleed","map","grid"]},"introOnTitle":{"type":"boolean"},"titlePhoto":{"type":"string","maxLength":300},"titlePhotos":{"maxItems":4,"type":"array","items":{"type":"string","maxLength":300}},"chapterStyle":{"type":"string","enum":["stats","typeonly","fullbleed","map"]},"backStyle":{"type":"string","enum":["route","photo","mosaic","quiet"]},"backPhoto":{"type":"string","maxLength":300}},"additionalProperties":false},"url":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"limits":{"type":"object","properties":{"days":{"type":"number","const":2000},"photosPerDay":{"type":"number","const":500},"excludePhotos":{"type":"number","const":20000},"focalPoints":{"type":"number","const":20000},"srcLength":{"type":"number","const":300},"titlePhotos":{"type":"number","const":4},"spineText":{"type":"number","const":60}},"required":["days","photosPerDay","excludePhotos","focalPoints","srcLength","titlePhotos","spineText"],"additionalProperties":false}},"required":["trip","options","url","createdAt","updatedAt","limits"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`photobook_disabled`; `no_such_journal`; `unknown_trip`; `not_found`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"photobook_disabled":{"value":{"error":"photobook_disabled","message":"This journal does not have photobooks switched on. /api/health says which capabilities are on and why."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}},"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}}}},"put":{"summary":"Arrange a book. Fields sent land on top of what is stored, or on the defaults; the whole arrangement comes back. Charges nothing, builds nothing, prints nothing — the owner opens `url` to price and buy it.","requestBody":{"description":"the options to set","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"options":{"type":"object","properties":{"size":{"type":"string","enum":["pocket","square","portrait","large-square"]},"coverType":{"type":"string","enum":["soft","hard"]},"locale":{"type":"string"},"excludePhotos":{"maxItems":20000,"type":"array","items":{"type":"string","maxLength":300}},"days":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"photos":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"keep":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"layout":{"type":"string","enum":["auto","hero","single","pair","grid","text"]},"hero":{"type":"string","maxLength":300},"runOn":{"type":"boolean"},"excluded":{"type":"boolean"},"text":{"type":"boolean"},"textForm":{"type":"string","enum":["runon-auto","textpage"]}},"additionalProperties":false}},"includeText":{"type":"boolean"},"includeMap":{"type":"boolean"},"mapStyle":{"type":"string","enum":["auto","closeup","numbered","chapters","countries","strip"]},"mapPlaces":{"type":"boolean"},"mapTerrain":{"type":"boolean"},"includeChapters":{"type":"boolean"},"includeNames":{"type":"boolean"},"includeFollowers":{"type":"boolean"},"includeTransport":{"type":"boolean"},"includeCosts":{"type":"boolean"},"includeCharts":{"type":"boolean"},"photoBudget":{"type":"string","enum":["highlights","balanced","comprehensive"]},"includeFigureMarks":{"type":"boolean"},"includeVehicles":{"type":"boolean"},"cover":{"type":"string","maxLength":300},"spineText":{"type":"string","maxLength":60},"focalPoints":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"],"additionalProperties":false}},"titleStyle":{"type":"string","enum":["journal","magazine","window","tone","places","fullbleed","map","grid"]},"introOnTitle":{"type":"boolean"},"titlePhoto":{"type":"string","maxLength":300},"titlePhotos":{"maxItems":4,"type":"array","items":{"type":"string","maxLength":300}},"chapterStyle":{"type":"string","enum":["stats","typeonly","fullbleed","map"]},"backStyle":{"type":"string","enum":["route","photo","mosaic","quiet"]},"backPhoto":{"type":"string","maxLength":300}},"additionalProperties":false}},"required":["options"],"additionalProperties":false}}}},"responses":{"200":{"description":"the arrangement, merged and stored","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"options":{"type":"object","properties":{"size":{"type":"string","enum":["pocket","square","portrait","large-square"]},"coverType":{"type":"string","enum":["soft","hard"]},"locale":{"type":"string"},"excludePhotos":{"maxItems":20000,"type":"array","items":{"type":"string","maxLength":300}},"days":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"photos":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"keep":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"layout":{"type":"string","enum":["auto","hero","single","pair","grid","text"]},"hero":{"type":"string","maxLength":300},"runOn":{"type":"boolean"},"excluded":{"type":"boolean"},"text":{"type":"boolean"},"textForm":{"type":"string","enum":["runon-auto","textpage"]}},"additionalProperties":false}},"includeText":{"type":"boolean"},"includeMap":{"type":"boolean"},"mapStyle":{"type":"string","enum":["auto","closeup","numbered","chapters","countries","strip"]},"mapPlaces":{"type":"boolean"},"mapTerrain":{"type":"boolean"},"includeChapters":{"type":"boolean"},"includeNames":{"type":"boolean"},"includeFollowers":{"type":"boolean"},"includeTransport":{"type":"boolean"},"includeCosts":{"type":"boolean"},"includeCharts":{"type":"boolean"},"photoBudget":{"type":"string","enum":["highlights","balanced","comprehensive"]},"includeFigureMarks":{"type":"boolean"},"includeVehicles":{"type":"boolean"},"cover":{"type":"string","maxLength":300},"spineText":{"type":"string","maxLength":60},"focalPoints":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"],"additionalProperties":false}},"titleStyle":{"type":"string","enum":["journal","magazine","window","tone","places","fullbleed","map","grid"]},"introOnTitle":{"type":"boolean"},"titlePhoto":{"type":"string","maxLength":300},"titlePhotos":{"maxItems":4,"type":"array","items":{"type":"string","maxLength":300}},"chapterStyle":{"type":"string","enum":["stats","typeonly","fullbleed","map"]},"backStyle":{"type":"string","enum":["route","photo","mosaic","quiet"]},"backPhoto":{"type":"string","maxLength":300}},"additionalProperties":false},"url":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"limits":{"type":"object","properties":{"days":{"type":"number","const":2000},"photosPerDay":{"type":"number","const":500},"excludePhotos":{"type":"number","const":20000},"focalPoints":{"type":"number","const":20000},"srcLength":{"type":"number","const":300},"titlePhotos":{"type":"number","const":4},"spineText":{"type":"number","const":60}},"required":["days","photosPerDay","excludePhotos","focalPoints","srcLength","titlePhotos","spineText"],"additionalProperties":false}},"required":["trip","options","url","createdAt","updatedAt","limits"],"additionalProperties":false}}}},"201":{"description":"the first arrangement for this trip","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"string"},"options":{"type":"object","properties":{"size":{"type":"string","enum":["pocket","square","portrait","large-square"]},"coverType":{"type":"string","enum":["soft","hard"]},"locale":{"type":"string"},"excludePhotos":{"maxItems":20000,"type":"array","items":{"type":"string","maxLength":300}},"days":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"photos":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"keep":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":300}},"layout":{"type":"string","enum":["auto","hero","single","pair","grid","text"]},"hero":{"type":"string","maxLength":300},"runOn":{"type":"boolean"},"excluded":{"type":"boolean"},"text":{"type":"boolean"},"textForm":{"type":"string","enum":["runon-auto","textpage"]}},"additionalProperties":false}},"includeText":{"type":"boolean"},"includeMap":{"type":"boolean"},"mapStyle":{"type":"string","enum":["auto","closeup","numbered","chapters","countries","strip"]},"mapPlaces":{"type":"boolean"},"mapTerrain":{"type":"boolean"},"includeChapters":{"type":"boolean"},"includeNames":{"type":"boolean"},"includeFollowers":{"type":"boolean"},"includeTransport":{"type":"boolean"},"includeCosts":{"type":"boolean"},"includeCharts":{"type":"boolean"},"photoBudget":{"type":"string","enum":["highlights","balanced","comprehensive"]},"includeFigureMarks":{"type":"boolean"},"includeVehicles":{"type":"boolean"},"cover":{"type":"string","maxLength":300},"spineText":{"type":"string","maxLength":60},"focalPoints":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"],"additionalProperties":false}},"titleStyle":{"type":"string","enum":["journal","magazine","window","tone","places","fullbleed","map","grid"]},"introOnTitle":{"type":"boolean"},"titlePhoto":{"type":"string","maxLength":300},"titlePhotos":{"maxItems":4,"type":"array","items":{"type":"string","maxLength":300}},"chapterStyle":{"type":"string","enum":["stats","typeonly","fullbleed","map"]},"backStyle":{"type":"string","enum":["route","photo","mosaic","quiet"]},"backPhoto":{"type":"string","maxLength":300}},"additionalProperties":false},"url":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"limits":{"type":"object","properties":{"days":{"type":"number","const":2000},"photosPerDay":{"type":"number","const":500},"excludePhotos":{"type":"number","const":20000},"focalPoints":{"type":"number","const":20000},"srcLength":{"type":"number","const":300},"titlePhotos":{"type":"number","const":4},"spineText":{"type":"number","const":60}},"required":["days","photosPerDay","excludePhotos","focalPoints","srcLength","titlePhotos","spineText"],"additionalProperties":false}},"required":["trip","options","url","createdAt","updatedAt","limits"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`photobook_disabled`; `no_such_journal`; `unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"photobook_disabled":{"value":{"error":"photobook_disabled","message":"This journal does not have photobooks switched on. /api/health says which capabilities are on and why."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}},"409":{"description":"`stale_document`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"stale_document":{"value":{"error":"stale_document","message":"The document you wrote against has moved on — either it changed since you last read it and your `If-Match` no longer covers the current version, or you PUT a client-chosen id that already exists with no `If-Match` at all (a client-chosen-id create refuses to silently overwrite what is already there). `details` is the document exactly as it stands now, not wrapped in another field: read it, and send `If-Match` with its ETag if you still mean to write."}}}}}},"413":{"description":"`body_too_large` — the JSON body is over limits.jsonBodyMaxBytes (4194304 bytes) at GET /api/v2/status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"body_too_large":{"value":{"error":"body_too_large","message":"The request is over this server's limit. /api/health says what it is; send the files in smaller batches."}}}}}},"503":{"description":"`no_database`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_database":{"value":{"error":"no_database","message":"This capability stores data and this server has no database configured."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/photobooks/orders/{id}":{"get":{"summary":"One photobook order. Read-only — building and paying for a book is browser-only.","responses":{"200":{"description":"the order","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"trip":{"type":"string"},"size":{"type":"string","enum":["pocket","square","portrait","large-square"]},"coverType":{"type":"string","enum":["soft","hard"]},"pages":{"type":"integer","minimum":0,"maximum":9007199254740991},"volumes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"credits":{"type":"integer","minimum":0,"maximum":9007199254740991},"files":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"print":{"type":"object","properties":{"contactId":{"type":"string"},"quotedCredits":{"type":"number"},"quotedAt":{"type":"string"},"shipmentMethodUid":{"type":"string"},"providerRef":{"type":"string"},"failure":{"type":"string"}},"required":["contactId","quotedCredits","quotedAt","shipmentMethodUid"],"additionalProperties":false}},"required":["id","status","trip","size","coverType","pages","volumes","credits","files","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`photobook_disabled`; `no_such_journal`; `unknown_order`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"photobook_disabled":{"value":{"error":"photobook_disabled","message":"This journal does not have photobooks switched on. /api/health says which capabilities are on and why."}},"no_such_journal":{"value":{"error":"no_such_journal","message":"No journal of that name on this server. Check the username; /documentation.txt lists the ones this instance advertises."}},"unknown_order":{"value":{"error":"unknown_order","message":"No order of that id — a postcard order or a photobook order, whichever this route deals in."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The id of the thing this path addresses — a figure, an invite, a contact, an order, a credential. Client-chosen where the door creates at a client-chosen id, server-issued otherwise; either way it comes back in the answer that made it."}]},"/api/v2/{user}/trips/{trip}/track":{"post":{"summary":"Draw this trip's line from the imported location history — owner only.","responses":{"200":{"description":"segments, points and how many private zones were cut out. `written: false` means nothing was stored for these dates, and any existing line was left alone","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"written":{"type":"boolean"},"segments":{"type":"integer","minimum":0,"maximum":9007199254740991},"points":{"type":"integer","minimum":0,"maximum":9007199254740991},"zones":{"type":"integer","minimum":0,"maximum":9007199254740991},"trip":{"type":"string"},"message":{"type":"string"},"next":{"type":"string"}},"required":["written","segments","points","zones","trip","message"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_token`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`out_of_scope` — the token is for a different journal or trip; `forbidden` — this call is the journal owner's; a trip-scoped token cannot do it","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"out_of_scope":{"value":{"error":"out_of_scope","message":"The token is valid, and it belongs to a different journal or a different trip than the one in the URL. Do not retry: ask for a token for this journal."}},"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_trip`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_trip":{"value":{"error":"unknown_trip","message":"No trip of that id in this journal — or none this token may write to. The two answer alike on purpose, so this cannot be used to ask which trips exist. GET the trips list first."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"trip","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"description":"The trip's id, chosen by the client that created it and never writable afterwards: it is the trip's folder name and the URL people share."}]},"/api/v2/{user}/deletions/{token}":{"post":{"summary":"Confirm a deletion — the button on the mailed page, never something an agent calls.","responses":{"200":{"description":"deleted","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"deleted":{"type":"boolean","const":true},"kind":{"type":"string","enum":["journal","trip"]},"user":{"type":"string"},"trip":{"type":"string"},"title":{"type":"string"}},"required":["ok","deleted","kind","user","title"],"additionalProperties":false}}}},"404":{"description":"`not_found` — no such token for this journal","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}},"409":{"description":"`deletion_link_used`; `deletion_link_expired`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"deletion_link_used":{"value":{"error":"deletion_link_used","message":"This deletion link has already been used. It cannot be used again; the confirmation page names what actually happened."}},"deletion_link_expired":{"value":{"error":"deletion_link_expired","message":"This deletion link is older than its own TTL. Ask the owner's page to send the deletion mail again."}}}}}},"410":{"description":"`gone` — what it pointed at has already gone","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"gone":{"value":{"error":"gone","message":"This journal or trip was deleted. Its name stays reserved and its old URLs answer 410 rather than 404, so this is not a typo — it is a thing that used to be here."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."},{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"The single-use confirmation token from the deletion mail. A person receives it by email and it lasts an hour; nothing an agent can mint, guess or be given, which is the whole point — the first call only asks for the mail to be sent, and this is the second, human half."}]},"/api/auth/codes":{"post":{"summary":"Ask for a one-time code — one door for four credentials.","requestBody":{"description":"`for` is which credential the code redeems into: read, write, identity, signup. \"read\"/\"write\" need `user`; \"identity\"/\"signup\" refuse it. `scope.trip` is only meaningful with `for: \"write\"`. Always answers 202 whether or not the address owns anything, so this cannot be used to discover which addresses exist — the one exception is `for: \"write\"` to an address that owns nothing and is on no named trip, which answers 403 rather than leaving you waiting for a code that never comes. A new request invalidates the previous code. `phone` instead of `email` (B2294) is a guest's mobile number, any country: `for: \"read\"` only, no `channel`, delivered by SMS and only to a sign-in number of a contact the owner added or let in (one the owner typed, or proved by an earlier code) — every other number gets the same 202 and no text. At most 3 texts per number an hour.","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string"},"phone":{"type":"string"},"for":{"type":"string","enum":["read","write","identity","signup"]},"user":{"type":"string"},"scope":{"type":"object","properties":{"trip":{"type":"string"}},"required":["trip"],"additionalProperties":false},"channel":{"type":"string","enum":["mail"]},"destination":{"type":"string"},"locale":{"type":"string"}},"required":["for"],"additionalProperties":false}}}},"responses":{"202":{"description":"accepted — always, whatever the address","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","const":"accepted"},"next":{"type":"string"}},"required":["status","next"],"additionalProperties":false}}}},"400":{"description":"`invalid_request` — a shape rule, never address-dependent; `invalid_email`; `sms_unreachable` — `phone` in a country this server's SMS number cannot reach","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"invalid_email":{"value":{"error":"invalid_email","message":"That is not an address this server can send to."}},"sms_unreachable":{"value":{"error":"sms_unreachable","message":"This server's SMS number cannot reach that number's country — the `message` names the restriction. Use the WhatsApp confirmation instead; nothing was sent and nothing was spent."}}}}}},"403":{"description":"`not_authorised` — for: \"write\" to an address that owns nothing and is on no named trip; `signup_not_invited`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_authorised":{"value":{"error":"not_authorised","message":"This credential cannot do this. Read /documentation.txt on which credential each door takes."}},"signup_not_invited":{"value":{"error":"signup_not_invited","message":"This instance is invite-only: only addresses its operator has named can make a journal here. Nothing has been sent to this address. Ask the person who runs it to add you, then start again."}}}}}},"404":{"description":"`signup_disabled`; `auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_disabled":{"value":{"error":"signup_disabled","message":"This server does not take new journals."}},"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}},"429":{"description":"`too_many_requests` — narrower for write than for read","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"503":{"description":"`mail_disabled` — nothing issued; any code already held is still live; `sms_disabled` — `phone` asked for, and this server sends no SMS; `mail_failed`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"mail_disabled":{"value":{"error":"mail_disabled","message":"This server cannot send mail, so anything that would have been mailed has not been."}},"sms_disabled":{"value":{"error":"sms_disabled","message":"This server cannot send SMS. Use the WhatsApp confirmation instead; nothing was issued."}},"mail_failed":{"value":{"error":"mail_failed","message":"The mail could not be sent. Nothing else about the call failed; tell the person, and do not retry in a loop."}}}}}}}}},"/api/auth/codes/redeem":{"post":{"summary":"Spend a code — one door for four credentials.","requestBody":{"description":"`code` is six digits, 30 minutes, single use. \"read\"/\"identity\" set a cookie and put no token in the body; \"write\"/\"signup\" return the token in the body and set no cookie, since the caller is a program with no cookie jar. A wrong code, an expired one, a burned one, the wrong `for`, or a `scope.trip` that does not match the code's own trip all answer the identical `invalid_code`. A code texted to a `phone` is redeemed with that `phone` and `for: \"read\"`.","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string"},"phone":{"type":"string"},"code":{"type":"string"},"for":{"type":"string","enum":["read","write","identity","signup"]},"user":{"type":"string"},"scope":{"type":"object","properties":{"trip":{"type":"string"}},"required":["trip"],"additionalProperties":false}},"required":["code","for"],"additionalProperties":false}}}},"responses":{"200":{"description":"cookie response for \"read\"/\"identity\", token response for \"write\"/\"signup\"","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"expires":{"type":"string"},"scope":{"type":"string","enum":["read","identity"]}},"required":["ok","expires","scope"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"token":{"type":"string"},"expires":{"type":"string"},"scope":{"type":"string","enum":["write","signup"]},"user":{"type":"string"}},"required":["ok","token","expires","scope"],"additionalProperties":false}]}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`invalid_code` — wrong, expired, burned, or the wrong `for`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_code":{"value":{"error":"invalid_code","message":"The six-digit code is wrong, used, or more than 30 minutes old. Ask for a new one; the newest is the only live one."}}}}}},"403":{"description":"`signup_not_invited` — the code is not spent","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_not_invited":{"value":{"error":"signup_not_invited","message":"This instance is invite-only: only addresses its operator has named can make a journal here. Nothing has been sent to this address. Ask the person who runs it to add you, then start again."}}}}}},"404":{"description":"`signup_disabled`; `auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_disabled":{"value":{"error":"signup_disabled","message":"This server does not take new journals."}},"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}}},"/api/auth/links/redeem":{"post":{"summary":"Spend a one-click sign-in link.","requestBody":{"description":"`for` is \"read\" or \"identity\" only — an agent has no browser to follow a link, and a signup link would quietly create a journal on arrival. POST only: a mail scanner follows a link, it does not submit a form, and acting on arrival would cost a reader their own sign-in.","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"},"for":{"type":"string","enum":["read","identity"]},"user":{"type":"string"}},"required":["token","for"],"additionalProperties":false}}}},"responses":{"200":{"description":"the cookie is set on the response; `next` is where to land","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"next":{"type":"string"}},"required":["ok","next"],"additionalProperties":false}}}},"400":{"description":"`invalid_request`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`link_spent` — never followed, already spent, or expired — one answer for all three","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"link_spent":{"value":{"error":"link_spent","message":"This single-use link has already been followed. It cannot be followed again — ask for a new one."}}}}}},"404":{"description":"`not_found` — no such journal, or authentication is off","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"not_found":{"value":{"error":"not_found","message":"Nothing at this address."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}}},"/api/auth/signup/phone":{"post":{"summary":"Prove a telephone number, step one.","requestBody":{"description":"The signup token from codes/redeem (for: \"signup\") rides as `Authorization: Bearer`. Code mode: `tel` needs its own country code — this server stands in no country, so a national number is refused rather than guessed. Whatsapp-inbound mode: send no body and poll `links/redeem`'s sibling instead; a caller with no WhatsApp may send `{\"channel\": \"sms\"}` when the answer says `smsFallback: true`.","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tel":{"type":"string"},"channel":{"type":"string","const":"sms"}},"additionalProperties":false}}}},"responses":{"202":{"description":"code mode: an id to redeem against. Inbound mode: a wa.me link and its prefilled text","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"accepted"},"id":{"type":"string"},"next":{"type":"string"}},"required":["status","id","next"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"accepted"},"mode":{"type":"string","const":"whatsapp-inbound"},"smsFallback":{"type":"boolean"},"id":{"type":"string"},"link":{"type":"string"},"text":{"type":"string"},"next":{"type":"string"}},"required":["status","mode","smsFallback","id","link","text","next"],"additionalProperties":false}]}}}},"400":{"description":"`invalid_request` — tel missing or not a number with a country code; `sms_unreachable` — this server's number cannot reach that number's country","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}},"sms_unreachable":{"value":{"error":"sms_unreachable","message":"This server's SMS number cannot reach that number's country — the `message` names the restriction. Use the WhatsApp confirmation instead; nothing was sent and nothing was spent."}}}}}},"401":{"description":"`invalid_token` — missing, invalid, or not step two of signup","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}}}}}},"403":{"description":"`signup_not_invited`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_not_invited":{"value":{"error":"signup_not_invited","message":"This instance is invite-only: only addresses its operator has named can make a journal here. Nothing has been sent to this address. Ask the person who runs it to add you, then start again."}}}}}},"404":{"description":"`signup_disabled`; `sms_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_disabled":{"value":{"error":"signup_disabled","message":"This server does not take new journals."}},"sms_disabled":{"value":{"error":"sms_disabled","message":"This server cannot send SMS. Use the WhatsApp confirmation instead; nothing was issued."}}}}}},"429":{"description":"`too_many_requests` — 3/number/day, 5/address/day, 50/instance/day","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}},"503":{"description":"`verification_failed`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"verification_failed":{"value":{"error":"verification_failed","message":"The phone code could not be sent. Try again in a minute, or check the number."}}}}}}}}},"/api/auth/signup/phone/redeem":{"post":{"summary":"Prove a telephone number, step two.","requestBody":{"description":"`id` from the request step. Leaving `code` out is the poll for whatsapp-inbound mode: the answer is `{\"status\": \"pending\"}` until the message arrives, then the success shape; `{\"status\": \"expired\"}` means ask the request step again. On success the proven number is attached to the signup token itself — POST /api/v2/journals reads it automatically.","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"proven, or the poll status","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"status":{"type":"string","enum":["pending","expired"]}},"required":["status"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tel":{"type":"string"},"next":{"type":"string"}},"required":["ok","tel","next"],"additionalProperties":false}]}}}},"400":{"description":"`invalid_request` — no id sent","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"401":{"description":"`invalid_token`; `invalid_code`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_token":{"value":{"error":"invalid_token","message":"The token is not one this server issued, or it has expired. Tokens last seven days — ask for a new one the same way."}},"invalid_code":{"value":{"error":"invalid_code","message":"The six-digit code is wrong, used, or more than 30 minutes old. Ask for a new one; the newest is the only live one."}}}}}},"403":{"description":"`signup_not_invited`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_not_invited":{"value":{"error":"signup_not_invited","message":"This instance is invite-only: only addresses its operator has named can make a journal here. Nothing has been sent to this address. Ask the person who runs it to add you, then start again."}}}}}},"404":{"description":"`signup_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"signup_disabled":{"value":{"error":"signup_disabled","message":"This server does not take new journals."}}}}}},"429":{"description":"`too_many_requests`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"too_many_requests":{"value":{"error":"too_many_requests","message":"Too many of these too quickly. `retryAfter` says how long to wait — wait it out rather than retrying immediately."}}}}}}}}},"/api/auth/handover":{"post":{"summary":"Spend a handover credential for your own 7-day token.","responses":{"200":{"description":"a 7-day agent token, and the status URL to read next","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"token":{"type":"string"},"expiresAt":{"type":"string"},"scope":{"type":"string","const":"write:content"},"user":{"type":"string"},"journal":{"type":"string"},"status":{"type":"string"},"next":{"type":"string"}},"required":["ok","token","expiresAt","scope","user","journal","status","next"],"additionalProperties":false}}}},"401":{"description":"`missing_token`; `invalid_handover` — expired, already used, revoked, or not a handover credential","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"missing_token":{"value":{"error":"missing_token","message":"No `Authorization: Bearer` header. Every call to this API needs one; get a token from /api/auth/codes and /api/auth/codes/redeem, both with `\"for\": \"write\"`."}},"invalid_handover":{"value":{"error":"invalid_handover","message":"The 20-minute handover credential is spent, expired or not for this journal. The owner makes a new one from their own page."}}}}}},"404":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}}}}},"/api/auth/{user}/handover":{"post":{"summary":"Issue a handover credential the owner can paste into an agent — owner only.","responses":{"200":{"description":"a 20-minute credential that can only be exchanged, never used to read or write","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"handover":{"type":"string"},"expiresAt":{"type":"string"},"minutes":{"type":"number"},"exchange":{"type":"string"},"next":{"type":"string"}},"required":["ok","handover","expiresAt","minutes","exchange","next"],"additionalProperties":false}}}},"403":{"description":"`forbidden` — a trip-scoped bearer, or a caller that is not this journal's owner","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}},"409":{"description":"`no_owner_address`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_owner_address":{"value":{"error":"no_owner_address","message":"This journal's config.json has no owner address, and this call has to mail somebody. That is an edit to the file."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/auth/{user}/gps-token":{"post":{"summary":"Mint the owner's write:gps token — owner cookie only, refuses even the owner's own agent bearer.","responses":{"200":{"description":"a 30-day token good for POST /api/v2/{user}/import with kind \"gps\" and dryRun false, and nothing else","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"token":{"type":"string"},"expiresAt":{"type":"string"},"scope":{"type":"string","const":"write:gps"},"days":{"type":"number"},"next":{"type":"string"}},"required":["ok","token","expiresAt","scope","days","next"],"additionalProperties":false}}}},"403":{"description":"`forbidden` — not signed in as this journal's owner in a browser — a bearer token never counts here","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}},"409":{"description":"`no_owner_address`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"no_owner_address":{"value":{"error":"no_owner_address","message":"This journal's config.json has no owner address, and this call has to mail somebody. That is an edit to the file."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]},"/api/auth/{user}/keys":{"get":{"summary":"The tokens and sessions that can write here — the owner sees every row, anybody else only their own.","responses":{"200":{"description":"one row per live credential this caller may see","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string"},"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["write","handover"]},"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"lastSeenAt":{"type":["string","null"]},"scope":{"type":"string","enum":["owner","trip","gps"]},"trip":{"type":"string"},"email":{"type":"string"}},"required":["id","kind","createdAt","expiresAt","lastSeenAt","scope"],"additionalProperties":false}}},"required":["user","keys"],"additionalProperties":false}}}},"403":{"description":"`forbidden` — no proven address at all","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"409":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}}}},"post":{"summary":"Revoke one of them — the owner may revoke any row, anybody else only their own.","requestBody":{"description":"the key id from the GET above: {\"revoke\": \"<key id>\"}","required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"revoke":{"type":"string"}},"required":["revoke"],"additionalProperties":false}}}},"responses":{"200":{"description":"revoked","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"revoked":{"type":"string"}},"required":["ok","revoked"],"additionalProperties":false}}}},"400":{"description":"`invalid_request` — no key id sent","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"invalid_request":{"value":{"error":"invalid_request","message":"The body is missing something this call needs, or a value is not usable. The `message` says which."}}}}}},"403":{"description":"`forbidden` — no proven address at all","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"forbidden":{"value":{"error":"forbidden","message":"This call is the journal owner's, and the credential is not theirs. A trip-scoped token cannot do it either."}}}}}},"404":{"description":"`unknown_key` — does not exist, or — for a non-owner — belongs to somebody else's address","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"unknown_key":{"value":{"error":"unknown_key","message":"No credential of that id. GET the keys list for the ids this journal has."}}}}}},"409":{"description":"`auth_disabled`","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string","enum":["missing_token","invalid_token","out_of_scope","forbidden","not_authorised","not_signed_in","invalid_handover","invalid_code","too_many_journals","link_spent","no_such_journal","unknown_user","unknown_inbox_file","unknown_trip","unknown_day","unknown_contact","unknown_key","unknown_order","unknown_payment","invalid_amount","no_such_device","foreign_origin","not_found","gone","deletion_link_used","deletion_link_expired","invalid_json","invalid_request","stale_document","bad_request","invalid_entry","invalid_trip","invalid_costs","invalid_media","invalid_email","invalid_listed","invalid_teaser","invalid_test","invalid_costs_visibility","invalid_title","invalid_date","invalid_tagline","invalid_cover","invalid_plan","invalid_accent","invalid_intro","invalid_trip_id","invalid_visibility","invalid_people","invalid_rates","invalid_tracks","invalid_translations","invalid_declined","invalid_costs_budget","invalid_figures","unknown_figure","invalid_translations_answer","invalid_named_people","trip_exists","day_exists","figure_referenced","trip_unreadable","unreadable_zones","no_frontmatter","invalid_travellers","unsupported_field","expected_urls","expected_src","unknown_media","expected_multipart","body_too_large","no_file","expected_file","invalid_body","storage_full","unknown_kind","unreadable","contract","could_not_fetch","nothing_to_draw","expected_photo","not_this_trip","idempotency_conflict","conflict","incomplete_day","already_published","published_day_not_deletable","already_draft","not_published","test_content","auth_disabled","signup_disabled","signup_not_invited","phone_required","verification_failed","contacts_disabled","postcards_disabled","photobook_disabled","credits_disabled","mail_disabled","mail_failed","sms_disabled","sms_unreachable","no_owner_address","no_database","provider_unavailable","no_credits","not_for_agents","bad_token","bad_method","too_many_requests","helper_unavailable","consent_required","model_failed","weather_disabled","address_lookup_disabled","contact_exists","not_confirmed","self_authored","capability_unavailable","already_exists","trip_id_taken","title_required","slug_taken","cross_trip","incomplete","unknown_recipient","unknown_photo","unknown_statement","unreadable_statement","invalid_username","username_taken","reserved_username","deleted_username","invalid_owner","tel_taken"]},"message":{"type":"string"},"details":{}},"required":["error","message"],"additionalProperties":false},"examples":{"auth_disabled":{"value":{"error":"auth_disabled","message":"This server has authentication switched off entirely, so there are no tokens to hold. /api/health says what it can do."}}}}}}}},"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,30}$"},"description":"The journal's own name. It is a directory name and a URL segment at once, which is why the pattern is strict and why a name that would shadow a route of this site is refused."}]}}}