> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.finput.com.au/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.finput.com.au/_mcp/server.

# Check whether this app version may run

GET https://api.finput.com.au/api/v1/client-version-check

Call before sign-in and on every resume. No credentials: any
`Authorization` header is ignored, so an expired session cannot
make the check fail.

**The client rule.** Stop the app only when the response is `200`
with `status` = `blocked`, and show `message` with a link to the
store. Everything else means carry on as if `ok`: no network, a
timeout, any `4xx` (including `429`), any `5xx`, a body that does
not parse, or a `status` this build does not recognise. A
generated client that throws on an unknown enum value must catch
that and carry on too. On `update_available`, offer the update
and let the user continue.

The server fails open the same way: when the owner's
configuration is missing or invalid, the answer is `ok`.

**Versions** are `MAJOR.MINOR.PATCH`, compared numerically
(`1.10.0` is newer than `1.9.0`). The build number — `+BUILD` in
`version`, or `build` — does not affect ordering; it only matters
when a single build has been kill-switched. Send it whenever you
have it. Digits are ASCII only.

**Encode the `+`.** In a query string a bare `+` means a space,
so send `1.4.2+57` as `version=1.4.2%2B57` — or pass the build
separately as `build=57`. The server also accepts a bare `+`,
but don't rely on it.

Responses are cacheable for 60 seconds (`Cache-Control: public,
max-age=60`).


Reference: https://docs.finput.com.au/api/endpoints/client-versions/check-client-version

## Request

### Query parameters

- `platform` (enum, required)
  - Allowed values: `ios`, `android`
- `version` (string, required) — The installed version (`CFBundleShortVersionString` / `versionName`), optionally with `+BUILD`. The value shown is decoded; on the wire the `+` is `%2B`.
- `build` (integer, optional) — The build number (`CFBundleVersion` / `versionCode`), when not already in `version`. Must match it when both are sent.

## Response

### 200

The decision, plus each platform's minimum and latest version.

- `status` (enum, required) — `blocked` stops the app; `update_available` offers an update and lets the user carry on; `ok` carries on. More values may be added — treat one this build does not recognise as `ok`.
  - Allowed values: `ok`, `update_available`, `blocked`
- `reason` (enum, required, nullable) — Why the app is blocked; null unless `status` is `blocked`.
  - Allowed values: `below_minimum`, `version_blocked`
- `message` (string, required, nullable) — Plain text for the blocked screen, at most 280 characters; null unless `status` is `blocked`.
- `platform` (enum, required)
  - Allowed values: `ios`, `android`
- `version` (string, required) — The version checked, `MAJOR.MINOR.PATCH`.
- `build` (integer, required, nullable) — The build checked, if one was sent.
- `platforms` (ClientPlatforms, required)

## Errors

### 400 Bad Request Error

Unknown platform, a version that is not `MAJOR.MINOR.PATCH` (with optional `+BUILD`), or a build that is not a number or contradicts the one in `version`. The app carries on.

- `map from string to list of string`

### 429 Too Many Requests Error

More than 120 checks a minute from one IP. The app carries on.

- `any`

## Types

### ClientPlatforms

- `ios` (ClientPlatformVersions, required)
- `android` (ClientPlatformVersions, required)

### ClientPlatformVersions

- `minimum_version` (string, required, nullable) — Below this the app is `blocked`. Null when no minimum is enforced.
- `latest_version` (string, required, nullable) — Below this the app is offered an update. Null when not set.

## Examples

**Response**

```json
{
  "status": "blocked",
  "reason": "version_blocked",
  "message": "This version of Finput is no longer supported. Update Finput from the App Store to keep going.",
  "platform": "ios",
  "version": "1.3.0",
  "build": 41,
  "platforms": {
    "ios": {
      "minimum_version": "1.2.0",
      "latest_version": "1.4.0"
    },
    "android": {
      "minimum_version": "1.1.0",
      "latest_version": "1.4.0"
    }
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.finput.com.au/api/v1/client-version-check"

querystring = {"build":"57","platform":"ios","version":"1.4.2+57"}

response = requests.get(url, params=querystring)

print(response.json())
```

```javascript
const url = 'https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57');

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.finput.com.au/api/v1/client-version-check?build=57&platform=ios&version=1.4.2%2B57")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```