AI-FOS REST API

v0.1
Base URL
https://aifos.oddvar.meApp host

AI-FOS household finance features are exposed primarily through GraphQL at POST /graphql (schema in schemas/graphql/). Use GraphQL for dashboard queries, mutations, and subscriptions.

This OpenAPI document covers auxiliary REST only: worker/microbatch internal callbacks (/api/internal/**), inbound provider webhooks (/api/webhooks/**), and selected Actuator endpoints for operations. Authenticate internal routes with the shared worker secret (X-Worker-Token / AIFOS_WORKER_SECRET).

Authentication

workerTokenapiKey

Shared worker secret (AIFOS_WORKER_SECRET). Worker and microbatching JVMs only — not for browsers.

API Key: X-Worker-Token in header

Actuator

Monitor and interact

Actuator root web endpoint

GET
https://aifos.oddvar.me/actuator

Response

200OKobject

OK

Actuator root web endpoint
curl -X GET 'https://aifos.oddvar.me/actuator'
const response = await fetch('https://aifos.oddvar.me/actuator', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('https://aifos.oddvar.me/actuator')
data = response.json()
200
{}
{}
{}

Actuator web endpoint 'health'

GET
https://aifos.oddvar.me/actuator/health

Response

200OKobject

OK

Actuator web endpoint 'health'
curl -X GET 'https://aifos.oddvar.me/actuator/health'
const response = await fetch('https://aifos.oddvar.me/actuator/health', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('https://aifos.oddvar.me/actuator/health')
data = response.json()
200
{}
{}
{}

Actuator web endpoint 'prometheus'

GET
https://aifos.oddvar.me/actuator/prometheus

Parameters

formatstringCONTENT_TYPE_004CONTENT_TYPE_OPENMETRICS_100CONTENT_TYPE_PROTOBUFquery
includedNamesstringquery

Response

200OKobject

OK

Actuator web endpoint 'prometheus'
curl -X GET 'https://aifos.oddvar.me/actuator/prometheus'
const response = await fetch('https://aifos.oddvar.me/actuator/prometheus', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('https://aifos.oddvar.me/actuator/prometheus')
data = response.json()
200
{}
{}
{}

identity-public-auth-controller

POST
https://aifos.oddvar.me/api/auth/email/verify

Body

application/json
tokenstring

Response

204No Content

No Content

POST /api/auth/email/verify
curl -X POST 'https://aifos.oddvar.me/api/auth/email/verify' \
  -H 'Content-Type: application/json' \
  -d '{
    "token": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/email/verify', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "token": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "token": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/email/verify', json=payload)
data = response.json()
Request Body
{
  "token": "string"
}
POST
https://aifos.oddvar.me/api/auth/login

Body

application/json
emailstring
passwordstring

Response

200OKLoginResponse

OK

POST /api/auth/login
curl -X POST 'https://aifos.oddvar.me/api/auth/login' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "string",
    "password": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "email": "string",
      "password": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "email": "string",
  "password": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/login', json=payload)
data = response.json()
Request Body
{
  "email": "string",
  "password": "string"
}
200
{
  "accessToken": "string",
  "expiresInSeconds": 0,
  "mustChangePassword": true,
  "refreshToken": "string"
}
POST
https://aifos.oddvar.me/api/auth/logout

Body

application/json
refreshTokenstring

Response

204No Content

No Content

POST /api/auth/logout
curl -X POST 'https://aifos.oddvar.me/api/auth/logout' \
  -H 'Content-Type: application/json' \
  -d '{
    "refreshToken": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/logout', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "refreshToken": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "refreshToken": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/logout', json=payload)
data = response.json()
Request Body
{
  "refreshToken": "string"
}
POST
https://aifos.oddvar.me/api/auth/password/change

Body

application/json
currentPasswordstring
newPasswordstring

Response

204No Content

No Content

POST /api/auth/password/change
curl -X POST 'https://aifos.oddvar.me/api/auth/password/change' \
  -H 'Content-Type: application/json' \
  -d '{
    "currentPassword": "string",
    "newPassword": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/password/change', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "currentPassword": "string",
      "newPassword": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "currentPassword": "string",
  "newPassword": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/password/change', json=payload)
data = response.json()
Request Body
{
  "currentPassword": "string",
  "newPassword": "string"
}
POST
https://aifos.oddvar.me/api/auth/password/forgot

Body

application/json
emailstring

Response

202Accepted

Accepted

POST /api/auth/password/forgot
curl -X POST 'https://aifos.oddvar.me/api/auth/password/forgot' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/password/forgot', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "email": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "email": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/password/forgot', json=payload)
data = response.json()
Request Body
{
  "email": "string"
}
POST
https://aifos.oddvar.me/api/auth/password/reset

Body

application/json
newPasswordstring
tokenstring

Response

204No Content

No Content

POST /api/auth/password/reset
curl -X POST 'https://aifos.oddvar.me/api/auth/password/reset' \
  -H 'Content-Type: application/json' \
  -d '{
    "newPassword": "string",
    "token": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/password/reset', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "newPassword": "string",
      "token": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "newPassword": "string",
  "token": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/password/reset', json=payload)
data = response.json()
Request Body
{
  "newPassword": "string",
  "token": "string"
}
POST
https://aifos.oddvar.me/api/auth/register

Body

application/json
displayNamestring
emailstring
passwordstring
termsAcceptedboolean

Response

201CreatedRegisterResponse

Created

POST /api/auth/register
curl -X POST 'https://aifos.oddvar.me/api/auth/register' \
  -H 'Content-Type: application/json' \
  -d '{
    "displayName": "string",
    "email": "string",
    "password": "string",
    "termsAccepted": true
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/register', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "displayName": "string",
      "email": "string",
      "password": "string",
      "termsAccepted": true
    }),
});

const data = await response.json();
import requests

payload = {
  "displayName": "string",
  "email": "string",
  "password": "string",
  "termsAccepted": True
}

response = requests.post('https://aifos.oddvar.me/api/auth/register', json=payload)
data = response.json()
Request Body
{
  "displayName": "string",
  "email": "string",
  "password": "string",
  "termsAccepted": true
}
201
{
  "maskedEmail": "string"
}
POST
https://aifos.oddvar.me/api/auth/token/refresh

Body

application/json
refreshTokenstring

Response

200OKLoginResponse

OK

POST /api/auth/token/refresh
curl -X POST 'https://aifos.oddvar.me/api/auth/token/refresh' \
  -H 'Content-Type: application/json' \
  -d '{
    "refreshToken": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/auth/token/refresh', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "refreshToken": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "refreshToken": "string"
}

response = requests.post('https://aifos.oddvar.me/api/auth/token/refresh', json=payload)
data = response.json()
Request Body
{
  "refreshToken": "string"
}
200
{
  "accessToken": "string",
  "expiresInSeconds": 0,
  "mustChangePassword": true,
  "refreshToken": "string"
}

worker-internal-controller

POST
https://aifos.oddvar.me/api/internal/aifos/worker/bank-accounts/{accountId}/evaluate

Parameters

accountIdstring<uuid>requiredpath
userIdstring<uuid>requiredquery

Response

200OKBankAccountSyncEvaluation

OK

POST /api/internal/aifos/worker/bank-accounts/{accountId}/evaluate
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/bank-accounts/{accountId}/evaluate'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/bank-accounts/{accountId}/evaluate', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/bank-accounts/{accountId}/evaluate')
data = response.json()
200
{
  "accountId": "550e8400-e29b-41d4-a716-446655440000",
  "accountName": "string",
  "balance": 0,
  "currency": "string",
  "missingBalance": true,
  "negativeBalance": true,
  "timelineAppended": true,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/billing/rollup-daily

Parameters

usageDatestringquery

Response

200OKobject

OK

POST /api/internal/aifos/worker/billing/rollup-daily
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/billing/rollup-daily'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/billing/rollup-daily', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/billing/rollup-daily')
data = response.json()
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/budgets/{budgetId}/evaluate

Parameters

budgetIdstring<uuid>requiredpath
userIdstring<uuid>requiredquery
eventTypestringrequiredquery

Response

200OKBudgetEventEvaluation

OK

POST /api/internal/aifos/worker/budgets/{budgetId}/evaluate
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/budgets/{budgetId}/evaluate'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/budgets/{budgetId}/evaluate', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/budgets/{budgetId}/evaluate')
data = response.json()
200
{
  "budgetId": "550e8400-e29b-41d4-a716-446655440000",
  "budgetName": "string",
  "category": "string",
  "deleted": true,
  "eventType": "string",
  "exceeded": true,
  "monthlyLimit": 0,
  "rulesFired": 0,
  "spentThisMonth": 0,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/comparison/connectors/fetch

Body

application/json
categorystring
connectorIdstring
currentMonthlyPricenumber
jobIdstring<uuid>
priceAreastring
requestedAtstring<date-time>
userIdstring<uuid>
userQuestionstring

Response

200OKobject

OK

POST /api/internal/aifos/worker/comparison/connectors/fetch
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/comparison/connectors/fetch' \
  -H 'Content-Type: application/json' \
  -d '{
    "category": "string",
    "connectorId": "string",
    "currentMonthlyPrice": 0,
    "jobId": "550e8400-e29b-41d4-a716-446655440000",
    "priceArea": "string",
    "requestedAt": "2024-01-15T09:30:00Z",
    "userId": "550e8400-e29b-41d4-a716-446655440000",
    "userQuestion": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/comparison/connectors/fetch', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "category": "string",
      "connectorId": "string",
      "currentMonthlyPrice": 0,
      "jobId": "550e8400-e29b-41d4-a716-446655440000",
      "priceArea": "string",
      "requestedAt": "2024-01-15T09:30:00Z",
      "userId": "550e8400-e29b-41d4-a716-446655440000",
      "userQuestion": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "category": "string",
  "connectorId": "string",
  "currentMonthlyPrice": 0,
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "priceArea": "string",
  "requestedAt": "2024-01-15T09:30:00Z",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userQuestion": "string"
}

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/comparison/connectors/fetch', json=payload)
data = response.json()
Request Body
{
  "category": "string",
  "connectorId": "string",
  "currentMonthlyPrice": 0,
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "priceArea": "string",
  "requestedAt": "2024-01-15T09:30:00Z",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userQuestion": "string"
}
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/datalake/rollup-storage

Parameters

usageDatestringquery

Response

200OKobject

OK

POST /api/internal/aifos/worker/datalake/rollup-storage
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/datalake/rollup-storage'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/datalake/rollup-storage', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/datalake/rollup-storage')
data = response.json()
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/energy/prices/{priceArea}/evaluate-alerts

Parameters

priceAreastringrequiredpath

Response

200OKEnergyPriceAlertEvaluationResponse

OK

POST /api/internal/aifos/worker/energy/prices/{priceArea}/evaluate-alerts
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/energy/prices/{priceArea}/evaluate-alerts'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/energy/prices/{priceArea}/evaluate-alerts', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/energy/prices/{priceArea}/evaluate-alerts')
data = response.json()
200
{
  "expensiveHourAlert": true,
  "priceArea": "string",
  "rulesFired": 0,
  "thresholdNokPerKwh": 0,
  "tomorrowExpensiveHours": 0,
  "upcomingExpensiveHours": 0
}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/energy/usage/evaluate

Parameters

userIdstring<uuid>requiredquery

Response

200OKEnergyUsageSyncEvaluation

OK

POST /api/internal/aifos/worker/energy/usage/evaluate
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/energy/usage/evaluate'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/energy/usage/evaluate', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/energy/usage/evaluate')
data = response.json()
200
{
  "anomalyDetected": true,
  "averageDailyKwh": 0,
  "ratio": 0,
  "recentDailyKwh": 0,
  "timelineAppended": true,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/loans/rate-alerts/evaluate

Parameters

userIdstring<uuid>requiredquery

Response

200OKobject

OK

POST /api/internal/aifos/worker/loans/rate-alerts/evaluate
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/loans/rate-alerts/evaluate'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/loans/rate-alerts/evaluate', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/loans/rate-alerts/evaluate')
data = response.json()
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/loans/{loanId}/reports

Parameters

loanIdstring<uuid>requiredpath
userIdstring<uuid>requiredquery
reportTypestringrequiredquery

Response

200OKLoanReportResult

OK

POST /api/internal/aifos/worker/loans/{loanId}/reports
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/loans/{loanId}/reports'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/loans/{loanId}/reports', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/loans/{loanId}/reports')
data = response.json()
200
{
  "generatedAt": "2024-01-15T09:30:00Z",
  "loanId": "550e8400-e29b-41d4-a716-446655440000",
  "remainingDebt": 0,
  "remainingInterest": 0,
  "remainingPayments": 0,
  "reportId": "550e8400-e29b-41d4-a716-446655440000",
  "reportType": "string",
  "status": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/outreach-replies/process

Body

application/json
intentstring
outreachEmailIdstring<uuid>
replyBodystring
userIdstring<uuid>

Response

200OKobject

OK

POST /api/internal/aifos/worker/outreach-replies/process
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/outreach-replies/process' \
  -H 'Content-Type: application/json' \
  -d '{
    "intent": "string",
    "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
    "replyBody": "string",
    "userId": "550e8400-e29b-41d4-a716-446655440000"
  }'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/outreach-replies/process', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "intent": "string",
      "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
      "replyBody": "string",
      "userId": "550e8400-e29b-41d4-a716-446655440000"
    }),
});

const data = await response.json();
import requests

payload = {
  "intent": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "replyBody": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/outreach-replies/process', json=payload)
data = response.json()
Request Body
{
  "intent": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "replyBody": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/recommendations/refresh

Parameters

userIdstring<uuid>requiredquery

Response

200OKobject

OK

POST /api/internal/aifos/worker/recommendations/refresh
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/recommendations/refresh'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/recommendations/refresh', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/recommendations/refresh')
data = response.json()
200
{}
POST
https://aifos.oddvar.me/api/internal/aifos/worker/transactions/{transactionId}/categorize

Parameters

transactionIdstring<uuid>requiredpath

Response

200OKobject

OK

POST /api/internal/aifos/worker/transactions/{transactionId}/categorize
curl -X POST 'https://aifos.oddvar.me/api/internal/aifos/worker/transactions/{transactionId}/categorize'
const response = await fetch('https://aifos.oddvar.me/api/internal/aifos/worker/transactions/{transactionId}/categorize', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('https://aifos.oddvar.me/api/internal/aifos/worker/transactions/{transactionId}/categorize')
data = response.json()
200
{}

inbound-email-webhook-controller

POST
https://aifos.oddvar.me/api/webhooks/inbound-email

Body

application/json
bodystring
caseNumberstring
fromstring
outreachEmailIdstring<uuid>
subjectstring

Response

200OKobject

OK

POST /api/webhooks/inbound-email
curl -X POST 'https://aifos.oddvar.me/api/webhooks/inbound-email' \
  -H 'Content-Type: application/json' \
  -d '{
    "body": "string",
    "caseNumber": "string",
    "from": "string",
    "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
    "subject": "string"
  }'
const response = await fetch('https://aifos.oddvar.me/api/webhooks/inbound-email', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "body": "string",
      "caseNumber": "string",
      "from": "string",
      "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
      "subject": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "body": "string",
  "caseNumber": "string",
  "from": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "subject": "string"
}

response = requests.post('https://aifos.oddvar.me/api/webhooks/inbound-email', json=payload)
data = response.json()
Request Body
{
  "body": "string",
  "caseNumber": "string",
  "from": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "subject": "string"
}
200
{}

Models

BankAccountSyncEvaluation

object
accountIdstring<uuid>
accountNamestring
balancenumber
currencystring
missingBalanceboolean
negativeBalanceboolean
timelineAppendedboolean
userIdstring<uuid>
Example
{
  "accountId": "550e8400-e29b-41d4-a716-446655440000",
  "accountName": "string",
  "balance": 0,
  "currency": "string",
  "missingBalance": true,
  "negativeBalance": true,
  "timelineAppended": true,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

BudgetEventEvaluation

object
budgetIdstring<uuid>
budgetNamestring
categorystring
deletedboolean
eventTypestring
exceededboolean
monthlyLimitnumber
rulesFiredinteger<int32>
spentThisMonthnumber
userIdstring<uuid>
Example
{
  "budgetId": "550e8400-e29b-41d4-a716-446655440000",
  "budgetName": "string",
  "category": "string",
  "deleted": true,
  "eventType": "string",
  "exceeded": true,
  "monthlyLimit": 0,
  "rulesFired": 0,
  "spentThisMonth": 0,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

ChangePasswordRequest

object
currentPasswordstring
newPasswordstring
Example
{
  "currentPassword": "string",
  "newPassword": "string"
}

ComparisonConnectorFetchMessage

object
categorystring
connectorIdstring
currentMonthlyPricenumber
jobIdstring<uuid>
priceAreastring
requestedAtstring<date-time>
userIdstring<uuid>
userQuestionstring
Example
{
  "category": "string",
  "connectorId": "string",
  "currentMonthlyPrice": 0,
  "jobId": "550e8400-e29b-41d4-a716-446655440000",
  "priceArea": "string",
  "requestedAt": "2024-01-15T09:30:00Z",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userQuestion": "string"
}

EnergyPriceAlertEvaluationResponse

object
expensiveHourAlertboolean
priceAreastring
rulesFiredinteger<int32>
thresholdNokPerKwhnumber
tomorrowExpensiveHoursinteger<int64>
upcomingExpensiveHoursinteger<int32>
Example
{
  "expensiveHourAlert": true,
  "priceArea": "string",
  "rulesFired": 0,
  "thresholdNokPerKwh": 0,
  "tomorrowExpensiveHours": 0,
  "upcomingExpensiveHours": 0
}

EnergyUsageSyncEvaluation

object
anomalyDetectedboolean
averageDailyKwhnumber
rationumber
recentDailyKwhnumber
timelineAppendedboolean
userIdstring<uuid>
Example
{
  "anomalyDetected": true,
  "averageDailyKwh": 0,
  "ratio": 0,
  "recentDailyKwh": 0,
  "timelineAppended": true,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

InboundEmailWebhookRequest

object
bodystring
caseNumberstring
fromstring
outreachEmailIdstring<uuid>
subjectstring
Example
{
  "body": "string",
  "caseNumber": "string",
  "from": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "subject": "string"
}

LoanReportResult

object
generatedAtstring<date-time>
loanIdstring<uuid>
remainingDebtnumber
remainingInterestnumber
remainingPaymentsinteger<int32>
reportIdstring<uuid>
reportTypestring
statusstring
userIdstring<uuid>
Example
{
  "generatedAt": "2024-01-15T09:30:00Z",
  "loanId": "550e8400-e29b-41d4-a716-446655440000",
  "remainingDebt": 0,
  "remainingInterest": 0,
  "remainingPayments": 0,
  "reportId": "550e8400-e29b-41d4-a716-446655440000",
  "reportType": "string",
  "status": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

LoginRequest

object
emailstring
passwordstring
Example
{
  "email": "string",
  "password": "string"
}

LoginResponse

object
accessTokenstring
expiresInSecondsinteger<int64>
mustChangePasswordboolean
refreshTokenstring
Example
{
  "accessToken": "string",
  "expiresInSeconds": 0,
  "mustChangePassword": true,
  "refreshToken": "string"
}

PasswordForgotRequest

object
emailstring
Example
{
  "email": "string"
}

PasswordResetRequest

object
newPasswordstring
tokenstring
Example
{
  "newPassword": "string",
  "token": "string"
}

ProcessOutreachReplyRequest

object
intentstring
outreachEmailIdstring<uuid>
replyBodystring
userIdstring<uuid>
Example
{
  "intent": "string",
  "outreachEmailId": "550e8400-e29b-41d4-a716-446655440000",
  "replyBody": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

RegisterRequest

object
displayNamestring
emailstring
passwordstring
termsAcceptedboolean
Example
{
  "displayName": "string",
  "email": "string",
  "password": "string",
  "termsAccepted": true
}

RegisterResponse

object
maskedEmailstring
Example
{
  "maskedEmail": "string"
}

TokenRefreshRequest

object
refreshTokenstring
Example
{
  "refreshToken": "string"
}

VerifyEmailRequest

object
tokenstring
Example
{
  "token": "string"
}