{"openapi":"3.1.0","info":{"title":"Loominator API","version":"2026-10-12","description":"Forward travel confirmation emails, get structured itineraries back. Authenticate with `Authorization: Bearer lm_live_…`. Every authenticated response carries `RateLimit-Policy`, `RateLimit` and `Loominator-Blocks` headers; quota-consuming calls answer 429 `application/problem+json` when the period quota or block cap is exhausted."},"servers":[{"url":"https://api.loominator.io"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Itineraries"},{"name":"Reservations"},{"name":"Emails"},{"name":"Provenance"},{"name":"Webhooks"},{"name":"Account"},{"name":"API keys"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"lm_live_…","description":"API key created in the dashboard or via POST /v1/api-keys."}},"schemas":{"ProblemDetails":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"number"},"detail":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}},"ItineraryPatch":{"type":"object","properties":{"display_name":{"type":"string","minLength":1,"maxLength":200},"start_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"end_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"type":["string","null"],"maxLength":5000},"image_url":{"type":["string","null"],"format":"uri"},"is_private":{"type":"boolean"},"primary_location":{"type":["string","null"],"maxLength":200},"is_dates_pinned":{"type":"boolean"},"status":{"type":"string","enum":["active","archived"]}}},"ReservationPatch":{"type":"object","properties":{"trip_id":{"type":["string","null"]},"notes":{"type":["string","null"],"maxLength":5000},"status":{"type":"string","enum":["active","cancelled"]}}},"EmailSubmission":{"type":"object","properties":{"raw_base64":{"type":"string","minLength":1}},"required":["raw_base64"]},"WebhookEndpointCreate":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["run.completed","run.failed","ping"]},"minItems":1,"default":["run.completed","run.failed"]},"description":{"type":"string","maxLength":200}},"required":["url"]},"WebhookEndpointPatch":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["run.completed","run.failed","ping"]},"minItems":1},"description":{"type":["string","null"],"maxLength":200},"enabled":{"type":"boolean"}}},"ApiKeyCreate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"expires_in_seconds":{"type":"integer","minimum":60,"maximum":157680000}}},"AccountPatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"max_extra_blocks":{"type":"integer","minimum":0}}},"SenderEmailCreate":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]},"SenderDomainCreate":{"type":"object","properties":{"domain":{"type":"string","minLength":3,"maxLength":253},"method":{"type":"string","enum":["email","dns","meta","file"]},"email_local_part":{"type":"string","enum":["security","hostmaster","postmaster","webmaster","admin","administrator"]},"include_subdomains":{"type":"boolean"}},"required":["domain","method"]}},"parameters":{}},"paths":{"/v1/itineraries":{"get":{"tags":["Itineraries"],"summary":"List itineraries","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1},"required":false,"name":"page_num","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"required":false,"name":"page_size","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"]},"required":false,"name":"past","in":"query"},{"schema":{"type":"string"},"required":false,"name":"modified_since","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"]},"required":false,"name":"include_archived","in":"query"}],"responses":{"200":{"description":"List wrapper `{ timestamp, page_num, page_size, max_page, Trip: [...] }` (`Trip` is the JSON key for an itinerary)","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/itineraries/{id}":{"get":{"tags":["Itineraries"],"summary":"Get an itinerary","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["0","1","true","false"]},"required":false,"name":"include_objects","in":"query"}],"responses":{"200":{"description":"`{ Trip }` plus one array per reservation type when include_objects=true","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"patch":{"tags":["Itineraries"],"summary":"Update an itinerary","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItineraryPatch"}}}},"responses":{"200":{"description":"`{ Trip }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Itineraries"],"summary":"Delete an itinerary (reservations are detached, not deleted)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Deleted"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/reservations":{"get":{"tags":["Reservations"],"summary":"List reservations grouped by type","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1},"required":false,"name":"page_num","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"required":false,"name":"page_size","in":"query"},{"schema":{"type":"string","enum":["air","lodging","car","rail","transport","cruise","restaurant","activity","note","map","directions","parking"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string"},"required":false,"name":"trip_id","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"]},"required":false,"name":"past","in":"query"},{"schema":{"type":"string"},"required":false,"name":"modified_since","in":"query"},{"schema":{"type":"string","enum":["0","1","true","false"]},"required":false,"name":"include_superseded","in":"query"}],"responses":{"200":{"description":"`{ timestamp, page_num, page_size, max_page, Air: [...], Lodging: [...], ... }` (empty groups omitted)","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/reservations/{id}":{"get":{"tags":["Reservations"],"summary":"Get a reservation object","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The reservation object (`type` discriminates)","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"patch":{"tags":["Reservations"],"summary":"Move to another itinerary, edit notes or status","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationPatch"}}}},"responses":{"200":{"description":"Updated object","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Reservations"],"summary":"Delete a reservation","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Deleted"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/emails":{"post":{"tags":["Emails"],"summary":"Submit a raw email (RFC 5322) for processing","security":[{"bearerAuth":[]}],"description":"Body is either `message/rfc822` raw bytes or JSON `{ raw_base64 }`. Consumes one usage unit on acceptance.","requestBody":{"required":true,"content":{"message/rfc822":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"$ref":"#/components/schemas/EmailSubmission"}}}},"responses":{"202":{"description":"Accepted for processing","content":{"application/json":{"schema":{"type":"object","properties":{"email_id":{"type":"string"},"run_id":{"type":["string","null"]},"decision":{"type":"string"}},"required":["email_id","run_id","decision"]}}}},"402":{"description":"Subscription inactive","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Too large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"415":{"description":"Unsupported media type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Quota exceeded or block cap reached (`type` quota_exceeded | block_cap_reached, `period_end`, `usage`, `actions`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"get":{"tags":["Emails"],"summary":"List received emails","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["received","unverified_sender","held_quota","held_cap","processing","processed","no_travel","failed","duplicate","rejected_inactive","system"]},"required":false,"name":"status","in":"query"},{"schema":{"type":["integer","null"]},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"`{ data: Email[], next_cursor }`","content":{"application/json":{"schema":{}}}}}}},"/v1/emails/{id}":{"get":{"tags":["Emails"],"summary":"Get an email","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Email","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/emails/{id}/raw":{"get":{"tags":["Emails"],"summary":"Download the original message (message/rfc822)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Raw RFC 5322 message","content":{"message/rfc822":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/emails/{id}/runs":{"get":{"tags":["Emails","Provenance"],"summary":"Processing runs for an email","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"`{ data: Run[] }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/emails/{id}/reprocess":{"post":{"tags":["Emails"],"summary":"Reprocess an email (free after a failed run, otherwise one unit; max 3 per email)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"`{ email_id, run_id }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Reprocess limit reached or run in progress","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Quota exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/runs/{id}":{"get":{"tags":["Provenance"],"summary":"Get a processing run","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Run","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/runs/{id}/steps":{"get":{"tags":["Provenance"],"summary":"Steps of a run (model, prompt version, tokens, timings, errors)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"`{ data: Step[] }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/runs/{id}/steps/{stepId}/raw":{"get":{"tags":["Provenance"],"summary":"Raw model output of a step (inline text or streamed from R2)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1},"required":true,"name":"stepId","in":"path"}],"responses":{"200":{"description":"Raw output","content":{"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/usage":{"get":{"tags":["Account"],"summary":"Current period usage (DO snapshot + ledger counts)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Usage","content":{"application/json":{"schema":{}}}},"503":{"description":"Usage service unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-endpoints":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"`{ data: WebhookEndpoint[] }`","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Webhooks"],"summary":"Create a webhook endpoint (the signing secret is returned once)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreate"}}}},"responses":{"201":{"description":"`{ ...WebhookEndpoint, secret }`","content":{"application/json":{"schema":{}}}},"409":{"description":"Too many endpoints","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-endpoints/{id}":{"get":{"tags":["Webhooks"],"summary":"Get a webhook endpoint","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"WebhookEndpoint","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"patch":{"tags":["Webhooks"],"summary":"Update a webhook endpoint (re-enabling resets the failure counter)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPatch"}}}},"responses":{"200":{"description":"WebhookEndpoint","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint and its delivery history","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Deleted"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-endpoints/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a signed `ping` delivery","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"`{ delivery_id }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Endpoint disabled","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-endpoints/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotate the signing secret (old secret keeps signing for 24h)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"`{ ...WebhookEndpoint, secret }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-deliveries":{"get":{"tags":["Webhooks"],"summary":"List webhook deliveries","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"endpoint_id","in":"query"},{"schema":{"type":"string","enum":["pending","delivering","succeeded","failed","cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":["integer","null"]},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"`{ data: WebhookDelivery[], next_cursor }`","content":{"application/json":{"schema":{}}}}}}},"/v1/webhook-deliveries/{id}":{"get":{"tags":["Webhooks"],"summary":"Get a delivery with every attempt","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"WebhookDelivery + attempts","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/webhook-deliveries/{id}/retry":{"post":{"tags":["Webhooks"],"summary":"Manually retry a delivery (+3 attempts, history kept)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"`{ ok: true }`","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Delivery in progress","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/api-keys":{"get":{"tags":["API keys"],"summary":"List API keys (owner's keys)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"`{ data: ApiKey[] }`","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["API keys"],"summary":"Create an API key (the full key is returned once)","security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"`{ key, ...ApiKey }`","content":{"application/json":{"schema":{}}}},"409":{"description":"Too many keys","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/api-keys/{id}":{"delete":{"tags":["API keys"],"summary":"Revoke an API key","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Revoked"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/account":{"get":{"tags":["Account"],"summary":"Get the account","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{}}}}}},"patch":{"tags":["Account"],"summary":"Update account settings (`max_extra_blocks` caps overage blocks per period)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountPatch"}}}},"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-emails":{"get":{"tags":["Account"],"summary":"List sender addresses (only verified ones are processed)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"`{ data: SenderEmail[] }`","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Account"],"summary":"Add a sender address (a confirmation email is sent to it)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderEmailCreate"}}}},"responses":{"201":{"description":"SenderEmail","content":{"application/json":{"schema":{}}}},"409":{"description":"Already added","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-emails/verify":{"post":{"tags":["Account"],"summary":"Confirm a sender address with the emailed token","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":8}},"required":["token"]}}}},"responses":{"200":{"description":"SenderEmail","content":{"application/json":{"schema":{}}}},"404":{"description":"Unknown or used token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-emails/{id}/resend":{"post":{"tags":["Account"],"summary":"Resend the confirmation email","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"Queued","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-emails/{id}":{"delete":{"tags":["Account"],"summary":"Remove a sender address (the owner's login address cannot be removed)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Removed"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Owner address","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-domains":{"get":{"tags":["Account"],"summary":"List sender domains (any address at a verified domain is accepted)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"`{ data: SenderDomain[] }`","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Account"],"summary":"Add a sender domain and choose how to prove ownership (email to an admin mailbox, DNS TXT, meta tag, or verification file)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderDomainCreate"}}}},"responses":{"201":{"description":"SenderDomain with `instructions`","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid domain","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Already added","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-domains/{id}/verify":{"post":{"tags":["Account"],"summary":"Run the ownership check now (DNS/meta/file), or resend the confirmation email (email method)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"SenderDomain (verified or with `last_check_error`)","content":{"application/json":{"schema":{}}}},"202":{"description":"Confirmation email sent","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/sender-domains/{id}":{"patch":{"tags":["Account"],"summary":"Change the verification method or subdomain scope (resets verification when the method changes)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["email","dns","meta","file"]},"email_local_part":{"type":"string","enum":["security","hostmaster","postmaster","webmaster","admin","administrator"]},"include_subdomains":{"type":"boolean"}}}}}},"responses":{"200":{"description":"SenderDomain","content":{"application/json":{"schema":{}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Account"],"summary":"Remove a sender domain","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Removed"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"webhooks":{}}