{"openapi":"3.1.0","info":{"title":"Tamloot Public API","summary":"Read conversation history, create or update contacts, and append contact notes.","version":"1.0.0"},"servers":[{"url":"https://api.tamloot.cc","description":"Production"}],"paths":{"/v1/contacts":{"get":{"tags":["Read API"],"summary":"Search contacts","operationId":"searchContacts","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":100,"title":"Query"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Searchcontacts"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Contacts"],"summary":"Create Contact","operationId":"createContact","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"idempotency-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128,"pattern":"^[!-~]+$"},{"type":"null"}],"description":"Optional retry key. Reuse with the same request for 24 hours.","title":"Idempotency-Key"},"description":"Optional retry key. Reuse with the same request for 24 hours."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteResult"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"404":{"description":"Contact not found or not visible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"409":{"description":"Duplicate email, archived contact, or retry key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"503":{"description":"Write temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/contacts/{contact_id}":{"get":{"tags":["Read API"],"summary":"Get a contact","operationId":"getContact","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Contact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Getcontact"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Contacts"],"summary":"Update Contact","operationId":"updateContact","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteResult"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"404":{"description":"Contact not found or not visible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"409":{"description":"Duplicate email, archived contact, or retry key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"503":{"description":"Write temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sessions":{"get":{"tags":["Read API"],"summary":"Browse or search sessions","operationId":"searchSessions","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":100},{"type":"null"}],"title":"Query"}},{"name":"contact_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Contact Id"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Searchsessions"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sessions/{session_id}":{"get":{"tags":["Read API"],"summary":"Get a session","operationId":"getSession","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Getsession"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sessions/{session_id}/transcript":{"get":{"tags":["Read API"],"summary":"Get a session transcript","operationId":"getSessionTranscript","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Getsessiontranscript"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/notes":{"get":{"tags":["Read API"],"summary":"Search notes","operationId":"searchNotes","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":100,"title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"default":15,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Searchnotes"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/contacts/{contact_id}/notes":{"post":{"tags":["Contacts"],"summary":"Add Contact Note","operationId":"addContactNote","security":[{"TamlootApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Contact Id"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128,"pattern":"^[!-~]+$"},{"type":"null"}],"description":"Optional retry key. Reuse with the same request for 24 hours.","title":"Idempotency-Key"},"description":"Optional retry key. Reuse with the same request for 24 hours."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactNoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteResult"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"404":{"description":"Contact not found or not visible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"409":{"description":"Duplicate email, archived contact, or retry key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"422":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"503":{"description":"Write temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/health":{"get":{"tags":["Service"],"summary":"Health","description":"Return a credential-free liveness response.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Response Health V1 Health Get"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}}}},"429":{"description":"Rate limit exceeded. The API allows 10 requests per second; wait the number of seconds in Retry-After and retry.","headers":{"RateLimit-Limit":{"description":"Requests allowed per one-second window.","schema":{"type":"integer","example":10}},"RateLimit-Policy":{"description":"The rate-limit policy, as `<limit>;w=<window seconds>`.","schema":{"type":"string","example":"10;w=1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","example":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"ContactCreate":{"properties":{"full_name":{"type":"string","maxLength":200,"minLength":1,"title":"Full Name"},"email":{"anyOf":[{"type":"string","maxLength":254,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"}},"additionalProperties":false,"type":"object","required":["full_name"],"title":"ContactCreate"},"ContactNoteCreate":{"properties":{"content":{"type":"string","maxLength":10000,"minLength":1,"title":"Content"}},"additionalProperties":false,"type":"object","required":["content"],"title":"ContactNoteCreate"},"ContactUpdate":{"properties":{"full_name":{"type":"string","maxLength":200,"minLength":1,"title":"Full Name"},"email":{"anyOf":[{"type":"string","maxLength":254,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"}},"additionalProperties":false,"type":"object","title":"ContactUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WriteResult":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"WriteResult"},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"HTTP status code as a string, e.g. \"404\""},"message":{"type":"string"}}}}}},"securitySchemes":{"TamlootApiKey":{"type":"http","scheme":"bearer","bearerFormat":"Tamloot API key"}}}}