Skip to documentation
FoodABCs API · v1

Build thoughtful food and wellness experiences.

Grade meals, surface nutrition insights, sync wellness activity, and understand outcomes through one partner API. Start in the sandbox, then move the same integration live when your app is ready.

Base URL
https://www.foodabcs.com/api/v1
Format
JSON over HTTPS
Operations
61 documented

Get started

Make your first request

Create a sandbox application, authorize a FoodABCs user, exchange the authorization code, and send the resulting access token with a v1 request.

1

Create an app

Create your partner workspace and sandbox application. Keep secret credentials on your server.

Create partner account
2

Authorize a user

Send the user through OAuth with PKCE and request only the scopes your integration needs.

Read authentication guide
3

Call the API

Use the access token as a Bearer credential. Every response includes a request ID for support and tracing.

Browse endpoint reference

Request

bash
curl -L https://www.foodabcs.com/api/v1/me \
  -H "Authorization: Bearer <access_token>" \
  -H "Accept: application/json"

Response · 200

json
{
  "first_name": "Alex",
  "last_name": "Rivera",
  "created_at": "2025-11-04T19:22:10.000Z",
  "meal_count": 184,
  "workout_count": 67,
  "mood_count": 93,
  "physical_exam_count": 4
}

Authentication

Two credential models, one clear boundary

Use OAuth user tokens for user-authorized profile and wellness data. Use partner API keys only for server-to-server partner operations such as usage, analytics, access review, and webhook management.

User access token

OAuth 2.0 + PKCE

Acts for one FoodABCs user and is limited by the scopes they approved. Send it as Authorization: Bearer <token>.

Partner credential

Secret API key

Identifies your partner application. Store it server-side, rotate it if exposed, and never embed it in a browser or mobile binary.

1. Send the user to authorization

Register the exact redirect URI in your partner application, generate a random state value, and use an S256 PKCE challenge.

url
https://www.foodabcs.com/oauth/authorize?
  response_type=code&
  client_id=<client_id>&
  redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback&
  scope=profile.read%20meals.read&
  state=<random_state>&
  code_challenge=<pkce_challenge>&
  code_challenge_method=S256

2. Exchange the returned code

Exchange each code once from your backend. The redirect URI and PKCE verifier must match the original request.

bash
curl -X POST https://www.foodabcs.com/api/oauth/token \
  -H "Content-Type: application/json" \
  --data '{
    "grant_type": "authorization_code",
    "code": "<authorization_code>",
    "client_id": "<client_id>",
    "redirect_uri": "https://example.com/oauth/callback",
    "code_verifier": "<pkce_verifier>"
  }'

3. Request narrow scopes

Scopes are action-specific, such as meals.read and meals.write. A valid token still receives 403 insufficient_scope when its grant does not cover an operation.

Core concepts

Conventions that keep integrations predictable

A

Sandbox and live

Sandbox credentials are for development and test data. Live credentials are separately reviewed and should be stored, monitored, and rotated independently.

B

Versioned routes

All current resource endpoints begin with /api/v1. A future breaking contract will use a new version boundary instead of silently changing v1.

C

Timestamps and IDs

Timestamps use ISO 8601 UTC strings. Resource identifiers are opaque: persist them exactly and do not infer ordering or meaning from their format.

D

Pagination

Paginated list endpoints use limit and an opaque cursor. Follow next_cursor until it is null; check each operation because some bounded lists do not paginate.

E

Source ownership

Read endpoints may include records from multiple sources. Most resource updates and deletes are limited to records created by the calling partner app; each operation calls out exceptions.

F

Grades and pending work

Meal scores can be immediate while detailed classification finishes asynchronously. Listen for meal.graded or check the documented classification status.

Common headers

Authorization
Bearer user token or partner credential, as listed per operation.
Content-Type
Use application/json for JSON request bodies.
Idempotency-Key
Recommended on POST requests so a safe retry does not create the same resource twice.
Request-Id
Returned on API responses. Save it when diagnosing a failed call.
X-RateLimit-*
Limit, remaining requests, and reset seconds for the current window.

Webhooks

React to important changes

Register webhook URLs with a partner credential. FoodABCs signs the exact raw request body and retries non-2xx deliveries after approximately 1 minute, 10 minutes, 1 hour, and 6 hours. A fifth failed attempt is terminal.

Verify every delivery

Read X-FoodABCs-Signature, compute an HMAC-SHA256 over the unmodified raw bytes with your webhook secret, and compare signatures in constant time before parsing the body.

javascript
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyFoodABCsWebhook(rawBody, signatureHeader, secret) {
  const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
  const received = signatureHeader.replace(/^sha256=/, "");
  return received.length === expected.length &&
    timingSafeEqual(Buffer.from(received), Buffer.from(expected));
}

Event payloads

data.deleted uses a one-way user reference. grant.revoked ends authorized access. meal.graded reports completed asynchronous classification.

json
{
  "id": "3e38ea84-f61e-4320-8f12-bbc38c411d34",
  "type": "data.deleted",
  "created_at": "2026-07-09T19:24:18.000Z",
  "data": {
    "user_ref": "4de79d4a5b8d…",
    "reason": "account_deletion"
  }
}

{
  "id": "1335ef1f-2201-49fc-b87d-bc1b6f7cc738",
  "type": "grant.revoked",
  "created_at": "2026-07-09T19:32:03.000Z",
  "data": {
    "user_id": "4c7d8d7b-5d42-4e35-a6bf-cb4ed302c839",
    "partner_id": "f982f6b9-04e5-4a12-91b7-4f47c98cd8df",
    "revoked_at": "2026-07-09T19:32:03.000Z"
  }
}

{
  "meal_id": 1842,
  "user_id": "4c7d8d7b-5d42-4e35-a6bf-cb4ed302c839",
  "grade": "B+",
  "classified_at": "2026-07-09T19:38:41.000Z"
}

Delivery safety checklist

  • • Return a 2xx response quickly, then process asynchronously.
  • • Treat delivery and event IDs as idempotency keys.
  • • Keep the raw body available until signature verification finishes.
  • • Test against an HTTPS listener before enabling live events.

API reference

Every endpoint, request, and response

Expand an operation to see its credential, scope, parameters, copyable curl request, realistic success payload, documented response fields, and representative errors.

Profile

3 operations

Link to group
GET

Get profile summary

/api/v1/me

Returns the current user’s profile identity and lifetime activity counts.

AuthOAuth user access tokenScopeprofile.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/me

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/me' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "first_name": "Alex",
  "last_name": "Rivera",
  "created_at": "2025-11-04T19:22:10.000Z",
  "meal_count": 184,
  "workout_count": 67,
  "mood_count": 93,
  "physical_exam_count": 4
}
Response fields (7)
FieldTypeMeaning
first_namestring · requiredSee the response example for representative data.
last_namestring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
meal_countinteger · requiredSee the response example for representative data.
workout_countinteger · requiredSee the response example for representative data.
mood_countinteger · requiredSee the response example for representative data.
physical_exam_countinteger · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get demographics

/api/v1/demographics

Returns the current user’s self-reported demographic profile. Fields may be null when the user has not answered them.

AuthOAuth user access tokenScopedemographics.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/demographics

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/demographics' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "birthdate": "1992-04-18",
  "sex": "female",
  "state": "CO",
  "zip_code": "80205",
  "race_ethnicity": "Hispanic or Latino",
  "snap_wic_status": "Not receiving",
  "household_income": "$75,000 – $99,999"
}
Response fields (7)
FieldTypeMeaning
birthdatestring · requiredSee the response example for representative data.
sexstring · requiredSee the response example for representative data.
statestring · requiredSee the response example for representative data.
zip_codestring · requiredSee the response example for representative data.
race_ethnicitystring · requiredSee the response example for representative data.
snap_wic_statusstring · requiredSee the response example for representative data.
household_incomestring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PATCH

Update demographics

/api/v1/demographics

Updates only the supplied self-reported fields and returns the complete demographic profile.

AuthOAuth user access tokenScopedemographics.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PATCH/api/v1/demographics

Request

Make the request
bash
curl --request PATCH 'https://www.foodabcs.com/api/v1/demographics' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "state": "CO",
  "zip_code": "80205",
  "household_income": "$75,000 – $99,999"
}'
Parameters

This request has no path or query parameters.

Request body
application/json · required
json
{
  "state": "CO",
  "zip_code": "80205",
  "household_income": "$75,000 – $99,999"
}

Response

Successful response
200

The request completed successfully.

json
{
  "birthdate": "1992-04-18",
  "sex": "female",
  "state": "CO",
  "zip_code": "80205",
  "race_ethnicity": "Hispanic or Latino",
  "snap_wic_status": "Not receiving",
  "household_income": "$75,000 – $99,999"
}
Response fields (7)
FieldTypeMeaning
birthdatestring · requiredSee the response example for representative data.
sexstring · requiredSee the response example for representative data.
statestring · requiredSee the response example for representative data.
zip_codestring · requiredSee the response example for representative data.
race_ethnicitystring · requiredSee the response example for representative data.
snap_wic_statusstring · requiredSee the response example for representative data.
household_incomestring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Meals

15 operations

Link to group
POST

Create a meal

/api/v1/meals

Creates an API-owned meal, calculates its immediate grade, and queues asynchronous classification.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/meals

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/meals' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "timestamp": "2026-06-29T18:30:00Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": 612
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "timestamp": "2026-06-29T18:30:00Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": 612
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "1042",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "timestamp": "2026-06-29T18:30:00.000Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": "612",
  "meal_score": "A",
  "is_favorite": false,
  "meal_classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "meal_classification_version": "v1",
  "meal_classified_at": "2026-06-29T18:30:08.000Z",
  "meal_behavior_events": [],
  "meal_behavior_version": "v1",
  "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7",
  "classification_status": "queued"
}
Response fields (23)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
timestampstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
ingredientsarray<object> · requiredSee the response example for representative data.
ingredients.namestring · requiredSee the response example for representative data.
ingredients.amountinteger · requiredSee the response example for representative data.
ingredients.unitstring · requiredSee the response example for representative data.
ingredients.nutritionobject · requiredSee the response example for representative data.
ingredients.nutrition.nutrientsarray<object> · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
meal_scorestring · requiredSee the response example for representative data.
is_favoriteboolean · requiredSee the response example for representative data.
meal_classificationsarray<object> · requiredSee the response example for representative data.
meal_classifications.keystring · requiredSee the response example for representative data.
meal_classifications.labelstring · requiredSee the response example for representative data.
meal_classification_versionstring · requiredSee the response example for representative data.
meal_classified_atstring · requiredSee the response example for representative data.
meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meal_behavior_versionstring · requiredSee the response example for representative data.
meal_behavior_detected_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
classification_statusstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Analyze a meal image

/api/v1/meals/analyze-image

Extracts ingredients and nutrition from a supported image. Set save to true to create the meal; otherwise the response is a draft.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.07 T1 · $0.14 T2
POST/api/v1/meals/analyze-image

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/meals/analyze-image' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
  "save": false
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
  "save": false
}

Response

Successful response
200

The request completed successfully.

json
{
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": 612,
  "projected_grade": "A",
  "grade_pending_reason": "Ingredient details are sufficient for an initial grade."
}
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Analyze a meal description

/api/v1/meals/analyze-text

Turns a plain-language meal description into a scored draft or, when save is true, an API-owned meal.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.06 T1 · $0.11 T2
POST/api/v1/meals/analyze-text

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/meals/analyze-text' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "description": "Turkey and avocado sandwich on whole wheat bread",
  "save": false
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "description": "Turkey and avocado sandwich on whole wheat bread",
  "save": false
}

Response

Successful response
200

The request completed successfully.

json
{
  "name": "Turkey avocado sandwich",
  "ingredients": [
    {
      "name": "Whole wheat bread",
      "amount": 2,
      "unit": "slices",
      "calories": 160
    },
    {
      "name": "Sliced turkey",
      "amount": 4,
      "unit": "oz",
      "calories": 120
    },
    {
      "name": "Avocado",
      "amount": 0.5,
      "unit": "each",
      "calories": 120
    }
  ],
  "total_calories": 400,
  "projected_grade": "B",
  "grade_pending_reason": "Some ingredient nutrition values were estimated."
}
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List meals

/api/v1/meals

Lists meals visible to the user across all sources in reverse chronological order.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/meals

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z&limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "1042",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "timestamp": "2026-06-29T18:30:00.000Z",
      "name": "Chicken quinoa bowl",
      "ingredients": [
        {
          "name": "Grilled chicken breast",
          "amount": 5,
          "unit": "oz",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 234,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 44,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 0,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 5,
                "unit": "g"
              }
            ]
          }
        },
        {
          "name": "Cooked quinoa",
          "amount": 1,
          "unit": "cup",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 222,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 8,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 39,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 4,
                "unit": "g"
              }
            ]
          }
        }
      ],
      "total_calories": "612",
      "meal_score": "A",
      "is_favorite": false,
      "meal_classifications": [
        {
          "key": "high_protein",
          "label": "High protein"
        }
      ],
      "meal_classification_version": "v1",
      "meal_classified_at": "2026-06-29T18:30:08.000Z",
      "meal_behavior_events": [],
      "meal_behavior_version": "v1",
      "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (23)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.timestampstring · requiredSee the response example for representative data.
data.namestring · requiredSee the response example for representative data.
data.ingredientsarray<object> · requiredSee the response example for representative data.
data.ingredients.namestring · requiredSee the response example for representative data.
data.ingredients.amountinteger · requiredSee the response example for representative data.
data.ingredients.unitstring · requiredSee the response example for representative data.
data.ingredients.nutritionobject · requiredSee the response example for representative data.
data.total_caloriesstring · requiredSee the response example for representative data.
data.meal_scorestring · requiredSee the response example for representative data.
data.is_favoriteboolean · requiredSee the response example for representative data.
data.meal_classificationsarray<object> · requiredSee the response example for representative data.
data.meal_classifications.keystring · requiredSee the response example for representative data.
data.meal_classifications.labelstring · requiredSee the response example for representative data.
data.meal_classification_versionstring · requiredSee the response example for representative data.
data.meal_classified_atstring · requiredSee the response example for representative data.
data.meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
data.meal_behavior_versionstring · requiredSee the response example for representative data.
data.meal_behavior_detected_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get a meal

/api/v1/meals/{mealId}

Returns one meal visible to the current user.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/meals/{mealId}

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
mealId*pathstringMeal identifier.Example: 1042

Response

Successful response
200

The request completed successfully.

json
{
  "id": "1042",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "timestamp": "2026-06-29T18:30:00.000Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": "612",
  "meal_score": "A",
  "is_favorite": false,
  "meal_classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "meal_classification_version": "v1",
  "meal_classified_at": "2026-06-29T18:30:08.000Z",
  "meal_behavior_events": [],
  "meal_behavior_version": "v1",
  "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (22)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
timestampstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
ingredientsarray<object> · requiredSee the response example for representative data.
ingredients.namestring · requiredSee the response example for representative data.
ingredients.amountinteger · requiredSee the response example for representative data.
ingredients.unitstring · requiredSee the response example for representative data.
ingredients.nutritionobject · requiredSee the response example for representative data.
ingredients.nutrition.nutrientsarray<object> · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
meal_scorestring · requiredSee the response example for representative data.
is_favoriteboolean · requiredSee the response example for representative data.
meal_classificationsarray<object> · requiredSee the response example for representative data.
meal_classifications.keystring · requiredSee the response example for representative data.
meal_classifications.labelstring · requiredSee the response example for representative data.
meal_classification_versionstring · requiredSee the response example for representative data.
meal_classified_atstring · requiredSee the response example for representative data.
meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meal_behavior_versionstring · requiredSee the response example for representative data.
meal_behavior_detected_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PATCH

Update a meal

/api/v1/meals/{mealId}

Updates an API-owned meal. Records created by another source cannot be modified by this app.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PATCH/api/v1/meals/{mealId}

Request

Make the request
bash
curl --request PATCH 'https://www.foodabcs.com/api/v1/meals/1042' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Chicken, quinoa, and kale bowl",
  "total_calories": 638
}'
Parameters
ParameterInTypeDescription
mealId*pathstringMeal identifier.Example: 1042
Request body
application/json · required
json
{
  "name": "Chicken, quinoa, and kale bowl",
  "total_calories": 638
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "1042",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "timestamp": "2026-06-29T18:30:00.000Z",
  "name": "Chicken, quinoa, and kale bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": "638",
  "meal_score": "A",
  "is_favorite": false,
  "meal_classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "meal_classification_version": "v1",
  "meal_classified_at": "2026-06-29T18:30:08.000Z",
  "meal_behavior_events": [],
  "meal_behavior_version": "v1",
  "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (22)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
timestampstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
ingredientsarray<object> · requiredSee the response example for representative data.
ingredients.namestring · requiredSee the response example for representative data.
ingredients.amountinteger · requiredSee the response example for representative data.
ingredients.unitstring · requiredSee the response example for representative data.
ingredients.nutritionobject · requiredSee the response example for representative data.
ingredients.nutrition.nutrientsarray<object> · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
meal_scorestring · requiredSee the response example for representative data.
is_favoriteboolean · requiredSee the response example for representative data.
meal_classificationsarray<object> · requiredSee the response example for representative data.
meal_classifications.keystring · requiredSee the response example for representative data.
meal_classifications.labelstring · requiredSee the response example for representative data.
meal_classification_versionstring · requiredSee the response example for representative data.
meal_classified_atstring · requiredSee the response example for representative data.
meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meal_behavior_versionstring · requiredSee the response example for representative data.
meal_behavior_detected_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
DELETE

Delete a meal

/api/v1/meals/{mealId}

Deletes an API-owned meal and returns the deleted identifier.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
DELETE/api/v1/meals/{mealId}

Request

Make the request
bash
curl --request DELETE 'https://www.foodabcs.com/api/v1/meals/1042' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
mealId*pathstringMeal identifier.Example: 1042

Response

Successful response
200

The request completed successfully.

json
{
  "deleted": true,
  "id": "1042"
}
Response fields (2)
FieldTypeMeaning
deletedboolean · requiredSee the response example for representative data.
idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get a meal grade

/api/v1/meals/{mealId}/grade

Returns the current grade and asynchronous classifications for one meal.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/meals/{mealId}/grade

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042/grade' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
mealId*pathstringMeal identifier.Example: 1042

Response

Successful response
200

The request completed successfully.

json
{
  "meal_id": "1042",
  "grade": "A",
  "classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "classified_at": "2026-06-29T18:30:08.000Z"
}
Response fields (6)
FieldTypeMeaning
meal_idstring · requiredSee the response example for representative data.
gradestring · requiredSee the response example for representative data.
classificationsarray<object> · requiredSee the response example for representative data.
classifications.keystring · requiredSee the response example for representative data.
classifications.labelstring · requiredSee the response example for representative data.
classified_atstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List meal grades

/api/v1/meals/grades

Lists meal identifiers, timestamps, and grades for a date range.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/meals/grades

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals/grades?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z&limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "1042",
      "timestamp": "2026-06-29T18:30:00.000Z",
      "meal_score": "A"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (5)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.timestampstring · requiredSee the response example for representative data.
data.meal_scorestring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get expanded meal data

/api/v1/meals/{mealId}/expanded

Returns a meal with nutrient warehouse rows and normalized ingredient-history records.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/meals/{mealId}/expanded

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042/expanded' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
mealId*pathstringMeal identifier.Example: 1042

Response

Successful response
200

The request completed successfully.

json
{
  "id": "1042",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "timestamp": "2026-06-29T18:30:00.000Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "meal_id": "1042",
      "meal_timestamp": "2026-06-29T18:30:00.000Z",
      "meal_slot": "dinner",
      "ingredient_position": 0,
      "source_food_id": "food_123",
      "display_name": "Grilled chicken breast",
      "brand_name": "FoodABCs",
      "barcode": "012345678905",
      "selected_amount": "5",
      "selected_unit": "oz",
      "entry_source": "api",
      "nutrition_snapshot": {
        "calories": 234,
        "protein": 44
      },
      "search_keywords": [
        "chicken",
        "grilled"
      ],
      "created_at": "2026-06-29T18:30:08.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "total_calories": "612",
  "meal_score": "A",
  "is_favorite": false,
  "meal_classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "meal_classification_version": "v1",
  "meal_classified_at": "2026-06-29T18:30:08.000Z",
  "meal_behavior_events": [],
  "meal_behavior_version": "v1",
  "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7",
  "nutrients": [
    {
      "meal_id": "1042",
      "nutrient_key": "protein",
      "nutrient_name": "Protein",
      "nutrient_unit": "g",
      "nutrient_amount": "48",
      "created_at": "2026-06-29T18:30:08.000Z"
    }
  ]
}
Response fields (42)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
timestampstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
ingredientsarray<object> · requiredSee the response example for representative data.
ingredients.idstring · requiredSee the response example for representative data.
ingredients.meal_idstring · requiredSee the response example for representative data.
ingredients.meal_timestampstring · requiredSee the response example for representative data.
ingredients.meal_slotstring · requiredSee the response example for representative data.
ingredients.ingredient_positioninteger · requiredSee the response example for representative data.
ingredients.source_food_idstring · requiredSee the response example for representative data.
ingredients.display_namestring · requiredSee the response example for representative data.
ingredients.brand_namestring · requiredSee the response example for representative data.
ingredients.barcodestring · requiredSee the response example for representative data.
ingredients.selected_amountstring · requiredSee the response example for representative data.
ingredients.selected_unitstring · requiredSee the response example for representative data.
ingredients.entry_sourcestring · requiredSee the response example for representative data.
ingredients.nutrition_snapshotobject · requiredSee the response example for representative data.
ingredients.nutrition_snapshot.caloriesinteger · requiredSee the response example for representative data.
ingredients.nutrition_snapshot.proteininteger · requiredSee the response example for representative data.
ingredients.search_keywordsarray<string> · requiredSee the response example for representative data.
ingredients.created_atstring · requiredSee the response example for representative data.
ingredients.source_app_idstring · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
meal_scorestring · requiredSee the response example for representative data.
is_favoriteboolean · requiredSee the response example for representative data.
meal_classificationsarray<object> · requiredSee the response example for representative data.
meal_classifications.keystring · requiredSee the response example for representative data.
meal_classifications.labelstring · requiredSee the response example for representative data.
meal_classification_versionstring · requiredSee the response example for representative data.
meal_classified_atstring · requiredSee the response example for representative data.
meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meal_behavior_versionstring · requiredSee the response example for representative data.
meal_behavior_detected_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
nutrientsarray<object> · requiredSee the response example for representative data.
nutrients.meal_idstring · requiredSee the response example for representative data.
nutrients.nutrient_keystring · requiredSee the response example for representative data.
nutrients.nutrient_namestring · requiredSee the response example for representative data.
nutrients.nutrient_unitstring · requiredSee the response example for representative data.
nutrients.nutrient_amountstring · requiredSee the response example for representative data.
nutrients.created_atstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get meal insights

/api/v1/meals/insights

Aggregates meal grades, classifications, nutrients, and food-behavior signals over a date range.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.02 T1 · $0.04 T2
GET/api/v1/meals/insights

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/meals/insights?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z

Response

Successful response
200

The request completed successfully.

json
{
  "period": {
    "from": "2026-06-01T00:00:00.000Z",
    "to": "2026-06-30T23:59:59.000Z"
  },
  "meal_count": 62,
  "average_calories": "548.7",
  "grade_distribution": [
    {
      "grade": "A",
      "count": 29
    },
    {
      "grade": "B",
      "count": 21
    }
  ],
  "top_classifications": [
    {
      "classification": "high_protein",
      "count": 18
    }
  ],
  "nutrient_daily_averages": {
    "protein": "94.2",
    "fiber": "24.6",
    "sodium": "1880"
  },
  "behavior_summary": [
    {
      "event_type": "late_night_eating",
      "count": 3
    }
  ]
}
Response fields (18)
FieldTypeMeaning
periodobject · requiredSee the response example for representative data.
period.fromstring · requiredSee the response example for representative data.
period.tostring · requiredSee the response example for representative data.
meal_countinteger · requiredSee the response example for representative data.
average_caloriesstring · requiredSee the response example for representative data.
grade_distributionarray<object> · requiredSee the response example for representative data.
grade_distribution.gradestring · requiredSee the response example for representative data.
grade_distribution.countinteger · requiredSee the response example for representative data.
top_classificationsarray<object> · requiredSee the response example for representative data.
top_classifications.classificationstring · requiredSee the response example for representative data.
top_classifications.countinteger · requiredSee the response example for representative data.
nutrient_daily_averagesobject · requiredSee the response example for representative data.
nutrient_daily_averages.proteinstring · requiredSee the response example for representative data.
nutrient_daily_averages.fiberstring · requiredSee the response example for representative data.
nutrient_daily_averages.sodiumstring · requiredSee the response example for representative data.
behavior_summaryarray<object> · requiredSee the response example for representative data.
behavior_summary.event_typestring · requiredSee the response example for representative data.
behavior_summary.countinteger · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List favorite meals

/api/v1/favorite-meals

Lists favorite meal templates visible to the user.

AuthOAuth user access tokenScopemeals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/favorite-meals

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/favorite-meals?limit=25' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
limitqueryintegerNumber of records to return (1–100).Example: 25

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "1042",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "created_at": "2026-06-20T12:00:00.000Z",
      "name": "Chicken quinoa bowl",
      "ingredients": [
        {
          "name": "Grilled chicken breast",
          "amount": 5,
          "unit": "oz",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 234,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 44,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 0,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 5,
                "unit": "g"
              }
            ]
          }
        },
        {
          "name": "Cooked quinoa",
          "amount": 1,
          "unit": "cup",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 222,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 8,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 39,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 4,
                "unit": "g"
              }
            ]
          }
        }
      ],
      "total_calories": "612",
      "meal_score": "A",
      "meal_classifications": [
        {
          "key": "high_protein",
          "label": "High protein"
        }
      ],
      "meal_classification_version": "v1",
      "meal_classified_at": "2026-06-20T12:00:08.000Z",
      "meal_behavior_events": [],
      "meal_behavior_version": "v1",
      "meal_behavior_detected_at": "2026-06-20T12:00:08.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (21)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.namestring · requiredSee the response example for representative data.
data.ingredientsarray<object> · requiredSee the response example for representative data.
data.ingredients.namestring · requiredSee the response example for representative data.
data.ingredients.amountinteger · requiredSee the response example for representative data.
data.ingredients.unitstring · requiredSee the response example for representative data.
data.ingredients.nutritionobject · requiredSee the response example for representative data.
data.total_caloriesstring · requiredSee the response example for representative data.
data.meal_scorestring · requiredSee the response example for representative data.
data.meal_classificationsarray<object> · requiredSee the response example for representative data.
data.meal_classifications.keystring · requiredSee the response example for representative data.
data.meal_classifications.labelstring · requiredSee the response example for representative data.
data.meal_classification_versionstring · requiredSee the response example for representative data.
data.meal_classified_atstring · requiredSee the response example for representative data.
data.meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
data.meal_behavior_versionstring · requiredSee the response example for representative data.
data.meal_behavior_detected_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Create a favorite meal

/api/v1/favorite-meals

Creates an API-owned favorite template and returns its calculated meal grade.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/favorite-meals

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/favorite-meals' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": 612
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": 612
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "1042",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "created_at": "2026-06-20T12:00:00.000Z",
  "name": "Chicken quinoa bowl",
  "ingredients": [
    {
      "name": "Grilled chicken breast",
      "amount": 5,
      "unit": "oz",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 234,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 44,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 0,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 5,
            "unit": "g"
          }
        ]
      }
    },
    {
      "name": "Cooked quinoa",
      "amount": 1,
      "unit": "cup",
      "nutrition": {
        "nutrients": [
          {
            "name": "Calories",
            "amount": 222,
            "unit": "kcal"
          },
          {
            "name": "Protein",
            "amount": 8,
            "unit": "g"
          },
          {
            "name": "Carbohydrates",
            "amount": 39,
            "unit": "g"
          },
          {
            "name": "Fat",
            "amount": 4,
            "unit": "g"
          }
        ]
      }
    }
  ],
  "total_calories": "612",
  "meal_score": "A",
  "meal_classifications": [
    {
      "key": "high_protein",
      "label": "High protein"
    }
  ],
  "meal_classification_version": "v1",
  "meal_classified_at": "2026-06-20T12:00:08.000Z",
  "meal_behavior_events": [],
  "meal_behavior_version": "v1",
  "meal_behavior_detected_at": "2026-06-20T12:00:08.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (21)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
ingredientsarray<object> · requiredSee the response example for representative data.
ingredients.namestring · requiredSee the response example for representative data.
ingredients.amountinteger · requiredSee the response example for representative data.
ingredients.unitstring · requiredSee the response example for representative data.
ingredients.nutritionobject · requiredSee the response example for representative data.
ingredients.nutrition.nutrientsarray<object> · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
meal_scorestring · requiredSee the response example for representative data.
meal_classificationsarray<object> · requiredSee the response example for representative data.
meal_classifications.keystring · requiredSee the response example for representative data.
meal_classifications.labelstring · requiredSee the response example for representative data.
meal_classification_versionstring · requiredSee the response example for representative data.
meal_classified_atstring · requiredSee the response example for representative data.
meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meal_behavior_versionstring · requiredSee the response example for representative data.
meal_behavior_detected_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
DELETE

Delete a favorite meal

/api/v1/favorite-meals/{favoriteId}

Deletes an API-owned favorite template.

AuthOAuth user access tokenScopemeals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
DELETE/api/v1/favorite-meals/{favoriteId}

Request

Make the request
bash
curl --request DELETE 'https://www.foodabcs.com/api/v1/favorite-meals/1042' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
favoriteId*pathstringFavorite meal identifier.Example: 1042

Response

Successful response
200

The request completed successfully.

json
{
  "deleted": true,
  "id": "1042"
}
Response fields (2)
FieldTypeMeaning
deletedboolean · requiredSee the response example for representative data.
idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List food behavior events

/api/v1/food-behavior-events

Lists detected food-behavior events in reverse chronological order.

AuthOAuth user access tokenScopebehaviors.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/food-behavior-events

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/food-behavior-events?limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI&event_type=late_night_eating' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI
event_typequerystringFilter to one behavior event type.Example: late_night_eating

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "meal_id": "1042",
      "event_type": "late_night_eating",
      "event_value": "0.82",
      "heat_score": 72,
      "confidence": "0.91",
      "recorded_at": "2026-06-29T22:35:00.000Z",
      "source": "meal_ai",
      "behavior_version": "v1",
      "notes": "Meal recorded after the local late-night threshold.",
      "metadata": {
        "local_hour": 22
      },
      "created_at": "2026-06-29T22:35:05.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (17)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.meal_idstring · requiredSee the response example for representative data.
data.event_typestring · requiredSee the response example for representative data.
data.event_valuestring · requiredSee the response example for representative data.
data.heat_scoreinteger · requiredSee the response example for representative data.
data.confidencestring · requiredSee the response example for representative data.
data.recorded_atstring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.behavior_versionstring · requiredSee the response example for representative data.
data.notesstring · requiredSee the response example for representative data.
data.metadataobject · requiredSee the response example for representative data.
data.metadata.local_hourinteger · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Workouts

7 operations

Link to group
POST

Create a workout

/api/v1/workouts

Creates an API workout. Supplying the same original_id again returns the existing workout with deduplicated true.

AuthOAuth user access tokenScopeworkouts.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/workouts

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/workouts' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "Outdoor Run",
  "start_time": "2026-06-28T13:00:00.000Z",
  "end_time": "2026-06-28T13:32:00.000Z",
  "duration_minutes": 32,
  "calories_burned": 348,
  "average_heart_rate": 151,
  "distance_meters": 5020,
  "steps": 6234,
  "original_id": "run-2026-06-28",
  "raw_type": "running"
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "type": "Outdoor Run",
  "start_time": "2026-06-28T13:00:00.000Z",
  "end_time": "2026-06-28T13:32:00.000Z",
  "duration_minutes": 32,
  "calories_burned": 348,
  "average_heart_rate": 151,
  "distance_meters": 5020,
  "steps": 6234,
  "original_id": "run-2026-06-28",
  "raw_type": "running"
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "type": "Outdoor Run",
  "start_time": "2026-06-28T13:00:00.000Z",
  "end_time": "2026-06-28T13:32:00.000Z",
  "duration_minutes": 32,
  "calories_burned": 348,
  "average_heart_rate": 151,
  "min_heart_rate": 104,
  "max_heart_rate": 174,
  "heart_rate_samples": [
    {
      "offset_seconds": 60,
      "bpm": 132
    }
  ],
  "distance_meters": 5020,
  "steps": 6234,
  "elevation_gain_meters": 41,
  "average_speed_mps": 2.61,
  "max_speed_mps": 3.9,
  "average_power_watts": 248,
  "average_cadence": 168,
  "calorie_samples": [
    {
      "offset_seconds": 300,
      "calories": 54
    }
  ],
  "provider": "api",
  "original_id": "run-2026-06-28",
  "grade": "A",
  "synced_at": "2026-06-28T13:33:00.000Z",
  "created_at": "2026-06-28T13:33:00.000Z",
  "updated_at": "2026-06-28T13:33:00.000Z",
  "raw_type": "running",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (31)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
typestring · requiredSee the response example for representative data.
start_timestring · requiredSee the response example for representative data.
end_timestring · requiredSee the response example for representative data.
duration_minutesinteger · requiredSee the response example for representative data.
calories_burnedinteger · requiredSee the response example for representative data.
average_heart_rateinteger · requiredSee the response example for representative data.
min_heart_rateinteger · requiredSee the response example for representative data.
max_heart_rateinteger · requiredSee the response example for representative data.
heart_rate_samplesarray<object> · requiredSee the response example for representative data.
heart_rate_samples.offset_secondsinteger · requiredSee the response example for representative data.
heart_rate_samples.bpminteger · requiredSee the response example for representative data.
distance_metersinteger · requiredSee the response example for representative data.
stepsinteger · requiredSee the response example for representative data.
elevation_gain_metersinteger · requiredSee the response example for representative data.
average_speed_mpsnumber · requiredSee the response example for representative data.
max_speed_mpsnumber · requiredSee the response example for representative data.
average_power_wattsinteger · requiredSee the response example for representative data.
average_cadenceinteger · requiredSee the response example for representative data.
calorie_samplesarray<object> · requiredSee the response example for representative data.
calorie_samples.offset_secondsinteger · requiredSee the response example for representative data.
calorie_samples.caloriesinteger · requiredSee the response example for representative data.
providerstring · requiredSee the response example for representative data.
original_idstring · requiredSee the response example for representative data.
gradestring · requiredSee the response example for representative data.
synced_atstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
updated_atstring · requiredSee the response example for representative data.
raw_typestring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List workouts

/api/v1/workouts

Lists workouts across all sources in reverse chronological order.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/workouts

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z&limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "type": "Outdoor Run",
      "start_time": "2026-06-28T13:00:00.000Z",
      "end_time": "2026-06-28T13:32:00.000Z",
      "duration_minutes": 32,
      "calories_burned": 348,
      "average_heart_rate": 151,
      "min_heart_rate": 104,
      "max_heart_rate": 174,
      "heart_rate_samples": [
        {
          "offset_seconds": 60,
          "bpm": 132
        }
      ],
      "distance_meters": 5020,
      "steps": 6234,
      "elevation_gain_meters": 41,
      "average_speed_mps": 2.61,
      "max_speed_mps": 3.9,
      "average_power_watts": 248,
      "average_cadence": 168,
      "calorie_samples": [
        {
          "offset_seconds": 300,
          "calories": 54
        }
      ],
      "provider": "api",
      "original_id": "run-2026-06-28",
      "grade": "A",
      "synced_at": "2026-06-28T13:33:00.000Z",
      "created_at": "2026-06-28T13:33:00.000Z",
      "updated_at": "2026-06-28T13:33:00.000Z",
      "raw_type": "running",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (33)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.typestring · requiredSee the response example for representative data.
data.start_timestring · requiredSee the response example for representative data.
data.end_timestring · requiredSee the response example for representative data.
data.duration_minutesinteger · requiredSee the response example for representative data.
data.calories_burnedinteger · requiredSee the response example for representative data.
data.average_heart_rateinteger · requiredSee the response example for representative data.
data.min_heart_rateinteger · requiredSee the response example for representative data.
data.max_heart_rateinteger · requiredSee the response example for representative data.
data.heart_rate_samplesarray<object> · requiredSee the response example for representative data.
data.heart_rate_samples.offset_secondsinteger · requiredSee the response example for representative data.
data.heart_rate_samples.bpminteger · requiredSee the response example for representative data.
data.distance_metersinteger · requiredSee the response example for representative data.
data.stepsinteger · requiredSee the response example for representative data.
data.elevation_gain_metersinteger · requiredSee the response example for representative data.
data.average_speed_mpsnumber · requiredSee the response example for representative data.
data.max_speed_mpsnumber · requiredSee the response example for representative data.
data.average_power_wattsinteger · requiredSee the response example for representative data.
data.average_cadenceinteger · requiredSee the response example for representative data.
data.calorie_samplesarray<object> · requiredSee the response example for representative data.
data.calorie_samples.offset_secondsinteger · requiredSee the response example for representative data.
data.calorie_samples.caloriesinteger · requiredSee the response example for representative data.
data.providerstring · requiredSee the response example for representative data.
data.original_idstring · requiredSee the response example for representative data.
data.gradestring · requiredSee the response example for representative data.
data.synced_atstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.updated_atstring · requiredSee the response example for representative data.
data.raw_typestring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get a workout

/api/v1/workouts/{workoutId}

Returns one workout visible to the current user.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/workouts/{workoutId}

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts/api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
workoutId*pathstringWorkout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f

Response

Successful response
200

The request completed successfully.

json
{
  "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "type": "Outdoor Run",
  "start_time": "2026-06-28T13:00:00.000Z",
  "end_time": "2026-06-28T13:32:00.000Z",
  "duration_minutes": 32,
  "calories_burned": 348,
  "average_heart_rate": 151,
  "min_heart_rate": 104,
  "max_heart_rate": 174,
  "heart_rate_samples": [
    {
      "offset_seconds": 60,
      "bpm": 132
    }
  ],
  "distance_meters": 5020,
  "steps": 6234,
  "elevation_gain_meters": 41,
  "average_speed_mps": 2.61,
  "max_speed_mps": 3.9,
  "average_power_watts": 248,
  "average_cadence": 168,
  "calorie_samples": [
    {
      "offset_seconds": 300,
      "calories": 54
    }
  ],
  "provider": "api",
  "original_id": "run-2026-06-28",
  "grade": "A",
  "synced_at": "2026-06-28T13:33:00.000Z",
  "created_at": "2026-06-28T13:33:00.000Z",
  "updated_at": "2026-06-28T13:33:00.000Z",
  "raw_type": "running",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (31)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
typestring · requiredSee the response example for representative data.
start_timestring · requiredSee the response example for representative data.
end_timestring · requiredSee the response example for representative data.
duration_minutesinteger · requiredSee the response example for representative data.
calories_burnedinteger · requiredSee the response example for representative data.
average_heart_rateinteger · requiredSee the response example for representative data.
min_heart_rateinteger · requiredSee the response example for representative data.
max_heart_rateinteger · requiredSee the response example for representative data.
heart_rate_samplesarray<object> · requiredSee the response example for representative data.
heart_rate_samples.offset_secondsinteger · requiredSee the response example for representative data.
heart_rate_samples.bpminteger · requiredSee the response example for representative data.
distance_metersinteger · requiredSee the response example for representative data.
stepsinteger · requiredSee the response example for representative data.
elevation_gain_metersinteger · requiredSee the response example for representative data.
average_speed_mpsnumber · requiredSee the response example for representative data.
max_speed_mpsnumber · requiredSee the response example for representative data.
average_power_wattsinteger · requiredSee the response example for representative data.
average_cadenceinteger · requiredSee the response example for representative data.
calorie_samplesarray<object> · requiredSee the response example for representative data.
calorie_samples.offset_secondsinteger · requiredSee the response example for representative data.
calorie_samples.caloriesinteger · requiredSee the response example for representative data.
providerstring · requiredSee the response example for representative data.
original_idstring · requiredSee the response example for representative data.
gradestring · requiredSee the response example for representative data.
synced_atstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
updated_atstring · requiredSee the response example for representative data.
raw_typestring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get a workout grade

/api/v1/workouts/{workoutId}/grade

Returns the calculated grade for one workout.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/workouts/{workoutId}/grade

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts/api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f/grade' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
workoutId*pathstringWorkout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f

Response

Successful response
200

The request completed successfully.

json
{
  "workout_id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
  "grade": "A"
}
Response fields (2)
FieldTypeMeaning
workout_idstring · requiredSee the response example for representative data.
gradestring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List workout grades

/api/v1/workouts/grades

Lists workout identifiers, start times, and grades for a date range.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/workouts/grades

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts/grades?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z&limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
      "start_time": "2026-06-28T13:00:00.000Z",
      "grade": "A"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (5)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.start_timestring · requiredSee the response example for representative data.
data.gradestring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get expanded workout data

/api/v1/workouts/{workoutId}/expanded

Returns the complete workout, including heart-rate and calorie sample arrays when recorded.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/workouts/{workoutId}/expanded

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts/api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f/expanded' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
workoutId*pathstringWorkout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f

Response

Successful response
200

The request completed successfully.

json
{
  "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "type": "Outdoor Run",
  "start_time": "2026-06-28T13:00:00.000Z",
  "end_time": "2026-06-28T13:32:00.000Z",
  "duration_minutes": 32,
  "calories_burned": 348,
  "average_heart_rate": 151,
  "min_heart_rate": 104,
  "max_heart_rate": 174,
  "heart_rate_samples": [
    {
      "offset_seconds": 60,
      "bpm": 132
    }
  ],
  "distance_meters": 5020,
  "steps": 6234,
  "elevation_gain_meters": 41,
  "average_speed_mps": 2.61,
  "max_speed_mps": 3.9,
  "average_power_watts": 248,
  "average_cadence": 168,
  "calorie_samples": [
    {
      "offset_seconds": 300,
      "calories": 54
    }
  ],
  "provider": "api",
  "original_id": "run-2026-06-28",
  "grade": "A",
  "synced_at": "2026-06-28T13:33:00.000Z",
  "created_at": "2026-06-28T13:33:00.000Z",
  "updated_at": "2026-06-28T13:33:00.000Z",
  "raw_type": "running",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (31)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
typestring · requiredSee the response example for representative data.
start_timestring · requiredSee the response example for representative data.
end_timestring · requiredSee the response example for representative data.
duration_minutesinteger · requiredSee the response example for representative data.
calories_burnedinteger · requiredSee the response example for representative data.
average_heart_rateinteger · requiredSee the response example for representative data.
min_heart_rateinteger · requiredSee the response example for representative data.
max_heart_rateinteger · requiredSee the response example for representative data.
heart_rate_samplesarray<object> · requiredSee the response example for representative data.
heart_rate_samples.offset_secondsinteger · requiredSee the response example for representative data.
heart_rate_samples.bpminteger · requiredSee the response example for representative data.
distance_metersinteger · requiredSee the response example for representative data.
stepsinteger · requiredSee the response example for representative data.
elevation_gain_metersinteger · requiredSee the response example for representative data.
average_speed_mpsnumber · requiredSee the response example for representative data.
max_speed_mpsnumber · requiredSee the response example for representative data.
average_power_wattsinteger · requiredSee the response example for representative data.
average_cadenceinteger · requiredSee the response example for representative data.
calorie_samplesarray<object> · requiredSee the response example for representative data.
calorie_samples.offset_secondsinteger · requiredSee the response example for representative data.
calorie_samples.caloriesinteger · requiredSee the response example for representative data.
providerstring · requiredSee the response example for representative data.
original_idstring · requiredSee the response example for representative data.
gradestring · requiredSee the response example for representative data.
synced_atstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
updated_atstring · requiredSee the response example for representative data.
raw_typestring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get workout insights

/api/v1/workouts/insights

Aggregates volume, calories, heart rate, grades, and workout types over a date range.

AuthOAuth user access tokenScopeworkouts.readTierAll tiersPrice$0.02 T1 · $0.04 T2
GET/api/v1/workouts/insights

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/workouts/insights?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z

Response

Successful response
200

The request completed successfully.

json
{
  "period": {
    "from": "2026-06-01T00:00:00.000Z",
    "to": "2026-06-30T23:59:59.000Z"
  },
  "workout_count": 18,
  "total_minutes": 624,
  "total_calories": "6410",
  "grade_distribution": [
    {
      "grade": "A",
      "count": 10
    },
    {
      "grade": "B",
      "count": 6
    }
  ],
  "by_type": [
    {
      "type": "Outdoor Run",
      "count": 7
    }
  ],
  "avg_heart_rate": "143.2"
}
Response fields (13)
FieldTypeMeaning
periodobject · requiredSee the response example for representative data.
period.fromstring · requiredSee the response example for representative data.
period.tostring · requiredSee the response example for representative data.
workout_countinteger · requiredSee the response example for representative data.
total_minutesinteger · requiredSee the response example for representative data.
total_caloriesstring · requiredSee the response example for representative data.
grade_distributionarray<object> · requiredSee the response example for representative data.
grade_distribution.gradestring · requiredSee the response example for representative data.
grade_distribution.countinteger · requiredSee the response example for representative data.
by_typearray<object> · requiredSee the response example for representative data.
by_type.typestring · requiredSee the response example for representative data.
by_type.countinteger · requiredSee the response example for representative data.
avg_heart_ratestring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Mood

3 operations

Link to group
POST

Create a mood entry

/api/v1/moods

Creates an API-owned mood entry. mood_value must be an integer from 1 (Very Low) through 5 (Great).

AuthOAuth user access tokenScopemoods.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/moods

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/moods' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "mood_value": 4,
  "note": "Good energy after lunch.",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver",
  "recorded_at": "2026-06-29T20:15:00Z"
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "mood_value": 4,
  "note": "Good energy after lunch.",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver",
  "recorded_at": "2026-06-29T20:15:00Z"
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "7fd304e1-7823-4352-a855-33d0da83bf28",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "mood_value": 4,
  "mood_key": "good",
  "mood_label": "Good",
  "mood_emoji": "🙂",
  "note": "Good energy after lunch.",
  "source": "api",
  "meal_log_id": "1042",
  "recorded_at": "2026-06-29T20:15:00.000Z",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver",
  "created_at": "2026-06-29T20:15:01.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (14)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
mood_valueinteger · requiredSee the response example for representative data.
mood_keystring · requiredSee the response example for representative data.
mood_labelstring · requiredSee the response example for representative data.
mood_emojistring · requiredSee the response example for representative data.
notestring · requiredSee the response example for representative data.
sourcestring · requiredSee the response example for representative data.
meal_log_idstring · requiredSee the response example for representative data.
recorded_atstring · requiredSee the response example for representative data.
local_entry_datestring · requiredSee the response example for representative data.
timezonestring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List mood entries

/api/v1/moods

Lists mood entries in reverse chronological order. Notes are omitted unless include_notes=true.

AuthOAuth user access tokenScopemoods.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/moods

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/moods?limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI&include_notes=true' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI
include_notesquerybooleanInclude the private note field in each mood entry.Example: true

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "7fd304e1-7823-4352-a855-33d0da83bf28",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "mood_value": 4,
      "mood_key": "good",
      "mood_label": "Good",
      "mood_emoji": "🙂",
      "note": "Good energy after lunch.",
      "source": "api",
      "meal_log_id": "1042",
      "recorded_at": "2026-06-29T20:15:00.000Z",
      "local_entry_date": "2026-06-29",
      "timezone": "America/Denver",
      "created_at": "2026-06-29T20:15:01.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (16)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.mood_valueinteger · requiredSee the response example for representative data.
data.mood_keystring · requiredSee the response example for representative data.
data.mood_labelstring · requiredSee the response example for representative data.
data.mood_emojistring · requiredSee the response example for representative data.
data.notestring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.meal_log_idstring · requiredSee the response example for representative data.
data.recorded_atstring · requiredSee the response example for representative data.
data.local_entry_datestring · requiredSee the response example for representative data.
data.timezonestring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Record a mood response

/api/v1/moods/{moodId}/responses

Records the submitted prompt action for an API-owned mood entry. Repeated submissions for the same local date are deduplicated.

AuthOAuth user access tokenScopemoods.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/moods/{moodId}/responses

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/moods/7fd304e1-7823-4352-a855-33d0da83bf28/responses' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "action": "submitted",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver"
}'
Parameters
ParameterInTypeDescription
moodId*pathstringMood entry identifier.Example: 7fd304e1-7823-4352-a855-33d0da83bf28
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "action": "submitted",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver"
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "local_entry_date": "2026-06-29",
  "timezone": "America/Denver",
  "action": "submitted",
  "mood_entry_id": "7fd304e1-7823-4352-a855-33d0da83bf28",
  "recorded_at": "2026-06-29T20:15:00.000Z"
}
Response fields (7)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
local_entry_datestring · requiredSee the response example for representative data.
timezonestring · requiredSee the response example for representative data.
actionstring · requiredSee the response example for representative data.
mood_entry_idstring · requiredSee the response example for representative data.
recorded_atstring · requiredSee the response example for representative data.
Error responses (9)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Wellness

2 operations

Link to group
GET

Get latest wellness metrics

/api/v1/wellness/metrics

Returns the latest value for each supported wellness metric. An account with no exam snapshots returns a null snapshot_at and an empty metrics object.

AuthOAuth user access tokenScopewellness.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/wellness/metrics

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/wellness/metrics' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "snapshot_at": "2026-06-15T16:00:00.000Z",
  "metrics": {
    "height": "70",
    "weight": "176.4",
    "bmi": "25.3",
    "systolic_bp": 118,
    "diastolic_bp": 76,
    "body_temp_f": "98.4",
    "resting_hr": 62,
    "respiratory_rate": 14
  }
}
Response fields (10)
FieldTypeMeaning
snapshot_atstring · requiredSee the response example for representative data.
metricsobject · requiredSee the response example for representative data.
metrics.heightstring · requiredSee the response example for representative data.
metrics.weightstring · requiredSee the response example for representative data.
metrics.bmistring · requiredSee the response example for representative data.
metrics.systolic_bpinteger · requiredSee the response example for representative data.
metrics.diastolic_bpinteger · requiredSee the response example for representative data.
metrics.body_temp_fstring · requiredSee the response example for representative data.
metrics.resting_hrinteger · requiredSee the response example for representative data.
metrics.respiratory_rateinteger · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get metric history

/api/v1/wellness/metrics/{metricKey}

Lists the history for one supported metric: height, weight, bmi, systolic_bp, diastolic_bp, body_temp_f, resting_hr, or respiratory_rate.

AuthOAuth user access tokenScopewellness.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/wellness/metrics/{metricKey}

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/wellness/metrics/weight?limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
metricKey*pathstringSupported wellness metric key.Example: weight
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "296d2c48-e9ab-44b8-a988-7b7332640af4",
      "snapshot_at": "2026-06-15T16:00:00.000Z",
      "value": "176.4",
      "source": "api",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (7)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.snapshot_atstring · requiredSee the response example for representative data.
data.valuestring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Goals

4 operations

Link to group
GET

Get wellness goals

/api/v1/goals/wellness

Returns active wellness goals across visible sources.

AuthOAuth user access tokenScopegoals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/goals/wellness

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/goals/wellness' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "goal": "Improve Cardiovascular Health",
      "created_at": "2026-05-03T15:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (5)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.goalstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PUT

Replace wellness goals

/api/v1/goals/wellness

Replaces this app’s active wellness goals with one to three supported goal names and returns all active goals.

AuthOAuth user access tokenScopegoals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PUT/api/v1/goals/wellness

Request

Make the request
bash
curl --request PUT 'https://www.foodabcs.com/api/v1/goals/wellness' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "goals": [
    "Improve Cardiovascular Health",
    "Better Sleep Quality"
  ]
}'
Parameters

This request has no path or query parameters.

Request body
application/json · required
json
{
  "goals": [
    "Improve Cardiovascular Health",
    "Better Sleep Quality"
  ]
}

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "goal": "Improve Cardiovascular Health",
      "created_at": "2026-06-29T15:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    },
    {
      "id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc",
      "goal": "Better Sleep Quality",
      "created_at": "2026-06-29T15:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (5)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.goalstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get nutrition goals

/api/v1/goals/nutrition

Returns current nutrition goals and records whether each value came from the user or another source.

AuthOAuth user access tokenScopegoals.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/goals/nutrition

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/goals/nutrition' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "metric_id": "protein",
      "target_value": "120",
      "target_unit": "g",
      "goal_kind": "daily_target",
      "source": "user_override",
      "created_at": "2026-05-03T15:00:00.000Z",
      "updated_at": "2026-06-29T15:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (10)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.metric_idstring · requiredSee the response example for representative data.
data.target_valuestring · requiredSee the response example for representative data.
data.target_unitstring · requiredSee the response example for representative data.
data.goal_kindstring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.updated_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PUT

Upsert nutrition goals

/api/v1/goals/nutrition

Upserts this app’s nutrition targets by metric_id and goal_kind, then returns all current nutrition goals; omitted goals are not deleted.

AuthOAuth user access tokenScopegoals.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PUT/api/v1/goals/nutrition

Request

Make the request
bash
curl --request PUT 'https://www.foodabcs.com/api/v1/goals/nutrition' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "goals": [
    {
      "metric_id": "protein",
      "target_value": 120,
      "target_unit": "g",
      "goal_kind": "daily_target"
    }
  ]
}'
Parameters

This request has no path or query parameters.

Request body
application/json · required
json
{
  "goals": [
    {
      "metric_id": "protein",
      "target_value": 120,
      "target_unit": "g",
      "goal_kind": "daily_target"
    }
  ]
}

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "metric_id": "protein",
      "target_value": "120",
      "target_unit": "g",
      "goal_kind": "daily_target",
      "source": "user_override",
      "created_at": "2026-05-03T15:00:00.000Z",
      "updated_at": "2026-06-29T15:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (10)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.metric_idstring · requiredSee the response example for representative data.
data.target_valuestring · requiredSee the response example for representative data.
data.target_unitstring · requiredSee the response example for representative data.
data.goal_kindstring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.updated_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Health records

11 operations

Link to group
GET

Get latest physical exam

/api/v1/physical-exams/latest

Returns the latest physical-exam snapshot, or an empty JSON object when no snapshot exists.

AuthOAuth user access tokenScopeexams.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/physical-exams/latest

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/physical-exams/latest' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "id": "296d2c48-e9ab-44b8-a988-7b7332640af4",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "snapshot_at": "2026-06-15T16:00:00.000Z",
  "source": "api",
  "height": "70",
  "weight": "176.4",
  "bmi": "25.3",
  "systolic_bp": 118,
  "diastolic_bp": 76,
  "body_temp_f": "98.4",
  "resting_hr": 62,
  "respiratory_rate": 14,
  "created_at": "2026-06-15T16:00:01.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

List physical exams

/api/v1/physical-exams

Lists physical-exam snapshots in reverse chronological order.

AuthOAuth user access tokenScopeexams.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/physical-exams

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/physical-exams?limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
limitqueryintegerNumber of records to return (1–100).Example: 25
cursorquerystringOpaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "296d2c48-e9ab-44b8-a988-7b7332640af4",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "snapshot_at": "2026-06-15T16:00:00.000Z",
      "source": "api",
      "height": "70",
      "weight": "176.4",
      "bmi": "25.3",
      "systolic_bp": 118,
      "diastolic_bp": 76,
      "body_temp_f": "98.4",
      "resting_hr": 62,
      "respiratory_rate": 14,
      "created_at": "2026-06-15T16:00:01.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}
Response fields (16)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.snapshot_atstring · requiredSee the response example for representative data.
data.sourcestring · requiredSee the response example for representative data.
data.heightstring · requiredSee the response example for representative data.
data.weightstring · requiredSee the response example for representative data.
data.bmistring · requiredSee the response example for representative data.
data.systolic_bpinteger · requiredSee the response example for representative data.
data.diastolic_bpinteger · requiredSee the response example for representative data.
data.body_temp_fstring · requiredSee the response example for representative data.
data.resting_hrinteger · requiredSee the response example for representative data.
data.respiratory_rateinteger · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
next_cursorstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Create a physical exam

/api/v1/physical-exams

Creates an API-owned physical-exam snapshot. Omitted measurements are stored as null.

AuthOAuth user access tokenScopeexams.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/physical-exams

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/physical-exams' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "snapshot_at": "2026-06-15T16:00:00.000Z",
  "height": 70,
  "weight": 176.4,
  "bmi": 25.3,
  "systolic_bp": 118,
  "diastolic_bp": 76,
  "body_temp_f": 98.4,
  "resting_hr": 62,
  "respiratory_rate": 14
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "snapshot_at": "2026-06-15T16:00:00.000Z",
  "height": 70,
  "weight": 176.4,
  "bmi": 25.3,
  "systolic_bp": 118,
  "diastolic_bp": 76,
  "body_temp_f": 98.4,
  "resting_hr": 62,
  "respiratory_rate": 14
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "296d2c48-e9ab-44b8-a988-7b7332640af4",
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "snapshot_at": "2026-06-15T16:00:00.000Z",
  "source": "api",
  "height": "70",
  "weight": "176.4",
  "bmi": "25.3",
  "systolic_bp": 118,
  "diastolic_bp": 76,
  "body_temp_f": "98.4",
  "resting_hr": 62,
  "respiratory_rate": 14,
  "created_at": "2026-06-15T16:00:01.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (14)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
user_idstring · requiredSee the response example for representative data.
snapshot_atstring · requiredSee the response example for representative data.
sourcestring · requiredSee the response example for representative data.
heightstring · requiredSee the response example for representative data.
weightstring · requiredSee the response example for representative data.
bmistring · requiredSee the response example for representative data.
systolic_bpinteger · requiredSee the response example for representative data.
diastolic_bpinteger · requiredSee the response example for representative data.
body_temp_fstring · requiredSee the response example for representative data.
resting_hrinteger · requiredSee the response example for representative data.
respiratory_rateinteger · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get dietary restrictions

/api/v1/dietary-restrictions

Returns active dietary restrictions across visible sources.

AuthOAuth user access tokenScoperestrictions.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/dietary-restrictions

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/dietary-restrictions' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "restriction": "Tree nuts",
      "created_at": "2026-04-12T18:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (5)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.restrictionstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PUT

Replace dietary restrictions

/api/v1/dietary-restrictions

Replaces this app’s active dietary restrictions and returns all active restrictions.

AuthOAuth user access tokenScoperestrictions.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PUT/api/v1/dietary-restrictions

Request

Make the request
bash
curl --request PUT 'https://www.foodabcs.com/api/v1/dietary-restrictions' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "restrictions": [
    "Tree nuts",
    "Shellfish"
  ]
}'
Parameters

This request has no path or query parameters.

Request body
application/json · required
json
{
  "restrictions": [
    "Tree nuts",
    "Shellfish"
  ]
}

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "restriction": "Tree nuts",
      "removed_at": null,
      "created_at": "2026-06-29T18:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    },
    {
      "id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "restriction": "Shellfish",
      "removed_at": null,
      "created_at": "2026-06-29T18:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (7)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.restrictionstring · requiredSee the response example for representative data.
data.removed_atstringnull · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get health conditions

/api/v1/conditions

Returns active conditions and optional diagnosed months.

AuthOAuth user access tokenScopeconditions.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/conditions

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/conditions' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "condition_key": "hypertension",
      "diagnosed_month": "2024-11",
      "created_at": "2026-04-12T18:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (6)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.condition_keystring · requiredSee the response example for representative data.
data.diagnosed_monthstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
PUT

Replace health conditions

/api/v1/conditions

Replaces this app’s active conditions. diagnosed_month uses YYYY-MM when known.

AuthOAuth user access tokenScopeconditions.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
PUT/api/v1/conditions

Request

Make the request
bash
curl --request PUT 'https://www.foodabcs.com/api/v1/conditions' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "conditions": [
    {
      "condition_key": "hypertension",
      "diagnosed_month": "2024-11"
    }
  ]
}'
Parameters

This request has no path or query parameters.

Request body
application/json · required
json
{
  "conditions": [
    {
      "condition_key": "hypertension",
      "diagnosed_month": "2024-11"
    }
  ]
}

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "condition_key": "hypertension",
      "diagnosed_month": "2024-11",
      "created_at": "2026-06-29T18:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (6)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.condition_keystring · requiredSee the response example for representative data.
data.diagnosed_monthstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get active medications

/api/v1/medications

Returns medications without an ended_month.

AuthOAuth user access tokenScopemedications.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/medications

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/medications' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "name": "Lisinopril 10 MG Oral Tablet",
      "rxcui": "314076",
      "ingredient": "lisinopril",
      "ingredient_rxcui": "29046",
      "started_month": "2025-01",
      "ended_month": null,
      "created_at": "2025-01-10T17:00:00.000Z",
      "updated_at": "2025-01-10T17:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (11)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.namestring · requiredSee the response example for representative data.
data.rxcuistring · requiredSee the response example for representative data.
data.ingredientstring · requiredSee the response example for representative data.
data.ingredient_rxcuistring · requiredSee the response example for representative data.
data.started_monthstring · requiredSee the response example for representative data.
data.ended_monthstringnull · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.updated_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get medication history

/api/v1/medications/history

Returns active and ended medications in reverse chronological order.

AuthOAuth user access tokenScopemedications.readTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/medications/history

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/medications/history' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
      "name": "Lisinopril 10 MG Oral Tablet",
      "rxcui": "314076",
      "ingredient": "lisinopril",
      "ingredient_rxcui": "29046",
      "started_month": "2025-01",
      "ended_month": "2026-01",
      "created_at": "2025-01-10T17:00:00.000Z",
      "updated_at": "2026-01-09T17:00:00.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (11)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.namestring · requiredSee the response example for representative data.
data.rxcuistring · requiredSee the response example for representative data.
data.ingredientstring · requiredSee the response example for representative data.
data.ingredient_rxcuistring · requiredSee the response example for representative data.
data.started_monthstring · requiredSee the response example for representative data.
data.ended_monthstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
data.updated_atstring · requiredSee the response example for representative data.
data.source_app_idstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Add a medication

/api/v1/medications

Creates one API-owned medication row. Month fields use YYYY-MM.

AuthOAuth user access tokenScopemedications.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/medications

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/medications' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Lisinopril 10 MG Oral Tablet",
  "rxcui": "314076",
  "ingredient": "lisinopril",
  "ingredient_rxcui": "29046",
  "started_month": "2025-01"
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "name": "Lisinopril 10 MG Oral Tablet",
  "rxcui": "314076",
  "ingredient": "lisinopril",
  "ingredient_rxcui": "29046",
  "started_month": "2025-01"
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
  "name": "Lisinopril 10 MG Oral Tablet",
  "rxcui": "314076",
  "ingredient": "lisinopril",
  "ingredient_rxcui": "29046",
  "started_month": "2025-01",
  "ended_month": null,
  "created_at": "2026-06-29T18:00:00.000Z",
  "updated_at": "2026-06-29T18:00:00.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (10)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
rxcuistring · requiredSee the response example for representative data.
ingredientstring · requiredSee the response example for representative data.
ingredient_rxcuistring · requiredSee the response example for representative data.
started_monthstring · requiredSee the response example for representative data.
ended_monthstringnull · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
updated_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
DELETE

End a medication

/api/v1/medications/{medicationId}

Sets ended_month on an API-owned medication. If omitted, ended_month defaults to the current UTC month.

AuthOAuth user access tokenScopemedications.writeTierAll tiersPrice$0.01 T1 · $0.02 T2
DELETE/api/v1/medications/{medicationId}

Request

Make the request
bash
curl --request DELETE 'https://www.foodabcs.com/api/v1/medications/b035d85f-86a3-4f2f-b231-a4b1a2488f73?ended_month=2026-06' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
medicationId*pathstringMedication identifier.Example: b035d85f-86a3-4f2f-b231-a4b1a2488f73
ended_monthquerystringEnd month in YYYY-MM format; defaults to the current UTC month.Example: 2026-06

Response

Successful response
200

The request completed successfully.

json
{
  "id": "b035d85f-86a3-4f2f-b231-a4b1a2488f73",
  "name": "Lisinopril 10 MG Oral Tablet",
  "rxcui": "314076",
  "ingredient": "lisinopril",
  "ingredient_rxcui": "29046",
  "started_month": "2025-01",
  "ended_month": "2026-06",
  "created_at": "2025-01-10T17:00:00.000Z",
  "updated_at": "2026-06-29T18:00:00.000Z",
  "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
}
Response fields (10)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
namestring · requiredSee the response example for representative data.
rxcuistring · requiredSee the response example for representative data.
ingredientstring · requiredSee the response example for representative data.
ingredient_rxcuistring · requiredSee the response example for representative data.
started_monthstring · requiredSee the response example for representative data.
ended_monthstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
updated_atstring · requiredSee the response example for representative data.
source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Discovery

4 operations

Link to group
GET

Search foods

/api/v1/foods/search

Returns matching foods and pagination metadata. Result counts and identifiers are strings.

AuthOAuth user access tokenScopefoods.searchTierAll tiersPrice$0.01 T1 · $0.03 T2
GET/api/v1/foods/search

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/foods/search?q=plain+greek+yogurt' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
q*querystringFood search phrase.Example: plain greek yogurt

Response

Successful response
200

The request completed successfully.

json
{
  "data": {
    "foods": {
      "food": [
        {
          "food_id": "4384",
          "food_name": "Greek yogurt, plain",
          "food_type": "Generic",
          "food_description": "1 cup - 149 calories",
          "brand_name": "FoodABCs"
        }
      ]
    },
    "page_number": "0",
    "max_results": "25",
    "total_results": "84"
  }
}
Response fields (6)
FieldTypeMeaning
dataobject · requiredSee the response example for representative data.
data.foodsobject · requiredSee the response example for representative data.
data.foods.foodarray<object> · requiredSee the response example for representative data.
data.page_numberstring · requiredSee the response example for representative data.
data.max_resultsstring · requiredSee the response example for representative data.
data.total_resultsstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Look up a food by barcode

/api/v1/foods/barcode/{upc}

Looks up packaged-food nutrition by an 8–14 digit UPC or EAN barcode.

AuthOAuth user access tokenScopefoods.searchTierAll tiersPrice$0.04 T1 · $0.07 T2
GET/api/v1/foods/barcode/{upc}

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/foods/barcode/012345678905' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
upc*pathstringUPC or EAN barcode containing 8–14 digits.Example: 012345678905

Response

Successful response
200

The request completed successfully.

json
{
  "food": {
    "id": 12345,
    "name": "Old Fashioned Oats",
    "amount": 0.5,
    "unit": "cup",
    "type": "grocery_product",
    "brand": "Example Foods",
    "brand_name": "Example Foods",
    "barcode": "012345678905",
    "upc": "012345678905",
    "nutrition": {
      "nutrients": [
        {
          "name": "Calories",
          "amount": 150,
          "unit": "kcal"
        },
        {
          "name": "Protein",
          "amount": 5,
          "unit": "g"
        }
      ],
      "weight_per_serving": {
        "amount": 40,
        "unit": "g"
      }
    },
    "logged_nutrients": [
      {
        "key": "calories",
        "name": "Calories",
        "amount": 150,
        "unit": "kcal"
      },
      {
        "key": "protein",
        "name": "Protein",
        "amount": 5,
        "unit": "g"
      }
    ],
    "stored_calories": 150
  }
}
Response fields (19)
FieldTypeMeaning
foodobject · requiredSee the response example for representative data.
food.idinteger · requiredSee the response example for representative data.
food.namestring · requiredSee the response example for representative data.
food.amountnumber · requiredSee the response example for representative data.
food.unitstring · requiredSee the response example for representative data.
food.typestring · requiredSee the response example for representative data.
food.brandstring · requiredSee the response example for representative data.
food.brand_namestring · requiredSee the response example for representative data.
food.barcodestring · requiredSee the response example for representative data.
food.upcstring · requiredSee the response example for representative data.
food.nutritionobject · requiredSee the response example for representative data.
food.nutrition.nutrientsarray<object> · requiredSee the response example for representative data.
food.nutrition.weight_per_servingobject · requiredSee the response example for representative data.
food.logged_nutrientsarray<object> · requiredSee the response example for representative data.
food.logged_nutrients.keystring · requiredSee the response example for representative data.
food.logged_nutrients.namestring · requiredSee the response example for representative data.
food.logged_nutrients.amountinteger · requiredSee the response example for representative data.
food.logged_nutrients.unitstring · requiredSee the response example for representative data.
food.stored_caloriesinteger · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Find farmers markets

/api/v1/farmers-markets

Returns nearby market listings for a latitude and longitude.

AuthOAuth user access tokenScopefoods.searchTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/farmers-markets

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/farmers-markets?lat=39.7392&lng=-104.9903&radius_miles=30' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
lat*querynumberLatitude between -90 and 90.Example: 39.7392
lng*querynumberLongitude between -180 and 180.Example: -104.9903
radius_milesquerynumberSearch radius from 1 through 100 miles.Example: 30

Response

Successful response
200

The request completed successfully.

json
{
  "error": 0,
  "data": [
    {
      "listing_id": "1001234",
      "listing_name": "Union Station Farmers Market",
      "location_y": "39.752",
      "location_x": "-104.999"
    }
  ]
}
Response fields (6)
FieldTypeMeaning
errorinteger · requiredSee the response example for representative data.
dataarray<object> · requiredSee the response example for representative data.
data.listing_idstring · requiredSee the response example for representative data.
data.listing_namestring · requiredSee the response example for representative data.
data.location_ystring · requiredSee the response example for representative data.
data.location_xstring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Search medications

/api/v1/medications/search

Returns normalized medication matches for a name search.

AuthOAuth user access tokenScopefoods.searchTierAll tiersPrice$0.0030 T1 · $0.0060 T2
GET/api/v1/medications/search

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/medications/search?q=lisinopril' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
q*querystringMedication search phrase of at least two characters.Example: lisinopril

Response

Successful response
200

The request completed successfully.

json
{
  "results": [
    {
      "rxcui": "314076",
      "name": "Lisinopril 10 MG Oral Tablet",
      "tty": "SCD"
    }
  ]
}
Response fields (4)
FieldTypeMeaning
resultsarray<object> · requiredSee the response example for representative data.
results.rxcuistring · requiredSee the response example for representative data.
results.namestring · requiredSee the response example for representative data.
results.ttystring · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Usage and billing

3 operations

Link to group
GET

Get usage summary

/api/v1/partner/usage

Returns aggregate calls, errors, cost, active users, and an endpoint breakdown across the partner’s apps.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/partner/usage

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/usage?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z

Response

Successful response
200

The request completed successfully.

json
{
  "period": {
    "from": "2026-06-01",
    "to": "2026-06-30"
  },
  "totals": {
    "call_count": 12580,
    "error_count": 217,
    "cost_cents": 9435,
    "active_user_count": 384
  },
  "endpoints": [
    {
      "endpoint_key": "meals.read",
      "call_count": 3820,
      "error_count": 41,
      "cost_cents": 764
    }
  ]
}
Response fields (13)
FieldTypeMeaning
periodobject · requiredSee the response example for representative data.
period.fromstring · requiredSee the response example for representative data.
period.tostring · requiredSee the response example for representative data.
totalsobject · requiredSee the response example for representative data.
totals.call_countinteger · requiredSee the response example for representative data.
totals.error_countinteger · requiredSee the response example for representative data.
totals.cost_centsinteger · requiredSee the response example for representative data.
totals.active_user_countinteger · requiredSee the response example for representative data.
endpointsarray<object> · requiredSee the response example for representative data.
endpoints.endpoint_keystring · requiredSee the response example for representative data.
endpoints.call_countinteger · requiredSee the response example for representative data.
endpoints.error_countinteger · requiredSee the response example for representative data.
endpoints.cost_centsinteger · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get daily usage

/api/v1/partner/usage/daily

Returns daily usage rows by endpoint across the partner’s apps.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/partner/usage/daily

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/usage/daily?from=2026-06-01T00%3A00%3A00Z&to=2026-06-30T23%3A59%3A59Z' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
fromquerystringInclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z
toquerystringInclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "usage_date": "2026-06-29",
      "partner_id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc",
      "endpoint_key": "meals.read",
      "call_count": 148,
      "error_count": 2,
      "cost_cents": "30.0000",
      "expense_cents": "1.4800",
      "is_sandbox": false
    }
  ]
}
Response fields (9)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.usage_datestring · requiredSee the response example for representative data.
data.partner_idstring · requiredSee the response example for representative data.
data.endpoint_keystring · requiredSee the response example for representative data.
data.call_countinteger · requiredSee the response example for representative data.
data.error_countinteger · requiredSee the response example for representative data.
data.cost_centsstring · requiredSee the response example for representative data.
data.expense_centsstring · requiredSee the response example for representative data.
data.is_sandboxboolean · requiredSee the response example for representative data.
Error responses (7)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get costs and prices

/api/v1/partner/costs

Returns month-to-date spend, the configured spend cap, and every active endpoint price.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.0050 T1 · $0.01 T2
GET/api/v1/partner/costs

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/costs' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "month_to_date_spend_cents": 9435,
  "monthly_spend_cap_cents": 25000,
  "endpoint_prices": [
    {
      "endpoint_key": "meals.read",
      "price_cents": 0.2,
      "tier2_price_cents": 0.15,
      "infra_cost_cents": 0.01,
      "active": true
    }
  ]
}
Response fields (8)
FieldTypeMeaning
month_to_date_spend_centsinteger · requiredSee the response example for representative data.
monthly_spend_cap_centsinteger · requiredSee the response example for representative data.
endpoint_pricesarray<object> · requiredSee the response example for representative data.
endpoint_prices.endpoint_keystring · requiredSee the response example for representative data.
endpoint_prices.price_centsnumber · requiredSee the response example for representative data.
endpoint_prices.tier2_price_centsnumber · requiredSee the response example for representative data.
endpoint_prices.infra_cost_centsnumber · requiredSee the response example for representative data.
endpoint_prices.activeboolean · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Partner analytics

4 operations

Link to group
GET

Get analytics overview

/api/v1/partner/analytics/overview

Returns own-source engagement aggregates. Buckets below the privacy threshold are returned as suppressed rather than exposing small cohorts.

AuthPartner API keyScopeNoneTierTier tier2+Price$0.02 T1 · $0.04 T2
GET/api/v1/partner/analytics/overview

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/overview' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "overview": {
    "subject_count": 384,
    "meals_logged": 4210,
    "workouts_logged": 1402,
    "moods_logged": 2198,
    "average_meal_grade_score": "82.4"
  },
  "engagement_by_week": [
    {
      "week": "2026-06-22",
      "distinct_user_count": 247,
      "event_count": 1984
    }
  ]
}
Response fields (2)
FieldTypeMeaning
overviewvalue · requiredSee the response example for representative data.
engagement_by_weekarray<value> · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "tier_required",
    "message": "Tier 2 is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get meal analytics

/api/v1/partner/analytics/meals

Returns privacy-suppressed grade, nutrient, and weekly meal aggregates for records created by this partner app.

AuthPartner API keyScopeNoneTierTier tier2+Price$0.02 T1 · $0.04 T2
GET/api/v1/partner/analytics/meals

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/meals' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "grade_distribution": [
    {
      "grade": "A",
      "distinct_user_count": 142,
      "meal_count": 1240
    }
  ],
  "nutrient_averages": [
    {
      "nutrient_key": "protein",
      "distinct_user_count": 205,
      "average_amount": "31.7"
    }
  ],
  "trends": [
    {
      "week": "2026-06-22",
      "distinct_user_count": 247,
      "meal_count": 1065
    }
  ]
}
Response fields (3)
FieldTypeMeaning
grade_distributionarray<value> · requiredSee the response example for representative data.
nutrient_averagesarray<value> · requiredSee the response example for representative data.
trendsarray<value> · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "tier_required",
    "message": "Tier 2 is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get workout analytics

/api/v1/partner/analytics/workouts

Returns privacy-suppressed type, grade, and weekly workout aggregates for records created by this partner app.

AuthPartner API keyScopeNoneTierTier tier2+Price$0.02 T1 · $0.04 T2
GET/api/v1/partner/analytics/workouts

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/workouts' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "by_type": [
    {
      "type": "Outdoor Run",
      "distinct_user_count": 88,
      "workout_count": 312,
      "average_duration_minutes": "34.8",
      "average_calories": "362.1"
    }
  ],
  "grade_distribution": [
    {
      "grade": "A",
      "distinct_user_count": 112,
      "workout_count": 498
    }
  ],
  "trends": [
    {
      "week": "2026-06-22",
      "distinct_user_count": 146,
      "workout_count": 382,
      "total_minutes": 14210,
      "total_calories": "125420"
    }
  ]
}
Response fields (3)
FieldTypeMeaning
by_typearray<value> · requiredSee the response example for representative data.
grade_distributionarray<value> · requiredSee the response example for representative data.
trendsarray<value> · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "tier_required",
    "message": "Tier 2 is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get cohort analytics

/api/v1/partner/analytics/cohorts

Returns privacy-suppressed weekly engagement cohorts for own-source activity.

AuthPartner API keyScopeNoneTierTier tier2+Price$0.02 T1 · $0.04 T2
GET/api/v1/partner/analytics/cohorts

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/cohorts' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "cohorts": [
    {
      "week": "2026-06-22",
      "distinct_user_count": 247,
      "average_events_per_user": "8.03"
    }
  ]
}
Response fields (1)
FieldTypeMeaning
cohortsarray<value> · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "tier_required",
    "message": "Tier 2 is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Partner users

2 operations

Link to group
GET

List authorized users

/api/v1/partner/users

Lists users with a current individual-access grant. Requires Tier 2 and verified compliance; every row is PHI-audited.

AuthPartner API keyScopeNoneTierTier tier2+AccessCompliance approvalPrice$0.0050 T1 · $0.01 T2
GET/api/v1/partner/users

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/users' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "scope": "meals.read workouts.read moods.read exams.read",
      "granted_at": "2026-05-14T20:00:00.000Z"
    }
  ]
}
Response fields (4)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.user_idstring · requiredSee the response example for representative data.
data.scopestring · requiredSee the response example for representative data.
data.granted_atstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "compliance_required",
    "message": "Compliance verification is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
GET

Get authorized user records

/api/v1/partner/users/{userId}/records

Returns this app’s meal, workout, mood, and physical-exam records for one user with an active individual-access grant. Requires Tier 2 and verified compliance; access is PHI-audited.

AuthPartner API keyScopeNoneTierTier tier2+AccessCompliance approvalPrice$0.0050 T1 · $0.01 T2
GET/api/v1/partner/users/{userId}/records

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/users/6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f/records' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
userId*pathstringUser UUID with an active individual-access grant.Example: 6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f

Response

Successful response
200

The request completed successfully.

json
{
  "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
  "meals": [
    {
      "id": "1042",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "timestamp": "2026-06-29T18:30:00.000Z",
      "name": "Chicken quinoa bowl",
      "ingredients": [
        {
          "name": "Grilled chicken breast",
          "amount": 5,
          "unit": "oz",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 234,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 44,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 0,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 5,
                "unit": "g"
              }
            ]
          }
        },
        {
          "name": "Cooked quinoa",
          "amount": 1,
          "unit": "cup",
          "nutrition": {
            "nutrients": [
              {
                "name": "Calories",
                "amount": 222,
                "unit": "kcal"
              },
              {
                "name": "Protein",
                "amount": 8,
                "unit": "g"
              },
              {
                "name": "Carbohydrates",
                "amount": 39,
                "unit": "g"
              },
              {
                "name": "Fat",
                "amount": 4,
                "unit": "g"
              }
            ]
          }
        }
      ],
      "total_calories": "612",
      "meal_score": "A",
      "is_favorite": false,
      "meal_classifications": [
        {
          "key": "high_protein",
          "label": "High protein"
        }
      ],
      "meal_classification_version": "v1",
      "meal_classified_at": "2026-06-29T18:30:08.000Z",
      "meal_behavior_events": [],
      "meal_behavior_version": "v1",
      "meal_behavior_detected_at": "2026-06-29T18:30:08.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "workouts": [
    {
      "id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "type": "Outdoor Run",
      "start_time": "2026-06-28T13:00:00.000Z",
      "end_time": "2026-06-28T13:32:00.000Z",
      "duration_minutes": 32,
      "calories_burned": 348,
      "average_heart_rate": 151,
      "min_heart_rate": 104,
      "max_heart_rate": 174,
      "heart_rate_samples": [
        {
          "offset_seconds": 60,
          "bpm": 132
        }
      ],
      "distance_meters": 5020,
      "steps": 6234,
      "elevation_gain_meters": 41,
      "average_speed_mps": 2.61,
      "max_speed_mps": 3.9,
      "average_power_watts": 248,
      "average_cadence": 168,
      "calorie_samples": [
        {
          "offset_seconds": 300,
          "calories": 54
        }
      ],
      "provider": "api",
      "original_id": "run-2026-06-28",
      "grade": "A",
      "synced_at": "2026-06-28T13:33:00.000Z",
      "created_at": "2026-06-28T13:33:00.000Z",
      "updated_at": "2026-06-28T13:33:00.000Z",
      "raw_type": "running",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "moods": [
    {
      "id": "7fd304e1-7823-4352-a855-33d0da83bf28",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "mood_value": 4,
      "mood_key": "good",
      "mood_label": "Good",
      "mood_emoji": "🙂",
      "source": "api",
      "meal_log_id": "1042",
      "recorded_at": "2026-06-29T20:15:00.000Z",
      "local_entry_date": "2026-06-29",
      "timezone": "America/Denver",
      "created_at": "2026-06-29T20:15:01.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ],
  "physical_exams": [
    {
      "id": "296d2c48-e9ab-44b8-a988-7b7332640af4",
      "user_id": "6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f",
      "snapshot_at": "2026-06-15T16:00:00.000Z",
      "source": "api",
      "height": "70",
      "weight": "176.4",
      "bmi": "25.3",
      "systolic_bp": 118,
      "diastolic_bp": 76,
      "body_temp_f": "98.4",
      "resting_hr": 62,
      "respiratory_rate": 14,
      "created_at": "2026-06-15T16:00:01.000Z",
      "source_app_id": "64a5163c-3ca0-4c54-bc71-b6f66d5862f7"
    }
  ]
}
Response fields (84)
FieldTypeMeaning
user_idstring · requiredSee the response example for representative data.
mealsarray<object> · requiredSee the response example for representative data.
meals.idstring · requiredSee the response example for representative data.
meals.user_idstring · requiredSee the response example for representative data.
meals.timestampstring · requiredSee the response example for representative data.
meals.namestring · requiredSee the response example for representative data.
meals.ingredientsarray<object> · requiredSee the response example for representative data.
meals.ingredients.namestring · requiredSee the response example for representative data.
meals.ingredients.amountinteger · requiredSee the response example for representative data.
meals.ingredients.unitstring · requiredSee the response example for representative data.
meals.ingredients.nutritionobject · requiredSee the response example for representative data.
meals.total_caloriesstring · requiredSee the response example for representative data.
meals.meal_scorestring · requiredSee the response example for representative data.
meals.is_favoriteboolean · requiredSee the response example for representative data.
meals.meal_classificationsarray<object> · requiredSee the response example for representative data.
meals.meal_classifications.keystring · requiredSee the response example for representative data.
meals.meal_classifications.labelstring · requiredSee the response example for representative data.
meals.meal_classification_versionstring · requiredSee the response example for representative data.
meals.meal_classified_atstring · requiredSee the response example for representative data.
meals.meal_behavior_eventsarray<value> · requiredSee the response example for representative data.
meals.meal_behavior_versionstring · requiredSee the response example for representative data.
meals.meal_behavior_detected_atstring · requiredSee the response example for representative data.
meals.source_app_idstring · requiredSee the response example for representative data.
workoutsarray<object> · requiredSee the response example for representative data.
workouts.idstring · requiredSee the response example for representative data.
workouts.user_idstring · requiredSee the response example for representative data.
workouts.typestring · requiredSee the response example for representative data.
workouts.start_timestring · requiredSee the response example for representative data.
workouts.end_timestring · requiredSee the response example for representative data.
workouts.duration_minutesinteger · requiredSee the response example for representative data.
workouts.calories_burnedinteger · requiredSee the response example for representative data.
workouts.average_heart_rateinteger · requiredSee the response example for representative data.
workouts.min_heart_rateinteger · requiredSee the response example for representative data.
workouts.max_heart_rateinteger · requiredSee the response example for representative data.
workouts.heart_rate_samplesarray<object> · requiredSee the response example for representative data.
workouts.heart_rate_samples.offset_secondsinteger · requiredSee the response example for representative data.
workouts.heart_rate_samples.bpminteger · requiredSee the response example for representative data.
workouts.distance_metersinteger · requiredSee the response example for representative data.
workouts.stepsinteger · requiredSee the response example for representative data.
workouts.elevation_gain_metersinteger · requiredSee the response example for representative data.
workouts.average_speed_mpsnumber · requiredSee the response example for representative data.
workouts.max_speed_mpsnumber · requiredSee the response example for representative data.
workouts.average_power_wattsinteger · requiredSee the response example for representative data.
workouts.average_cadenceinteger · requiredSee the response example for representative data.
workouts.calorie_samplesarray<object> · requiredSee the response example for representative data.
workouts.calorie_samples.offset_secondsinteger · requiredSee the response example for representative data.
workouts.calorie_samples.caloriesinteger · requiredSee the response example for representative data.
workouts.providerstring · requiredSee the response example for representative data.
workouts.original_idstring · requiredSee the response example for representative data.
workouts.gradestring · requiredSee the response example for representative data.
workouts.synced_atstring · requiredSee the response example for representative data.
workouts.created_atstring · requiredSee the response example for representative data.
workouts.updated_atstring · requiredSee the response example for representative data.
workouts.raw_typestring · requiredSee the response example for representative data.
workouts.source_app_idstring · requiredSee the response example for representative data.
moodsarray<object> · requiredSee the response example for representative data.
moods.idstring · requiredSee the response example for representative data.
moods.user_idstring · requiredSee the response example for representative data.
moods.mood_valueinteger · requiredSee the response example for representative data.
moods.mood_keystring · requiredSee the response example for representative data.
moods.mood_labelstring · requiredSee the response example for representative data.
moods.mood_emojistring · requiredSee the response example for representative data.
moods.sourcestring · requiredSee the response example for representative data.
moods.meal_log_idstring · requiredSee the response example for representative data.
moods.recorded_atstring · requiredSee the response example for representative data.
moods.local_entry_datestring · requiredSee the response example for representative data.
moods.timezonestring · requiredSee the response example for representative data.
moods.created_atstring · requiredSee the response example for representative data.
moods.source_app_idstring · requiredSee the response example for representative data.
physical_examsarray<object> · requiredSee the response example for representative data.
physical_exams.idstring · requiredSee the response example for representative data.
physical_exams.user_idstring · requiredSee the response example for representative data.
physical_exams.snapshot_atstring · requiredSee the response example for representative data.
physical_exams.sourcestring · requiredSee the response example for representative data.
physical_exams.heightstring · requiredSee the response example for representative data.
physical_exams.weightstring · requiredSee the response example for representative data.
physical_exams.bmistring · requiredSee the response example for representative data.
physical_exams.systolic_bpinteger · requiredSee the response example for representative data.
physical_exams.diastolic_bpinteger · requiredSee the response example for representative data.
physical_exams.body_temp_fstring · requiredSee the response example for representative data.
physical_exams.resting_hrinteger · requiredSee the response example for representative data.
physical_exams.respiratory_rateinteger · requiredSee the response example for representative data.
physical_exams.created_atstring · requiredSee the response example for representative data.
physical_exams.source_app_idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "compliance_required",
    "message": "Compliance verification is required.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Webhooks

3 operations

Link to group
GET

List webhooks

/api/v1/partner/webhooks

Lists registered webhook destinations without returning signing secrets.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.01 T1 · $0.02 T2
GET/api/v1/partner/webhooks

Request

Make the request
bash
curl --request GET 'https://www.foodabcs.com/api/v1/partner/webhooks' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters

This request has no path or query parameters.

Response

Successful response
200

The request completed successfully.

json
{
  "data": [
    {
      "id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc",
      "url": "https://partner.example.com/webhooks/foodabcs",
      "events": [
        "meal.graded",
        "grant.revoked"
      ],
      "status": "active",
      "created_at": "2026-06-20T16:00:00.000Z"
    }
  ]
}
Response fields (6)
FieldTypeMeaning
dataarray<object> · requiredSee the response example for representative data.
data.idstring · requiredSee the response example for representative data.
data.urlstring · requiredSee the response example for representative data.
data.eventsarray<string> · requiredSee the response example for representative data.
data.statusstring · requiredSee the response example for representative data.
data.created_atstring · requiredSee the response example for representative data.
Error responses (6)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
POST

Create a webhook

/api/v1/partner/webhooks

Registers a destination and returns its signing secret once. Store the secret securely; later list calls omit it.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.01 T1 · $0.02 T2
POST/api/v1/partner/webhooks

Request

Make the request
bash
curl --request POST 'https://www.foodabcs.com/api/v1/partner/webhooks' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://partner.example.com/webhooks/foodabcs",
  "events": [
    "meal.graded",
    "grant.revoked"
  ]
}'
Parameters
ParameterInTypeDescription
Idempotency-KeyheaderstringOptional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64
Request body
application/json · required
json
{
  "url": "https://partner.example.com/webhooks/foodabcs",
  "events": [
    "meal.graded",
    "grant.revoked"
  ]
}

Response

Successful response
200

The request completed successfully.

json
{
  "id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc",
  "url": "https://partner.example.com/webhooks/foodabcs",
  "events": [
    "meal.graded",
    "grant.revoked"
  ],
  "status": "active",
  "created_at": "2026-06-29T16:00:00.000Z",
  "secret": "whsec_o4dYb5lqVUEXAMPLE"
}
Response fields (6)
FieldTypeMeaning
idstring · requiredSee the response example for representative data.
urlstring · requiredSee the response example for representative data.
eventsarray<string> · requiredSee the response example for representative data.
statusstring · requiredSee the response example for representative data.
created_atstring · requiredSee the response example for representative data.
secretstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
409

The Idempotency-Key was already used with a different request body.

json
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key was already used with a different request.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
DELETE

Delete a webhook

/api/v1/partner/webhooks/{webhookId}

Deletes one webhook destination owned by the partner.

AuthPartner API keyScopeNoneTierAll tiersPrice$0.01 T1 · $0.02 T2
DELETE/api/v1/partner/webhooks/{webhookId}

Request

Make the request
bash
curl --request DELETE 'https://www.foodabcs.com/api/v1/partner/webhooks/7d3fb86b-470d-4855-8daf-c574a81bf2dc' \
  --header 'Authorization: Bearer $PARTNER_API_KEY' \
  --header 'Accept: application/json'
Parameters
ParameterInTypeDescription
webhookId*pathstringWebhook UUID.Example: 7d3fb86b-470d-4855-8daf-c574a81bf2dc

Response

Successful response
200

The request completed successfully.

json
{
  "deleted": true,
  "id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc"
}
Response fields (2)
FieldTypeMeaning
deletedboolean · requiredSee the response example for representative data.
idstring · requiredSee the response example for representative data.
Error responses (8)
401

The bearer token is missing, invalid, expired, or revoked.

json
{
  "error": {
    "code": "invalid_token",
    "message": "Missing bearer token.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
402

Billing setup is required, or API access is suspended after the payment grace period.

json
{
  "error": {
    "code": "billing_setup_required",
    "message": "Complete billing setup before using API credentials.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
503

Billing access or durable usage metering could not be verified before endpoint work began.

json
{
  "error": {
    "code": "metering_unavailable",
    "message": "API metering is temporarily unavailable.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
403

The credential lacks the required scope, tier, compliance state, consent, or active partner status.

json
{
  "error": {
    "code": "insufficient_scope",
    "message": "Required scope is missing.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
404

The requested resource does not exist or is not visible to this credential.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
422

A body, path, or query value failed validation.

json
{
  "error": {
    "code": "validation_failed",
    "message": "One or more request values are invalid.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
429

The app exceeded its rate limit or monthly spend cap.

json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
500

FoodABCs could not complete the request.

json
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}

Pricing

Know the cost before you call

Prices are shown in US dollars per request. Tier 2 includes approved analytics and individual-record capabilities; access still depends on scopes, user consent, and any required compliance terms.

Tier 1

Usage

Core user-authorized API features plus usage, reliability, and high-level operational data.

Tier 2

Usage + insights

Cohort analytics and approved individual-record workflows with suppression and compliance safeguards.

Profile

per request

Meals

per request

Workouts

per request

Mood

per request

Wellness

per request

Goals

per request

Health records

per request

Discovery

per request

Usage and billing

per request

Partner analytics

per request

Partner users

per request

Webhooks

per request

Errors

Failures are structured and traceable

API failures use one JSON envelope. Branch on the stable error code, show users an appropriate message, and retain the request ID when contacting support.

json
{
  "error": {
    "code": "validation_failed",
    "message": "limit must be an integer from 1 to 100.",
    "request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
  }
}
400Malformed OAuth or protocol request
401Missing, expired, or invalid credential
403Scope, tier, consent, or compliance requirement not met
404The requested resource does not exist or is not visible
409Idempotency key was reused with different request data
422Valid JSON that fails field or query validation
429Rate limit or spend cap exceeded
500Unexpected server failure; report the request ID

Rate limits and cohort privacy

Use X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset to pace calls. Back off after a 429 and do not retry in a tight loop.

Partner analytics can suppress small cohorts to reduce re-identification risk. A suppressed value is an intentional privacy result, not missing data; widen the cohort or date window.

Resources

Ship with the contract beside you

Ready to build?

Create a sandbox application and make your first FoodABCs request today.

Create partner account