{"openapi":"3.1.0","info":{"title":"Phuket Exchange public data","version":"1.0.0","description":"Read-only current quotes and provider evidence. generatedAt is not source freshness. Compare only comparable=true, freshness=fresh items; check evidence.expiresAt before use. No transaction or refresh/write endpoint."},"servers":[{"url":"/exchange"}],"paths":{"/api/quotes":{"get":{"operationId":"getExchangeQuotes","summary":"Compare current quotes for explicit conditions","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"to","in":"query","required":true,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"amount","in":"query","required":true,"schema":{"type":"number","exclusiveMinimum":0,"maximum":1000000000000},"description":"Amount in source currency."},{"name":"fundingMethod","in":"query","required":true,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"payoutMethod","in":"query","required":true,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"denominationGroup","in":"query","required":false,"schema":{"type":"string"},"description":"Single banknote denomination, not tariff range; requires denominationAsset."},{"name":"denominationAsset","in":"query","required":false,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"cryptoNetwork","in":"query","required":false,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"deliveryZone","in":"query","required":false,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."},{"name":"deliveryTime","in":"query","required":false,"schema":{"type":"string"},"description":"Use values from /api/config. No implicit route fallback."}],"responses":{"200":{"description":"Successful read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"400":{"description":"Invalid, duplicate, unknown or unsupported conditions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait"}}},"503":{"description":"Upstream unavailable; no current quote returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/config":{"get":{"operationId":"getExchangeConfiguration","summary":"Assets, banknotes, funding and payout methods, valid pair routes","responses":{"200":{"description":"Successful read","content":{"application/json":{"schema":{"type":"object","required":["assets","pairs","funding","payout"],"properties":{"assets":{"type":"object"},"pairs":{"type":"array","items":{"type":"object","required":["source","target","routes"],"properties":{"source":{"type":"string"},"target":{"type":"string"},"routes":{"type":"array","items":{"type":"object"}}}}},"funding":{"type":"object"},"payout":{"type":"object"}}}}}}}}},"/api/offices":{"get":{"operationId":"getExchangeOffices","summary":"Office addresses and coordinates; not branch-specific rates or opening hours","responses":{"200":{"description":"Successful read","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"providerId":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"mapsUrl":{"type":["string","null"]}}}}}}}}}}}},"/api/reference":{"get":{"operationId":"getExchangeReferenceRates","summary":"Reference THB rates and card network rates for USD, EUR, KZT, CNY, RUB","responses":{"200":{"description":"Successful read","content":{"application/json":{"schema":{"type":"object","required":["generatedAt","sources","currencies"],"properties":{"generatedAt":{"type":"string","format":"date-time"},"sources":{"type":"object","description":"bot, cbr, unionpay: status ok or unavailable, date of the source data, error when unavailable."},"currencies":{"type":"object","description":"Per currency: reference (THB per one unit, source and date) and unionpay (THB per one unit, rateData, date); null when the source has no value."}}}}}}}}},"/api/services":{"get":{"operationId":"getPaymentServiceClaims","summary":"Provider website claims for property/invoice payments. No live prices.","responses":{"200":{"description":"Successful read","content":{"application/json":{"schema":{"type":"object","required":["reviewedAt","evidenceType","transactionAvailability","prices","items"],"properties":{"reviewedAt":{"type":"string","format":"date"},"evidenceType":{"const":"provider_website_claim"},"transactionAvailability":{"const":"requires_provider_confirmation"},"prices":{"type":"null"},"items":{"type":"array","items":{"type":"object","required":["providerId","sourceUrl","reviewedAt"],"properties":{"providerId":{"type":"string"},"provider":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"reviewedAt":{"type":"string","format":"date"}}}}}}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"QuoteResponse":{"type":"object","required":["schemaVersion","generatedAt","request","items","comparableCount","bestComparableProviderIds"],"properties":{"schemaVersion":{"const":"1.0"},"generatedAt":{"type":"string","format":"date-time","description":"Response time; never source update time."},"status":{"enum":["ok","partial","not_found"]},"request":{"type":"object","description":"Echo of validated user conditions."},"rateConvention":{"const":"target_asset_per_one_source_asset"},"refreshAfterSeconds":{"type":"integer"},"comparableCount":{"type":"integer","minimum":0},"bestComparableProviderIds":{"type":"array","items":{"type":"string"},"description":"Tied highest receiving amounts among comparable fresh quotes. Empty if none."},"items":{"type":"array","items":{"$ref":"#/components/schemas/Quote"}},"links":{"type":"object"}}},"Quote":{"type":"object","required":["providerId","provider","state","freshness","comparable","rate","receiveAmount","evidence"],"properties":{"providerId":{"type":"string"},"provider":{"type":"string"},"state":{"enum":["comparable","conditional","reference","request","expired"]},"freshness":{"enum":["fresh","expired","unknown"]},"comparable":{"type":"boolean"},"rate":{"type":["number","null"],"description":"Target units per 1 source unit. Null if expired, unknown freshness or on request."},"rateUnit":{"type":"string"},"receiveAmount":{"type":["number","null"]},"receiveAsset":{"type":"string"},"quoteKind":{"enum":["published_rate","official_calculator","reference_rate","on_request"]},"quoteScope":{"enum":["final_delivered","final_payout","exchange_only","reference",null]},"matchClass":{"enum":["exact","unverified","fallback"]},"unverified":{"type":"array","items":{"type":"string"}},"matchedConditions":{"type":"object"},"evidence":{"type":["object","null"],"properties":{"sourceUrl":{"type":"string","format":"uri"},"observedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"delivery":{"type":["object","null"]},"actions":{"type":"array","items":{"type":"object","properties":{"kind":{"enum":["telegram","site","maps"]},"url":{"type":"string","format":"uri"},"label":{"type":"string"}}}}}}}}}