Update goals
curl --request PUT \
--url https://app.skcal.fit/api/targets \
--header 'Content-Type: application/json' \
--cookie __Secure-better-auth.session_token= \
--data '
{
"goalWeightKg": 70,
"startWeightKg": 78.4,
"dailyKcalTarget": 2100,
"proteinTargetG": 170,
"targetDate": 1790000000000
}
'import requests
url = "https://app.skcal.fit/api/targets"
payload = {
"goalWeightKg": 70,
"startWeightKg": 78.4,
"dailyKcalTarget": 2100,
"proteinTargetG": 170,
"targetDate": 1790000000000
}
headers = {
"cookie": "__Secure-better-auth.session_token=",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
cookie: '__Secure-better-auth.session_token=',
'Content-Type': 'application/json'
},
body: JSON.stringify({
goalWeightKg: 70,
startWeightKg: 78.4,
dailyKcalTarget: 2100,
proteinTargetG: 170,
targetDate: 1790000000000
})
};
fetch('https://app.skcal.fit/api/targets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.skcal.fit/api/targets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'goalWeightKg' => 70,
'startWeightKg' => 78.4,
'dailyKcalTarget' => 2100,
'proteinTargetG' => 170,
'targetDate' => 1790000000000
]),
CURLOPT_COOKIE => "__Secure-better-auth.session_token=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.skcal.fit/api/targets"
payload := strings.NewReader("{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("cookie", "__Secure-better-auth.session_token=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.skcal.fit/api/targets")
.header("cookie", "__Secure-better-auth.session_token=")
.header("Content-Type", "application/json")
.body("{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.skcal.fit/api/targets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["cookie"] = '__Secure-better-auth.session_token='
request["Content-Type"] = 'application/json'
request.body = "{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}Targets
Update goals
Partially updates the caller’s targets; omitted fields are left unchanged.
PUT
/
api
/
targets
Update goals
curl --request PUT \
--url https://app.skcal.fit/api/targets \
--header 'Content-Type: application/json' \
--cookie __Secure-better-auth.session_token= \
--data '
{
"goalWeightKg": 70,
"startWeightKg": 78.4,
"dailyKcalTarget": 2100,
"proteinTargetG": 170,
"targetDate": 1790000000000
}
'import requests
url = "https://app.skcal.fit/api/targets"
payload = {
"goalWeightKg": 70,
"startWeightKg": 78.4,
"dailyKcalTarget": 2100,
"proteinTargetG": 170,
"targetDate": 1790000000000
}
headers = {
"cookie": "__Secure-better-auth.session_token=",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
cookie: '__Secure-better-auth.session_token=',
'Content-Type': 'application/json'
},
body: JSON.stringify({
goalWeightKg: 70,
startWeightKg: 78.4,
dailyKcalTarget: 2100,
proteinTargetG: 170,
targetDate: 1790000000000
})
};
fetch('https://app.skcal.fit/api/targets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.skcal.fit/api/targets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'goalWeightKg' => 70,
'startWeightKg' => 78.4,
'dailyKcalTarget' => 2100,
'proteinTargetG' => 170,
'targetDate' => 1790000000000
]),
CURLOPT_COOKIE => "__Secure-better-auth.session_token=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.skcal.fit/api/targets"
payload := strings.NewReader("{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("cookie", "__Secure-better-auth.session_token=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.skcal.fit/api/targets")
.header("cookie", "__Secure-better-auth.session_token=")
.header("Content-Type", "application/json")
.body("{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.skcal.fit/api/targets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["cookie"] = '__Secure-better-auth.session_token='
request["Content-Type"] = 'application/json'
request.body = "{\n \"goalWeightKg\": 70,\n \"startWeightKg\": 78.4,\n \"dailyKcalTarget\": 2100,\n \"proteinTargetG\": 170,\n \"targetDate\": 1790000000000\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}Authorizations
sessionCookiebearerApiKey
Better Auth session. Signing in (Google or email magic link) sets an HttpOnly session cookie that scopes every request to that account. The web app and CLI use this; agents use the OAuth 2.1 flow of the MCP server.
Body
application/json
The fields to change; omitted fields are left unchanged.
Partial update to a user's targets; omitted fields are left unchanged.
New target body weight in kilograms.
Example:
70
New starting body weight in kilograms.
Example:
78.4
New daily calorie target.
Example:
2100
New daily protein target in grams.
Example:
170
New goal date as a Unix epoch in milliseconds.
Example:
1790000000000
Response
200 - application/json
The targets were updated.
Minimal success acknowledgement for write operations.
Always true.
Example:
true