{"openapi":"3.1.0","info":{"title":"KYC LIFE API","version":"1.0.0","description":"Multi-tenant KYC-as-a-Service. Create sessions, payment links, receive webhooks.","contact":{"email":"support@kyc.life"}},"servers":[{"url":"https://kyc.life","description":"Production"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key (kyc_live_... or kyc_test_...)"}},"schemas":{"Session":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"sessionToken":{"type":"string"},"url":{"type":"string","format":"uri"},"status":{"type":"string","enum":["created","in_progress","submitted","approved","rejected","expired"]},"externalId":{"type":"string","nullable":true},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"environment":{"type":"string","enum":["live","test"]}}},"PaymentLink":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"token":{"type":"string"},"url":{"type":"string","format":"uri"},"status":{"type":"string","enum":["pending","verifying","paid","rejected","expired","cancelled"]},"amount":{"type":"number"},"description":{"type":"string"},"externalId":{"type":"string","nullable":true},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"security":[{"bearerAuth":[]}],"paths":{"/api/v1/sessions":{"post":{"summary":"Create KYC session","tags":["Sessions"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"externalId":{"type":"string"},"referenceNote":{"type":"string"},"metadata":{"type":"object"},"webhookUrl":{"type":"string","format":"uri"},"requireBankVerify":{"type":"boolean","default":false},"expiresInHours":{"type":"integer","minimum":1,"maximum":168,"default":24}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited / quota exceeded"}}},"get":{"summary":"List sessions","tags":["Sessions"],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"externalId","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/sessions/bulk":{"post":{"summary":"Bulk create up to 100 sessions in one call","tags":["Sessions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessions":{"type":"array","maxItems":100,"items":{"type":"object","properties":{"externalId":{"type":"string"},"requireBankVerify":{"type":"boolean"},"expiresInHours":{"type":"integer"},"metadata":{"type":"object"}}}}}}}}},"responses":{"201":{"description":"Created"}}}},"/api/v1/sessions/{id}":{"get":{"summary":"Get session by id or sessionToken","tags":["Sessions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/api/v1/payment-links":{"post":{"summary":"Create payment link","tags":["Payments"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["description","amount"],"properties":{"description":{"type":"string"},"amount":{"type":"number","minimum":0.01},"customerName":{"type":"string"},"customerEmail":{"type":"string","format":"email"},"customerPhone":{"type":"string"},"externalId":{"type":"string"},"systemBankAccountId":{"type":"string"},"expiresInHours":{"type":"integer","minimum":1,"maximum":720},"returnUrl":{"type":"string","format":"uri"},"webhookUrl":{"type":"string","format":"uri"},"metadata":{"type":"object"}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLink"}}}}}},"get":{"summary":"List payment links","tags":["Payments"],"responses":{"200":{"description":"OK"}}}},"/api/v1/payment-links/bulk":{"post":{"summary":"Bulk create up to 100 payment links","tags":["Payments"],"responses":{"201":{"description":"Created"}}}},"/api/v1/payment-links/{id}":{"get":{"summary":"Get payment link","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"delete":{"summary":"Cancel payment link","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cancelled"}}}},"/api/v1/bank-verifications":{"post":{"summary":"Create bank account verification (independent from KYC)","tags":["Bank Verifications"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"customerName":{"type":"string","description":"Optional — used for name matching against slip sender"},"customerEmail":{"type":"string","format":"email"},"customerPhone":{"type":"string"},"externalId":{"type":"string"},"referenceNote":{"type":"string"},"systemBankAccountId":{"type":"string"},"expiresInHours":{"type":"integer","minimum":1,"maximum":168,"default":48},"returnUrl":{"type":"string","format":"uri"},"webhookUrl":{"type":"string","format":"uri"},"metadata":{"type":"object"}}}}}},"responses":{"201":{"description":"Created"}}},"get":{"summary":"List bank verifications","tags":["Bank Verifications"],"responses":{"200":{"description":"OK"}}}},"/api/v1/bank-verifications/{id}":{"get":{"summary":"Get bank verification","tags":["Bank Verifications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"delete":{"summary":"Cancel bank verification","tags":["Bank Verifications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cancelled"}}}},"/api/v1/banks":{"get":{"summary":"List Thai banks (code, name, logo)","description":"Public reference endpoint — no authentication required. Returns all supported Thai banks with logo URLs.","tags":["Banks"],"security":[],"parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["th","en"],"default":"th"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/banks/{code}":{"get":{"summary":"Get a single bank by code or abbreviation","description":"Accepts BOT code (\"004\") or abbreviation (\"KBANK\"). Public — no auth.","tags":["Banks"],"security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["th","en"],"default":"th"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/api/v1/banks/{code}/logo":{"get":{"summary":"Get bank logo image (PNG)","description":"Returns the bank logo as image/png. Falls back to an unknown placeholder if code is invalid.","tags":["Banks"],"security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"PNG image","content":{"image/png":{}}}}}}}}