{"openapi":"3.1.0","info":{"title":"Contact Vlad Tsvang","version":"1.0.0","description":"Send Vlad Tsvang a message on behalf of a person. Flow: request a challenge token, then post the message with it. Messages land in Vlad's private dashboard; nothing is sent back out. Rate limited; on 429 or 503 wait and retry later. A plain HTML form for people and browser agents is at /contact.","contact":{"name":"Vlad Tsvang","email":"vlad@tsvang.com","url":"https://tsvang.com/contact"}},"servers":[{"url":"https://tsvang.com"}],"paths":{"/api/contact/challenge":{"post":{"operationId":"getContactChallenge","summary":"Get a short-lived token required to send a message","x-openai-isConsequential":false,"responses":{"200":{"description":"Token issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Challenge"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/contact":{"post":{"operationId":"sendMessageToVlad","summary":"Send Vlad Tsvang a message","description":"Confirm the message with the person before calling this. Include their name and, if they want a reply, a way to reach them.","x-openai-isConsequential":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewMessage"}}}},"responses":{"201":{"description":"Stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receipt"}}}},"400":{"description":"Invalid body or expired challenge","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"description":"Intake paused. Try again tomorrow or email Vlad.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/contact/{id}":{"get":{"operationId":"getMessageStatus","summary":"Check whether Vlad has seen a message","x-openai-isConsequential":false,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"404":{"description":"Unknown receipt","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"responses":{"RateLimited":{"description":"Too many requests. Wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Challenge":{"type":"object","required":["challenge","expires_in"],"properties":{"challenge":{"type":"string"},"expires_in":{"type":"integer","description":"Seconds until the token expires"}}},"NewMessage":{"type":"object","required":["challenge","name","message"],"properties":{"challenge":{"type":"string","description":"Token from /api/contact/challenge."},"name":{"type":"string","maxLength":100,"description":"Who the message is from, as the person wants to be known"},"subject":{"type":"string","maxLength":150,"description":"Optional short subject line."},"message":{"type":"string","maxLength":2000},"reply_to":{"type":"string","format":"email","description":"Optional. Where Vlad Tsvang can reply. Never verified, never emailed by this site."},"agent":{"type":"string","maxLength":100,"description":"Optional. Which assistant sent this, e.g. 'Claude Code'."}}},"Receipt":{"type":"object","required":["id","status_url","tier"],"properties":{"id":{"type":"string"},"status_url":{"type":"string","format":"uri"},"tier":{"type":"integer","description":"0 = anonymous (all channels today), 1 = reserved for verified origins"},"note":{"type":"string"}}},"Status":{"type":"object","required":["id","received_at","status"],"properties":{"id":{"type":"string"},"received_at":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["received","read","replied"]}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}