Upsert a day's totals
curl --request PUT \
--url https://app.skcal.fit/api/nutrition \
--header 'Content-Type: application/json' \
--cookie __Secure-better-auth.session_token= \
--data '
{
"date": "2026-06-29",
"kcal": 2150,
"proteinG": 168,
"hitProtein": true,
"adherence": "on"
}
'import requests
url = "https://app.skcal.fit/api/nutrition"
payload = {
"date": "2026-06-29",
"kcal": 2150,
"proteinG": 168,
"hitProtein": True,
"adherence": "on"
}
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({
date: '2026-06-29',
kcal: 2150,
proteinG: 168,
hitProtein: true,
adherence: 'on'
})
};
fetch('https://app.skcal.fit/api/nutrition', 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/nutrition",
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([
'date' => '2026-06-29',
'kcal' => 2150,
'proteinG' => 168,
'hitProtein' => true,
'adherence' => 'on'
]),
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/nutrition"
payload := strings.NewReader("{\n \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\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/nutrition")
.header("cookie", "__Secure-better-auth.session_token=")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.skcal.fit/api/nutrition")
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 \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}{
"error": "weightKg must be 9-320 kg",
"detail": "upstream model returned 500"
}Nutrition
Upsert a day's totals
Directly sets the calorie and protein totals for one calendar day, replacing any existing roll-up.
PUT
/
api
/
nutrition
Upsert a day's totals
curl --request PUT \
--url https://app.skcal.fit/api/nutrition \
--header 'Content-Type: application/json' \
--cookie __Secure-better-auth.session_token= \
--data '
{
"date": "2026-06-29",
"kcal": 2150,
"proteinG": 168,
"hitProtein": true,
"adherence": "on"
}
'import requests
url = "https://app.skcal.fit/api/nutrition"
payload = {
"date": "2026-06-29",
"kcal": 2150,
"proteinG": 168,
"hitProtein": True,
"adherence": "on"
}
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({
date: '2026-06-29',
kcal: 2150,
proteinG: 168,
hitProtein: true,
adherence: 'on'
})
};
fetch('https://app.skcal.fit/api/nutrition', 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/nutrition",
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([
'date' => '2026-06-29',
'kcal' => 2150,
'proteinG' => 168,
'hitProtein' => true,
'adherence' => 'on'
]),
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/nutrition"
payload := strings.NewReader("{\n \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\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/nutrition")
.header("cookie", "__Secure-better-auth.session_token=")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.skcal.fit/api/nutrition")
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 \"date\": \"2026-06-29\",\n \"kcal\": 2150,\n \"proteinG\": 168,\n \"hitProtein\": true,\n \"adherence\": \"on\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}{
"error": "weightKg must be 9-320 kg",
"detail": "upstream model returned 500"
}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 day's totals to store.
Body for upserting a day's totals directly.
Calendar day to upsert (YYYY-MM-DD).
Example:
"2026-06-29"
Total calories to set for the day.
Required range:
0 <= x <= 20000Example:
2150
Total protein in grams to set for the day.
Required range:
0 <= x <= 1000Example:
168
Whether to mark the protein target as met.
Example:
true
Calorie adherence bucket to set.
Available options:
under, on, over, null Example:
"on"
Response
The day's totals were stored.
Minimal success acknowledgement for write operations.
Always true.
Example:
true