{"openapi":"3.1.0","info":{"title":"Altitude free tools","version":"1.0.0","description":"Small, read-only tools for currency conversion and bank-detail checks, for agents answering an individual's question. Indicative information from Altitude's tools. Not a quote, not financial advice; confirm details with the bank or provider before sending money. Per-IP limits: 30/minute and 500/day for rate tools, 60/minute and 2000/day for the others. No resale, bulk export or SLA.","termsOfService":"https://altitude.xyz/tools/api-terms"},"servers":[{"url":"https://altitude.xyz"}],"paths":{"/api/tools/convertCurrency":{"get":{"operationId":"convertCurrency","summary":"Convert currency","description":"Convert an amount between two supported currencies (fiat, or USDC at its 1:1 USD peg) at the latest mid-market rate. Pairs without USD are derived from the two USD rates. For a pair Altitude converts, `altitude` gives Altitude's markup over mid-market, its all-in rate and the amount after it. One pair per call. Rates are indicative, not a quote.","parameters":[{"name":"amount","in":"query","required":true,"description":"Amount in the `from` currency.","schema":{"type":"number","description":"Amount in the `from` currency.","minimum":0,"maximum":1000000000}},{"name":"from","in":"query","required":true,"description":"ISO code to convert from, e.g. USD.","schema":{"type":"string","description":"ISO code to convert from, e.g. USD.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}},{"name":"to","in":"query","required":true,"description":"ISO code to convert to, e.g. MXN.","schema":{"type":"string","description":"ISO code to convert to, e.g. MXN.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}}],"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"convertCurrencyPost","summary":"Convert currency","description":"Convert an amount between two supported currencies (fiat, or USDC at its 1:1 USD peg) at the latest mid-market rate. Pairs without USD are derived from the two USD rates. For a pair Altitude converts, `altitude` gives Altitude's markup over mid-market, its all-in rate and the amount after it. One pair per call. Rates are indicative, not a quote.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Amount in the `from` currency.","minimum":0,"maximum":1000000000},"from":{"type":"string","description":"ISO code to convert from, e.g. USD.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]},"to":{"type":"string","description":"ISO code to convert to, e.g. MXN.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}},"required":["amount","from","to"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/getExchangeRate":{"get":{"operationId":"getExchangeRate","summary":"Get an exchange rate","description":"The latest mid-market exchange rate for one currency pair, with its timestamp and source. Pairs without USD are derived from the two USD rates. For a pair Altitude converts, `altitude` gives Altitude's markup over mid-market and its all-in rate. One pair per call. Indicative, not a quote.","parameters":[{"name":"from","in":"query","required":true,"description":"Base currency ISO code, e.g. EUR.","schema":{"type":"string","description":"Base currency ISO code, e.g. EUR.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}},{"name":"to","in":"query","required":true,"description":"Quote currency ISO code, e.g. BRL.","schema":{"type":"string","description":"Quote currency ISO code, e.g. BRL.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}}],"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"getExchangeRatePost","summary":"Get an exchange rate","description":"The latest mid-market exchange rate for one currency pair, with its timestamp and source. Pairs without USD are derived from the two USD rates. For a pair Altitude converts, `altitude` gives Altitude's markup over mid-market and its all-in rate. One pair per call. Indicative, not a quote.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Base currency ISO code, e.g. EUR.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]},"to":{"type":"string","description":"Quote currency ISO code, e.g. BRL.","enum":["USD","EUR","GBP","MXN","BRL","COP","USDC"]}},"required":["from","to"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/validateIban":{"post":{"operationId":"validateIbanPost","summary":"Validate an IBAN","description":"Check an IBAN's country format, length and check digits, and split it into bank code and account number. Returns the bank's BIC where the national directory is available (AT, BE, DE, ES, FR, LU, NL). A valid IBAN is not proof the account exists.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"iban":{"type":"string","description":"The IBAN, with or without spaces.","minLength":1,"maxLength":50}},"required":["iban"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/validateRoutingNumber":{"get":{"operationId":"validateRoutingNumber","summary":"Validate a US routing number","description":"Check a nine-digit ABA routing number's Federal Reserve prefix and checksum, and name the bank when it's one of the ~75 major US banks whose own published numbers are on file. A valid number can still be unassigned.","parameters":[{"name":"routingNumber","in":"query","required":true,"description":"Nine-digit ABA routing number.","schema":{"type":"string","description":"Nine-digit ABA routing number.","minLength":1,"maxLength":20}}],"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"validateRoutingNumberPost","summary":"Validate a US routing number","description":"Check a nine-digit ABA routing number's Federal Reserve prefix and checksum, and name the bank when it's one of the ~75 major US banks whose own published numbers are on file. A valid number can still be unassigned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"routingNumber":{"type":"string","description":"Nine-digit ABA routing number.","minLength":1,"maxLength":20}},"required":["routingNumber"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/validateSwiftCode":{"get":{"operationId":"validateSwiftCode","summary":"Validate a SWIFT/BIC code","description":"Check a SWIFT/BIC code's structure, break it into institution, country, location and branch, and look it up in SWIFT's BIC-to-LEI directory (as published by GLEIF): the institution's legal name, the registered address of the legal entity (not a branch's address), LEI and page. The result's `source` carries the directory's date and SWIFT's licence notice, which must accompany the data. The directory covers institutions with an LEI, so a valid code can be missing from it; confirm branch details with the bank.","parameters":[{"name":"code","in":"query","required":true,"description":"8- or 11-character SWIFT/BIC code.","schema":{"type":"string","description":"8- or 11-character SWIFT/BIC code.","minLength":1,"maxLength":20}}],"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"validateSwiftCodePost","summary":"Validate a SWIFT/BIC code","description":"Check a SWIFT/BIC code's structure, break it into institution, country, location and branch, and look it up in SWIFT's BIC-to-LEI directory (as published by GLEIF): the institution's legal name, the registered address of the legal entity (not a branch's address), LEI and page. The result's `source` carries the directory's date and SWIFT's licence notice, which must accompany the data. The directory covers institutions with an LEI, so a valid code can be missing from it; confirm branch details with the bank.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"8- or 11-character SWIFT/BIC code.","minLength":1,"maxLength":20}},"required":["code"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/searchSwiftBanks":{"get":{"operationId":"searchSwiftBanks","summary":"Find a bank's SWIFT/BIC code","description":"Search banks and financial institutions by name, optionally in one country, and get their head-office SWIFT/BIC codes with city, country and page. Use it when you know the bank's name but not its code; use validateSwiftCode when you have a code. Every word must start a word of the bank's name, city, state or country (\"first national omaha\"). Covers institutions in SWIFT's BIC-to-LEI directory (as published by GLEIF), so no match doesn't prove a bank has no code. `match` is \"none\", \"one\" or \"several\": when several banks match, ask which one rather than picking the first. The result's `source` carries the directory's date and SWIFT's licence notice, which must accompany the data.","parameters":[{"name":"query","in":"query","required":true,"description":"Bank name, or part of it, optionally with a city or state, e.g. \"barclays\" or \"banorte\".","schema":{"type":"string","description":"Bank name, or part of it, optionally with a city or state, e.g. \"barclays\" or \"banorte\".","minLength":2,"maxLength":80}},{"name":"country","in":"query","required":false,"description":"Optional two-letter ISO country code to search within, e.g. MX.","schema":{"type":"string","description":"Optional two-letter ISO country code to search within, e.g. MX.","pattern":"^[A-Za-z]{2}$"}}],"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"searchSwiftBanksPost","summary":"Find a bank's SWIFT/BIC code","description":"Search banks and financial institutions by name, optionally in one country, and get their head-office SWIFT/BIC codes with city, country and page. Use it when you know the bank's name but not its code; use validateSwiftCode when you have a code. Every word must start a word of the bank's name, city, state or country (\"first national omaha\"). Covers institutions in SWIFT's BIC-to-LEI directory (as published by GLEIF), so no match doesn't prove a bank has no code. `match` is \"none\", \"one\" or \"several\": when several banks match, ask which one rather than picking the first. The result's `source` carries the directory's date and SWIFT's licence notice, which must accompany the data.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"Bank name, or part of it, optionally with a city or state, e.g. \"barclays\" or \"banorte\".","minLength":2,"maxLength":80},"country":{"type":"string","description":"Optional two-letter ISO country code to search within, e.g. MX.","pattern":"^[A-Za-z]{2}$"}},"required":["query"],"additionalProperties":false}}}},"responses":{"200":{"description":"The result, with attribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input; the message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Valid input with no answer, e.g. no rate for that pair on that date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Envelope":{"type":"object","required":["tool","result","attribution"],"properties":{"tool":{"type":"string"},"result":{"type":"object"},"attribution":{"type":"object","properties":{"provider":{"type":"string"},"page":{"type":"string","format":"uri"},"notice":{"type":"string"}}}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"},"terms":{"type":"string","format":"uri"}}}}}}}}