Create an app
Create your partner workspace and sandbox application. Keep secret credentials on your server.
Create partner accountGrade 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.
Get started
Create a sandbox application, authorize a FoodABCs user, exchange the authorization code, and send the resulting access token with a v1 request.
Create your partner workspace and sandbox application. Keep secret credentials on your server.
Create partner accountSend the user through OAuth with PKCE and request only the scopes your integration needs.
Read authentication guideUse the access token as a Bearer credential. Every response includes a request ID for support and tracing.
Browse endpoint referencecurl -L https://www.foodabcs.com/api/v1/me \
-H "Authorization: Bearer <access_token>" \
-H "Accept: application/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
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
Acts for one FoodABCs user and is limited by the scopes they approved. Send it as Authorization: Bearer <token>.
Partner credential
Identifies your partner application. Store it server-side, rotate it if exposed, and never embed it in a browser or mobile binary.
Register the exact redirect URI in your partner application, generate a random state value, and use an S256 PKCE challenge.
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=S256Exchange each code once from your backend. The redirect URI and PKCE verifier must match the original request.
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>"
}'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
Sandbox credentials are for development and test data. Live credentials are separately reviewed and should be stored, monitored, and rotated independently.
All current resource endpoints begin with /api/v1. A future breaking contract will use a new version boundary instead of silently changing v1.
Timestamps use ISO 8601 UTC strings. Resource identifiers are opaque: persist them exactly and do not infer ordering or meaning from their format.
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.
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.
Meal scores can be immediate while detailed classification finishes asynchronously. Listen for meal.graded or check the documented classification status.
application/json for JSON request bodies.Webhooks
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.
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.
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));
}data.deleted uses a one-way user reference. grant.revoked ends authorized access. meal.graded reports completed asynchronous classification.
{
"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"
}API reference
Expand an operation to see its credential, scope, parameters, copyable curl request, realistic success payload, documented response fields, and representative errors.
3 operations
/api/v1/meReturns the current user’s profile identity and lifetime activity counts.
/api/v1/meRequest
curl --request GET 'https://www.foodabcs.com/api/v1/me' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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
}| Field | Type | Meaning |
|---|---|---|
| first_name | string · required | See the response example for representative data. |
| last_name | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| meal_count | integer · required | See the response example for representative data. |
| workout_count | integer · required | See the response example for representative data. |
| mood_count | integer · required | See the response example for representative data. |
| physical_exam_count | integer · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/demographicsReturns the current user’s self-reported demographic profile. Fields may be null when the user has not answered them.
/api/v1/demographicsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/demographics' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| birthdate | string · required | See the response example for representative data. |
| sex | string · required | See the response example for representative data. |
| state | string · required | See the response example for representative data. |
| zip_code | string · required | See the response example for representative data. |
| race_ethnicity | string · required | See the response example for representative data. |
| snap_wic_status | string · required | See the response example for representative data. |
| household_income | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/demographicsUpdates only the supplied self-reported fields and returns the complete demographic profile.
/api/v1/demographicsRequest
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"
}'This request has no path or query parameters.
{
"state": "CO",
"zip_code": "80205",
"household_income": "$75,000 – $99,999"
}Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| birthdate | string · required | See the response example for representative data. |
| sex | string · required | See the response example for representative data. |
| state | string · required | See the response example for representative data. |
| zip_code | string · required | See the response example for representative data. |
| race_ethnicity | string · required | See the response example for representative data. |
| snap_wic_status | string · required | See the response example for representative data. |
| household_income | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}15 operations
/api/v1/mealsCreates an API-owned meal, calculates its immediate grade, and queues asynchronous classification.
/api/v1/mealsRequest
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"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
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| timestamp | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| ingredients | array<object> · required | See the response example for representative data. |
| ingredients.name | string · required | See the response example for representative data. |
| ingredients.amount | integer · required | See the response example for representative data. |
| ingredients.unit | string · required | See the response example for representative data. |
| ingredients.nutrition | object · required | See the response example for representative data. |
| ingredients.nutrition.nutrients | array<object> · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| meal_score | string · required | See the response example for representative data. |
| is_favorite | boolean · required | See the response example for representative data. |
| meal_classifications | array<object> · required | See the response example for representative data. |
| meal_classifications.key | string · required | See the response example for representative data. |
| meal_classifications.label | string · required | See the response example for representative data. |
| meal_classification_version | string · required | See the response example for representative data. |
| meal_classified_at | string · required | See the response example for representative data. |
| meal_behavior_events | array<value> · required | See the response example for representative data. |
| meal_behavior_version | string · required | See the response example for representative data. |
| meal_behavior_detected_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
| classification_status | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/analyze-imageExtracts ingredients and nutrition from a supported image. Set save to true to create the meal; otherwise the response is a draft.
/api/v1/meals/analyze-imageRequest
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
"save": false
}Response
The request completed successfully.
{
"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."
}The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/analyze-textTurns a plain-language meal description into a scored draft or, when save is true, an API-owned meal.
/api/v1/meals/analyze-textRequest
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"description": "Turkey and avocado sandwich on whole wheat bread",
"save": false
}Response
The request completed successfully.
{
"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."
}The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/mealsLists meals visible to the user across all sources in reverse chronological order.
/api/v1/mealsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.timestamp | string · required | See the response example for representative data. |
| data.name | string · required | See the response example for representative data. |
| data.ingredients | array<object> · required | See the response example for representative data. |
| data.ingredients.name | string · required | See the response example for representative data. |
| data.ingredients.amount | integer · required | See the response example for representative data. |
| data.ingredients.unit | string · required | See the response example for representative data. |
| data.ingredients.nutrition | object · required | See the response example for representative data. |
| data.total_calories | string · required | See the response example for representative data. |
| data.meal_score | string · required | See the response example for representative data. |
| data.is_favorite | boolean · required | See the response example for representative data. |
| data.meal_classifications | array<object> · required | See the response example for representative data. |
| data.meal_classifications.key | string · required | See the response example for representative data. |
| data.meal_classifications.label | string · required | See the response example for representative data. |
| data.meal_classification_version | string · required | See the response example for representative data. |
| data.meal_classified_at | string · required | See the response example for representative data. |
| data.meal_behavior_events | array<value> · required | See the response example for representative data. |
| data.meal_behavior_version | string · required | See the response example for representative data. |
| data.meal_behavior_detected_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/{mealId}Returns one meal visible to the current user.
/api/v1/meals/{mealId}Request
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| mealId* | path | string | Meal identifier.Example: 1042 |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| timestamp | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| ingredients | array<object> · required | See the response example for representative data. |
| ingredients.name | string · required | See the response example for representative data. |
| ingredients.amount | integer · required | See the response example for representative data. |
| ingredients.unit | string · required | See the response example for representative data. |
| ingredients.nutrition | object · required | See the response example for representative data. |
| ingredients.nutrition.nutrients | array<object> · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| meal_score | string · required | See the response example for representative data. |
| is_favorite | boolean · required | See the response example for representative data. |
| meal_classifications | array<object> · required | See the response example for representative data. |
| meal_classifications.key | string · required | See the response example for representative data. |
| meal_classifications.label | string · required | See the response example for representative data. |
| meal_classification_version | string · required | See the response example for representative data. |
| meal_classified_at | string · required | See the response example for representative data. |
| meal_behavior_events | array<value> · required | See the response example for representative data. |
| meal_behavior_version | string · required | See the response example for representative data. |
| meal_behavior_detected_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/{mealId}Updates an API-owned meal. Records created by another source cannot be modified by this app.
/api/v1/meals/{mealId}Request
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| mealId* | path | string | Meal identifier.Example: 1042 |
{
"name": "Chicken, quinoa, and kale bowl",
"total_calories": 638
}Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| timestamp | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| ingredients | array<object> · required | See the response example for representative data. |
| ingredients.name | string · required | See the response example for representative data. |
| ingredients.amount | integer · required | See the response example for representative data. |
| ingredients.unit | string · required | See the response example for representative data. |
| ingredients.nutrition | object · required | See the response example for representative data. |
| ingredients.nutrition.nutrients | array<object> · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| meal_score | string · required | See the response example for representative data. |
| is_favorite | boolean · required | See the response example for representative data. |
| meal_classifications | array<object> · required | See the response example for representative data. |
| meal_classifications.key | string · required | See the response example for representative data. |
| meal_classifications.label | string · required | See the response example for representative data. |
| meal_classification_version | string · required | See the response example for representative data. |
| meal_classified_at | string · required | See the response example for representative data. |
| meal_behavior_events | array<value> · required | See the response example for representative data. |
| meal_behavior_version | string · required | See the response example for representative data. |
| meal_behavior_detected_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/{mealId}Deletes an API-owned meal and returns the deleted identifier.
/api/v1/meals/{mealId}Request
curl --request DELETE 'https://www.foodabcs.com/api/v1/meals/1042' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| mealId* | path | string | Meal identifier.Example: 1042 |
Response
The request completed successfully.
{
"deleted": true,
"id": "1042"
}| Field | Type | Meaning |
|---|---|---|
| deleted | boolean · required | See the response example for representative data. |
| id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/{mealId}/gradeReturns the current grade and asynchronous classifications for one meal.
/api/v1/meals/{mealId}/gradeRequest
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042/grade' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| mealId* | path | string | Meal identifier.Example: 1042 |
Response
The request completed successfully.
{
"meal_id": "1042",
"grade": "A",
"classifications": [
{
"key": "high_protein",
"label": "High protein"
}
],
"classified_at": "2026-06-29T18:30:08.000Z"
}| Field | Type | Meaning |
|---|---|---|
| meal_id | string · required | See the response example for representative data. |
| grade | string · required | See the response example for representative data. |
| classifications | array<object> · required | See the response example for representative data. |
| classifications.key | string · required | See the response example for representative data. |
| classifications.label | string · required | See the response example for representative data. |
| classified_at | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/gradesLists meal identifiers, timestamps, and grades for a date range.
/api/v1/meals/gradesRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"data": [
{
"id": "1042",
"timestamp": "2026-06-29T18:30:00.000Z",
"meal_score": "A"
}
],
"next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.timestamp | string · required | See the response example for representative data. |
| data.meal_score | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/{mealId}/expandedReturns a meal with nutrient warehouse rows and normalized ingredient-history records.
/api/v1/meals/{mealId}/expandedRequest
curl --request GET 'https://www.foodabcs.com/api/v1/meals/1042/expanded' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| mealId* | path | string | Meal identifier.Example: 1042 |
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| timestamp | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| ingredients | array<object> · required | See the response example for representative data. |
| ingredients.id | string · required | See the response example for representative data. |
| ingredients.meal_id | string · required | See the response example for representative data. |
| ingredients.meal_timestamp | string · required | See the response example for representative data. |
| ingredients.meal_slot | string · required | See the response example for representative data. |
| ingredients.ingredient_position | integer · required | See the response example for representative data. |
| ingredients.source_food_id | string · required | See the response example for representative data. |
| ingredients.display_name | string · required | See the response example for representative data. |
| ingredients.brand_name | string · required | See the response example for representative data. |
| ingredients.barcode | string · required | See the response example for representative data. |
| ingredients.selected_amount | string · required | See the response example for representative data. |
| ingredients.selected_unit | string · required | See the response example for representative data. |
| ingredients.entry_source | string · required | See the response example for representative data. |
| ingredients.nutrition_snapshot | object · required | See the response example for representative data. |
| ingredients.nutrition_snapshot.calories | integer · required | See the response example for representative data. |
| ingredients.nutrition_snapshot.protein | integer · required | See the response example for representative data. |
| ingredients.search_keywords | array<string> · required | See the response example for representative data. |
| ingredients.created_at | string · required | See the response example for representative data. |
| ingredients.source_app_id | string · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| meal_score | string · required | See the response example for representative data. |
| is_favorite | boolean · required | See the response example for representative data. |
| meal_classifications | array<object> · required | See the response example for representative data. |
| meal_classifications.key | string · required | See the response example for representative data. |
| meal_classifications.label | string · required | See the response example for representative data. |
| meal_classification_version | string · required | See the response example for representative data. |
| meal_classified_at | string · required | See the response example for representative data. |
| meal_behavior_events | array<value> · required | See the response example for representative data. |
| meal_behavior_version | string · required | See the response example for representative data. |
| meal_behavior_detected_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
| nutrients | array<object> · required | See the response example for representative data. |
| nutrients.meal_id | string · required | See the response example for representative data. |
| nutrients.nutrient_key | string · required | See the response example for representative data. |
| nutrients.nutrient_name | string · required | See the response example for representative data. |
| nutrients.nutrient_unit | string · required | See the response example for representative data. |
| nutrients.nutrient_amount | string · required | See the response example for representative data. |
| nutrients.created_at | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/meals/insightsAggregates meal grades, classifications, nutrients, and food-behavior signals over a date range.
/api/v1/meals/insightsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| period | object · required | See the response example for representative data. |
| period.from | string · required | See the response example for representative data. |
| period.to | string · required | See the response example for representative data. |
| meal_count | integer · required | See the response example for representative data. |
| average_calories | string · required | See the response example for representative data. |
| grade_distribution | array<object> · required | See the response example for representative data. |
| grade_distribution.grade | string · required | See the response example for representative data. |
| grade_distribution.count | integer · required | See the response example for representative data. |
| top_classifications | array<object> · required | See the response example for representative data. |
| top_classifications.classification | string · required | See the response example for representative data. |
| top_classifications.count | integer · required | See the response example for representative data. |
| nutrient_daily_averages | object · required | See the response example for representative data. |
| nutrient_daily_averages.protein | string · required | See the response example for representative data. |
| nutrient_daily_averages.fiber | string · required | See the response example for representative data. |
| nutrient_daily_averages.sodium | string · required | See the response example for representative data. |
| behavior_summary | array<object> · required | See the response example for representative data. |
| behavior_summary.event_type | string · required | See the response example for representative data. |
| behavior_summary.count | integer · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/favorite-mealsLists favorite meal templates visible to the user.
/api/v1/favorite-mealsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/favorite-meals?limit=25' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| limit | query | integer | Number of records to return (1–100).Example: 25 |
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.name | string · required | See the response example for representative data. |
| data.ingredients | array<object> · required | See the response example for representative data. |
| data.ingredients.name | string · required | See the response example for representative data. |
| data.ingredients.amount | integer · required | See the response example for representative data. |
| data.ingredients.unit | string · required | See the response example for representative data. |
| data.ingredients.nutrition | object · required | See the response example for representative data. |
| data.total_calories | string · required | See the response example for representative data. |
| data.meal_score | string · required | See the response example for representative data. |
| data.meal_classifications | array<object> · required | See the response example for representative data. |
| data.meal_classifications.key | string · required | See the response example for representative data. |
| data.meal_classifications.label | string · required | See the response example for representative data. |
| data.meal_classification_version | string · required | See the response example for representative data. |
| data.meal_classified_at | string · required | See the response example for representative data. |
| data.meal_behavior_events | array<value> · required | See the response example for representative data. |
| data.meal_behavior_version | string · required | See the response example for representative data. |
| data.meal_behavior_detected_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/favorite-mealsCreates an API-owned favorite template and returns its calculated meal grade.
/api/v1/favorite-mealsRequest
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"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
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| ingredients | array<object> · required | See the response example for representative data. |
| ingredients.name | string · required | See the response example for representative data. |
| ingredients.amount | integer · required | See the response example for representative data. |
| ingredients.unit | string · required | See the response example for representative data. |
| ingredients.nutrition | object · required | See the response example for representative data. |
| ingredients.nutrition.nutrients | array<object> · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| meal_score | string · required | See the response example for representative data. |
| meal_classifications | array<object> · required | See the response example for representative data. |
| meal_classifications.key | string · required | See the response example for representative data. |
| meal_classifications.label | string · required | See the response example for representative data. |
| meal_classification_version | string · required | See the response example for representative data. |
| meal_classified_at | string · required | See the response example for representative data. |
| meal_behavior_events | array<value> · required | See the response example for representative data. |
| meal_behavior_version | string · required | See the response example for representative data. |
| meal_behavior_detected_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/favorite-meals/{favoriteId}Deletes an API-owned favorite template.
/api/v1/favorite-meals/{favoriteId}Request
curl --request DELETE 'https://www.foodabcs.com/api/v1/favorite-meals/1042' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| favoriteId* | path | string | Favorite meal identifier.Example: 1042 |
Response
The request completed successfully.
{
"deleted": true,
"id": "1042"
}| Field | Type | Meaning |
|---|---|---|
| deleted | boolean · required | See the response example for representative data. |
| id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/food-behavior-eventsLists detected food-behavior events in reverse chronological order.
/api/v1/food-behavior-eventsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
| event_type | query | string | Filter to one behavior event type.Example: late_night_eating |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.meal_id | string · required | See the response example for representative data. |
| data.event_type | string · required | See the response example for representative data. |
| data.event_value | string · required | See the response example for representative data. |
| data.heat_score | integer · required | See the response example for representative data. |
| data.confidence | string · required | See the response example for representative data. |
| data.recorded_at | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.behavior_version | string · required | See the response example for representative data. |
| data.notes | string · required | See the response example for representative data. |
| data.metadata | object · required | See the response example for representative data. |
| data.metadata.local_hour | integer · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}7 operations
/api/v1/workoutsCreates an API workout. Supplying the same original_id again returns the existing workout with deduplicated true.
/api/v1/workoutsRequest
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"
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"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
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| type | string · required | See the response example for representative data. |
| start_time | string · required | See the response example for representative data. |
| end_time | string · required | See the response example for representative data. |
| duration_minutes | integer · required | See the response example for representative data. |
| calories_burned | integer · required | See the response example for representative data. |
| average_heart_rate | integer · required | See the response example for representative data. |
| min_heart_rate | integer · required | See the response example for representative data. |
| max_heart_rate | integer · required | See the response example for representative data. |
| heart_rate_samples | array<object> · required | See the response example for representative data. |
| heart_rate_samples.offset_seconds | integer · required | See the response example for representative data. |
| heart_rate_samples.bpm | integer · required | See the response example for representative data. |
| distance_meters | integer · required | See the response example for representative data. |
| steps | integer · required | See the response example for representative data. |
| elevation_gain_meters | integer · required | See the response example for representative data. |
| average_speed_mps | number · required | See the response example for representative data. |
| max_speed_mps | number · required | See the response example for representative data. |
| average_power_watts | integer · required | See the response example for representative data. |
| average_cadence | integer · required | See the response example for representative data. |
| calorie_samples | array<object> · required | See the response example for representative data. |
| calorie_samples.offset_seconds | integer · required | See the response example for representative data. |
| calorie_samples.calories | integer · required | See the response example for representative data. |
| provider | string · required | See the response example for representative data. |
| original_id | string · required | See the response example for representative data. |
| grade | string · required | See the response example for representative data. |
| synced_at | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| updated_at | string · required | See the response example for representative data. |
| raw_type | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workoutsLists workouts across all sources in reverse chronological order.
/api/v1/workoutsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.type | string · required | See the response example for representative data. |
| data.start_time | string · required | See the response example for representative data. |
| data.end_time | string · required | See the response example for representative data. |
| data.duration_minutes | integer · required | See the response example for representative data. |
| data.calories_burned | integer · required | See the response example for representative data. |
| data.average_heart_rate | integer · required | See the response example for representative data. |
| data.min_heart_rate | integer · required | See the response example for representative data. |
| data.max_heart_rate | integer · required | See the response example for representative data. |
| data.heart_rate_samples | array<object> · required | See the response example for representative data. |
| data.heart_rate_samples.offset_seconds | integer · required | See the response example for representative data. |
| data.heart_rate_samples.bpm | integer · required | See the response example for representative data. |
| data.distance_meters | integer · required | See the response example for representative data. |
| data.steps | integer · required | See the response example for representative data. |
| data.elevation_gain_meters | integer · required | See the response example for representative data. |
| data.average_speed_mps | number · required | See the response example for representative data. |
| data.max_speed_mps | number · required | See the response example for representative data. |
| data.average_power_watts | integer · required | See the response example for representative data. |
| data.average_cadence | integer · required | See the response example for representative data. |
| data.calorie_samples | array<object> · required | See the response example for representative data. |
| data.calorie_samples.offset_seconds | integer · required | See the response example for representative data. |
| data.calorie_samples.calories | integer · required | See the response example for representative data. |
| data.provider | string · required | See the response example for representative data. |
| data.original_id | string · required | See the response example for representative data. |
| data.grade | string · required | See the response example for representative data. |
| data.synced_at | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.updated_at | string · required | See the response example for representative data. |
| data.raw_type | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workouts/{workoutId}Returns one workout visible to the current user.
/api/v1/workouts/{workoutId}Request
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'| Parameter | In | Type | Description |
|---|---|---|---|
| workoutId* | path | string | Workout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| type | string · required | See the response example for representative data. |
| start_time | string · required | See the response example for representative data. |
| end_time | string · required | See the response example for representative data. |
| duration_minutes | integer · required | See the response example for representative data. |
| calories_burned | integer · required | See the response example for representative data. |
| average_heart_rate | integer · required | See the response example for representative data. |
| min_heart_rate | integer · required | See the response example for representative data. |
| max_heart_rate | integer · required | See the response example for representative data. |
| heart_rate_samples | array<object> · required | See the response example for representative data. |
| heart_rate_samples.offset_seconds | integer · required | See the response example for representative data. |
| heart_rate_samples.bpm | integer · required | See the response example for representative data. |
| distance_meters | integer · required | See the response example for representative data. |
| steps | integer · required | See the response example for representative data. |
| elevation_gain_meters | integer · required | See the response example for representative data. |
| average_speed_mps | number · required | See the response example for representative data. |
| max_speed_mps | number · required | See the response example for representative data. |
| average_power_watts | integer · required | See the response example for representative data. |
| average_cadence | integer · required | See the response example for representative data. |
| calorie_samples | array<object> · required | See the response example for representative data. |
| calorie_samples.offset_seconds | integer · required | See the response example for representative data. |
| calorie_samples.calories | integer · required | See the response example for representative data. |
| provider | string · required | See the response example for representative data. |
| original_id | string · required | See the response example for representative data. |
| grade | string · required | See the response example for representative data. |
| synced_at | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| updated_at | string · required | See the response example for representative data. |
| raw_type | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workouts/{workoutId}/gradeReturns the calculated grade for one workout.
/api/v1/workouts/{workoutId}/gradeRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| workoutId* | path | string | Workout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f |
Response
The request completed successfully.
{
"workout_id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
"grade": "A"
}| Field | Type | Meaning |
|---|---|---|
| workout_id | string · required | See the response example for representative data. |
| grade | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workouts/gradesLists workout identifiers, start times, and grades for a date range.
/api/v1/workouts/gradesRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"data": [
{
"id": "api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f",
"start_time": "2026-06-28T13:00:00.000Z",
"grade": "A"
}
],
"next_cursor": "MjAyNi0wNi0yOFQxMzowMDowMC4wMDBafDEwNDI"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.start_time | string · required | See the response example for representative data. |
| data.grade | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workouts/{workoutId}/expandedReturns the complete workout, including heart-rate and calorie sample arrays when recorded.
/api/v1/workouts/{workoutId}/expandedRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| workoutId* | path | string | Workout identifier.Example: api_3a99efb4-6ac9-44f7-8a0c-663a8ee6464f |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| type | string · required | See the response example for representative data. |
| start_time | string · required | See the response example for representative data. |
| end_time | string · required | See the response example for representative data. |
| duration_minutes | integer · required | See the response example for representative data. |
| calories_burned | integer · required | See the response example for representative data. |
| average_heart_rate | integer · required | See the response example for representative data. |
| min_heart_rate | integer · required | See the response example for representative data. |
| max_heart_rate | integer · required | See the response example for representative data. |
| heart_rate_samples | array<object> · required | See the response example for representative data. |
| heart_rate_samples.offset_seconds | integer · required | See the response example for representative data. |
| heart_rate_samples.bpm | integer · required | See the response example for representative data. |
| distance_meters | integer · required | See the response example for representative data. |
| steps | integer · required | See the response example for representative data. |
| elevation_gain_meters | integer · required | See the response example for representative data. |
| average_speed_mps | number · required | See the response example for representative data. |
| max_speed_mps | number · required | See the response example for representative data. |
| average_power_watts | integer · required | See the response example for representative data. |
| average_cadence | integer · required | See the response example for representative data. |
| calorie_samples | array<object> · required | See the response example for representative data. |
| calorie_samples.offset_seconds | integer · required | See the response example for representative data. |
| calorie_samples.calories | integer · required | See the response example for representative data. |
| provider | string · required | See the response example for representative data. |
| original_id | string · required | See the response example for representative data. |
| grade | string · required | See the response example for representative data. |
| synced_at | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| updated_at | string · required | See the response example for representative data. |
| raw_type | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/workouts/insightsAggregates volume, calories, heart rate, grades, and workout types over a date range.
/api/v1/workouts/insightsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| period | object · required | See the response example for representative data. |
| period.from | string · required | See the response example for representative data. |
| period.to | string · required | See the response example for representative data. |
| workout_count | integer · required | See the response example for representative data. |
| total_minutes | integer · required | See the response example for representative data. |
| total_calories | string · required | See the response example for representative data. |
| grade_distribution | array<object> · required | See the response example for representative data. |
| grade_distribution.grade | string · required | See the response example for representative data. |
| grade_distribution.count | integer · required | See the response example for representative data. |
| by_type | array<object> · required | See the response example for representative data. |
| by_type.type | string · required | See the response example for representative data. |
| by_type.count | integer · required | See the response example for representative data. |
| avg_heart_rate | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}3 operations
/api/v1/moodsCreates an API-owned mood entry. mood_value must be an integer from 1 (Very Low) through 5 (Great).
/api/v1/moodsRequest
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"
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"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
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| mood_value | integer · required | See the response example for representative data. |
| mood_key | string · required | See the response example for representative data. |
| mood_label | string · required | See the response example for representative data. |
| mood_emoji | string · required | See the response example for representative data. |
| note | string · required | See the response example for representative data. |
| source | string · required | See the response example for representative data. |
| meal_log_id | string · required | See the response example for representative data. |
| recorded_at | string · required | See the response example for representative data. |
| local_entry_date | string · required | See the response example for representative data. |
| timezone | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/moodsLists mood entries in reverse chronological order. Notes are omitted unless include_notes=true.
/api/v1/moodsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
| include_notes | query | boolean | Include the private note field in each mood entry.Example: true |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.mood_value | integer · required | See the response example for representative data. |
| data.mood_key | string · required | See the response example for representative data. |
| data.mood_label | string · required | See the response example for representative data. |
| data.mood_emoji | string · required | See the response example for representative data. |
| data.note | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.meal_log_id | string · required | See the response example for representative data. |
| data.recorded_at | string · required | See the response example for representative data. |
| data.local_entry_date | string · required | See the response example for representative data. |
| data.timezone | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/moods/{moodId}/responsesRecords the submitted prompt action for an API-owned mood entry. Repeated submissions for the same local date are deduplicated.
/api/v1/moods/{moodId}/responsesRequest
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"
}'| Parameter | In | Type | Description |
|---|---|---|---|
| moodId* | path | string | Mood entry identifier.Example: 7fd304e1-7823-4352-a855-33d0da83bf28 |
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"action": "submitted",
"local_entry_date": "2026-06-29",
"timezone": "America/Denver"
}Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| local_entry_date | string · required | See the response example for representative data. |
| timezone | string · required | See the response example for representative data. |
| action | string · required | See the response example for representative data. |
| mood_entry_id | string · required | See the response example for representative data. |
| recorded_at | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}2 operations
/api/v1/wellness/metricsReturns the latest value for each supported wellness metric. An account with no exam snapshots returns a null snapshot_at and an empty metrics object.
/api/v1/wellness/metricsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/wellness/metrics' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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
}
}| Field | Type | Meaning |
|---|---|---|
| snapshot_at | string · required | See the response example for representative data. |
| metrics | object · required | See the response example for representative data. |
| metrics.height | string · required | See the response example for representative data. |
| metrics.weight | string · required | See the response example for representative data. |
| metrics.bmi | string · required | See the response example for representative data. |
| metrics.systolic_bp | integer · required | See the response example for representative data. |
| metrics.diastolic_bp | integer · required | See the response example for representative data. |
| metrics.body_temp_f | string · required | See the response example for representative data. |
| metrics.resting_hr | integer · required | See the response example for representative data. |
| metrics.respiratory_rate | integer · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/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.
/api/v1/wellness/metrics/{metricKey}Request
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'| Parameter | In | Type | Description |
|---|---|---|---|
| metricKey* | path | string | Supported wellness metric key.Example: weight |
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.snapshot_at | string · required | See the response example for representative data. |
| data.value | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}4 operations
/api/v1/goals/wellnessReturns active wellness goals across visible sources.
/api/v1/goals/wellnessRequest
curl --request GET 'https://www.foodabcs.com/api/v1/goals/wellness' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.goal | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/goals/wellnessReplaces this app’s active wellness goals with one to three supported goal names and returns all active goals.
/api/v1/goals/wellnessRequest
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"
]
}'This request has no path or query parameters.
{
"goals": [
"Improve Cardiovascular Health",
"Better Sleep Quality"
]
}Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.goal | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/goals/nutritionReturns current nutrition goals and records whether each value came from the user or another source.
/api/v1/goals/nutritionRequest
curl --request GET 'https://www.foodabcs.com/api/v1/goals/nutrition' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.metric_id | string · required | See the response example for representative data. |
| data.target_value | string · required | See the response example for representative data. |
| data.target_unit | string · required | See the response example for representative data. |
| data.goal_kind | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.updated_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/goals/nutritionUpserts this app’s nutrition targets by metric_id and goal_kind, then returns all current nutrition goals; omitted goals are not deleted.
/api/v1/goals/nutritionRequest
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"
}
]
}'This request has no path or query parameters.
{
"goals": [
{
"metric_id": "protein",
"target_value": 120,
"target_unit": "g",
"goal_kind": "daily_target"
}
]
}Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.metric_id | string · required | See the response example for representative data. |
| data.target_value | string · required | See the response example for representative data. |
| data.target_unit | string · required | See the response example for representative data. |
| data.goal_kind | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.updated_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}11 operations
/api/v1/physical-exams/latestReturns the latest physical-exam snapshot, or an empty JSON object when no snapshot exists.
/api/v1/physical-exams/latestRequest
curl --request GET 'https://www.foodabcs.com/api/v1/physical-exams/latest' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/physical-examsLists physical-exam snapshots in reverse chronological order.
/api/v1/physical-examsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/physical-exams?limit=25&cursor=MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| limit | query | integer | Number of records to return (1–100).Example: 25 |
| cursor | query | string | Opaque next_cursor from the previous response.Example: MjAyNi0wNi0yOVQxODozMDowMC4wMDBafDEwNDI |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.snapshot_at | string · required | See the response example for representative data. |
| data.source | string · required | See the response example for representative data. |
| data.height | string · required | See the response example for representative data. |
| data.weight | string · required | See the response example for representative data. |
| data.bmi | string · required | See the response example for representative data. |
| data.systolic_bp | integer · required | See the response example for representative data. |
| data.diastolic_bp | integer · required | See the response example for representative data. |
| data.body_temp_f | string · required | See the response example for representative data. |
| data.resting_hr | integer · required | See the response example for representative data. |
| data.respiratory_rate | integer · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
| next_cursor | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/physical-examsCreates an API-owned physical-exam snapshot. Omitted measurements are stored as null.
/api/v1/physical-examsRequest
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
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"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
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| user_id | string · required | See the response example for representative data. |
| snapshot_at | string · required | See the response example for representative data. |
| source | string · required | See the response example for representative data. |
| height | string · required | See the response example for representative data. |
| weight | string · required | See the response example for representative data. |
| bmi | string · required | See the response example for representative data. |
| systolic_bp | integer · required | See the response example for representative data. |
| diastolic_bp | integer · required | See the response example for representative data. |
| body_temp_f | string · required | See the response example for representative data. |
| resting_hr | integer · required | See the response example for representative data. |
| respiratory_rate | integer · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/dietary-restrictionsReturns active dietary restrictions across visible sources.
/api/v1/dietary-restrictionsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/dietary-restrictions' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.restriction | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/dietary-restrictionsReplaces this app’s active dietary restrictions and returns all active restrictions.
/api/v1/dietary-restrictionsRequest
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"
]
}'This request has no path or query parameters.
{
"restrictions": [
"Tree nuts",
"Shellfish"
]
}Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.restriction | string · required | See the response example for representative data. |
| data.removed_at | stringnull · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/conditionsReturns active conditions and optional diagnosed months.
/api/v1/conditionsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/conditions' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.condition_key | string · required | See the response example for representative data. |
| data.diagnosed_month | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/conditionsReplaces this app’s active conditions. diagnosed_month uses YYYY-MM when known.
/api/v1/conditionsRequest
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"
}
]
}'This request has no path or query parameters.
{
"conditions": [
{
"condition_key": "hypertension",
"diagnosed_month": "2024-11"
}
]
}Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.condition_key | string · required | See the response example for representative data. |
| data.diagnosed_month | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/medicationsReturns medications without an ended_month.
/api/v1/medicationsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/medications' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.name | string · required | See the response example for representative data. |
| data.rxcui | string · required | See the response example for representative data. |
| data.ingredient | string · required | See the response example for representative data. |
| data.ingredient_rxcui | string · required | See the response example for representative data. |
| data.started_month | string · required | See the response example for representative data. |
| data.ended_month | stringnull · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.updated_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/medications/historyReturns active and ended medications in reverse chronological order.
/api/v1/medications/historyRequest
curl --request GET 'https://www.foodabcs.com/api/v1/medications/history' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.name | string · required | See the response example for representative data. |
| data.rxcui | string · required | See the response example for representative data. |
| data.ingredient | string · required | See the response example for representative data. |
| data.ingredient_rxcui | string · required | See the response example for representative data. |
| data.started_month | string · required | See the response example for representative data. |
| data.ended_month | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
| data.updated_at | string · required | See the response example for representative data. |
| data.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/medicationsCreates one API-owned medication row. Month fields use YYYY-MM.
/api/v1/medicationsRequest
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"
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"name": "Lisinopril 10 MG Oral Tablet",
"rxcui": "314076",
"ingredient": "lisinopril",
"ingredient_rxcui": "29046",
"started_month": "2025-01"
}Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| rxcui | string · required | See the response example for representative data. |
| ingredient | string · required | See the response example for representative data. |
| ingredient_rxcui | string · required | See the response example for representative data. |
| started_month | string · required | See the response example for representative data. |
| ended_month | stringnull · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| updated_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/medications/{medicationId}Sets ended_month on an API-owned medication. If omitted, ended_month defaults to the current UTC month.
/api/v1/medications/{medicationId}Request
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'| Parameter | In | Type | Description |
|---|---|---|---|
| medicationId* | path | string | Medication identifier.Example: b035d85f-86a3-4f2f-b231-a4b1a2488f73 |
| ended_month | query | string | End month in YYYY-MM format; defaults to the current UTC month.Example: 2026-06 |
Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| name | string · required | See the response example for representative data. |
| rxcui | string · required | See the response example for representative data. |
| ingredient | string · required | See the response example for representative data. |
| ingredient_rxcui | string · required | See the response example for representative data. |
| started_month | string · required | See the response example for representative data. |
| ended_month | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| updated_at | string · required | See the response example for representative data. |
| source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}4 operations
/api/v1/foods/searchReturns matching foods and pagination metadata. Result counts and identifiers are strings.
/api/v1/foods/searchRequest
curl --request GET 'https://www.foodabcs.com/api/v1/foods/search?q=plain+greek+yogurt' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| q* | query | string | Food search phrase.Example: plain greek yogurt |
Response
The request completed successfully.
{
"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"
}
}| Field | Type | Meaning |
|---|---|---|
| data | object · required | See the response example for representative data. |
| data.foods | object · required | See the response example for representative data. |
| data.foods.food | array<object> · required | See the response example for representative data. |
| data.page_number | string · required | See the response example for representative data. |
| data.max_results | string · required | See the response example for representative data. |
| data.total_results | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/foods/barcode/{upc}Looks up packaged-food nutrition by an 8–14 digit UPC or EAN barcode.
/api/v1/foods/barcode/{upc}Request
curl --request GET 'https://www.foodabcs.com/api/v1/foods/barcode/012345678905' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| upc* | path | string | UPC or EAN barcode containing 8–14 digits.Example: 012345678905 |
Response
The request completed successfully.
{
"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
}
}| Field | Type | Meaning |
|---|---|---|
| food | object · required | See the response example for representative data. |
| food.id | integer · required | See the response example for representative data. |
| food.name | string · required | See the response example for representative data. |
| food.amount | number · required | See the response example for representative data. |
| food.unit | string · required | See the response example for representative data. |
| food.type | string · required | See the response example for representative data. |
| food.brand | string · required | See the response example for representative data. |
| food.brand_name | string · required | See the response example for representative data. |
| food.barcode | string · required | See the response example for representative data. |
| food.upc | string · required | See the response example for representative data. |
| food.nutrition | object · required | See the response example for representative data. |
| food.nutrition.nutrients | array<object> · required | See the response example for representative data. |
| food.nutrition.weight_per_serving | object · required | See the response example for representative data. |
| food.logged_nutrients | array<object> · required | See the response example for representative data. |
| food.logged_nutrients.key | string · required | See the response example for representative data. |
| food.logged_nutrients.name | string · required | See the response example for representative data. |
| food.logged_nutrients.amount | integer · required | See the response example for representative data. |
| food.logged_nutrients.unit | string · required | See the response example for representative data. |
| food.stored_calories | integer · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/farmers-marketsReturns nearby market listings for a latitude and longitude.
/api/v1/farmers-marketsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| lat* | query | number | Latitude between -90 and 90.Example: 39.7392 |
| lng* | query | number | Longitude between -180 and 180.Example: -104.9903 |
| radius_miles | query | number | Search radius from 1 through 100 miles.Example: 30 |
Response
The request completed successfully.
{
"error": 0,
"data": [
{
"listing_id": "1001234",
"listing_name": "Union Station Farmers Market",
"location_y": "39.752",
"location_x": "-104.999"
}
]
}| Field | Type | Meaning |
|---|---|---|
| error | integer · required | See the response example for representative data. |
| data | array<object> · required | See the response example for representative data. |
| data.listing_id | string · required | See the response example for representative data. |
| data.listing_name | string · required | See the response example for representative data. |
| data.location_y | string · required | See the response example for representative data. |
| data.location_x | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/medications/searchReturns normalized medication matches for a name search.
/api/v1/medications/searchRequest
curl --request GET 'https://www.foodabcs.com/api/v1/medications/search?q=lisinopril' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json'| Parameter | In | Type | Description |
|---|---|---|---|
| q* | query | string | Medication search phrase of at least two characters.Example: lisinopril |
Response
The request completed successfully.
{
"results": [
{
"rxcui": "314076",
"name": "Lisinopril 10 MG Oral Tablet",
"tty": "SCD"
}
]
}| Field | Type | Meaning |
|---|---|---|
| results | array<object> · required | See the response example for representative data. |
| results.rxcui | string · required | See the response example for representative data. |
| results.name | string · required | See the response example for representative data. |
| results.tty | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}3 operations
/api/v1/partner/usageReturns aggregate calls, errors, cost, active users, and an endpoint breakdown across the partner’s apps.
/api/v1/partner/usageRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| period | object · required | See the response example for representative data. |
| period.from | string · required | See the response example for representative data. |
| period.to | string · required | See the response example for representative data. |
| totals | object · required | See the response example for representative data. |
| totals.call_count | integer · required | See the response example for representative data. |
| totals.error_count | integer · required | See the response example for representative data. |
| totals.cost_cents | integer · required | See the response example for representative data. |
| totals.active_user_count | integer · required | See the response example for representative data. |
| endpoints | array<object> · required | See the response example for representative data. |
| endpoints.endpoint_key | string · required | See the response example for representative data. |
| endpoints.call_count | integer · required | See the response example for representative data. |
| endpoints.error_count | integer · required | See the response example for representative data. |
| endpoints.cost_cents | integer · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/usage/dailyReturns daily usage rows by endpoint across the partner’s apps.
/api/v1/partner/usage/dailyRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | Inclusive ISO 8601 range start.Example: 2026-06-01T00:00:00Z |
| to | query | string | Inclusive ISO 8601 range end.Example: 2026-06-30T23:59:59Z |
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.usage_date | string · required | See the response example for representative data. |
| data.partner_id | string · required | See the response example for representative data. |
| data.endpoint_key | string · required | See the response example for representative data. |
| data.call_count | integer · required | See the response example for representative data. |
| data.error_count | integer · required | See the response example for representative data. |
| data.cost_cents | string · required | See the response example for representative data. |
| data.expense_cents | string · required | See the response example for representative data. |
| data.is_sandbox | boolean · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/costsReturns month-to-date spend, the configured spend cap, and every active endpoint price.
/api/v1/partner/costsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/costs' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| month_to_date_spend_cents | integer · required | See the response example for representative data. |
| monthly_spend_cap_cents | integer · required | See the response example for representative data. |
| endpoint_prices | array<object> · required | See the response example for representative data. |
| endpoint_prices.endpoint_key | string · required | See the response example for representative data. |
| endpoint_prices.price_cents | number · required | See the response example for representative data. |
| endpoint_prices.tier2_price_cents | number · required | See the response example for representative data. |
| endpoint_prices.infra_cost_cents | number · required | See the response example for representative data. |
| endpoint_prices.active | boolean · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}4 operations
/api/v1/partner/analytics/overviewReturns own-source engagement aggregates. Buckets below the privacy threshold are returned as suppressed rather than exposing small cohorts.
/api/v1/partner/analytics/overviewRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/overview' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| overview | value · required | See the response example for representative data. |
| engagement_by_week | array<value> · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "tier_required",
"message": "Tier 2 is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/analytics/mealsReturns privacy-suppressed grade, nutrient, and weekly meal aggregates for records created by this partner app.
/api/v1/partner/analytics/mealsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/meals' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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
}
]
}| Field | Type | Meaning |
|---|---|---|
| grade_distribution | array<value> · required | See the response example for representative data. |
| nutrient_averages | array<value> · required | See the response example for representative data. |
| trends | array<value> · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "tier_required",
"message": "Tier 2 is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/analytics/workoutsReturns privacy-suppressed type, grade, and weekly workout aggregates for records created by this partner app.
/api/v1/partner/analytics/workoutsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/workouts' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| by_type | array<value> · required | See the response example for representative data. |
| grade_distribution | array<value> · required | See the response example for representative data. |
| trends | array<value> · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "tier_required",
"message": "Tier 2 is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/analytics/cohortsReturns privacy-suppressed weekly engagement cohorts for own-source activity.
/api/v1/partner/analytics/cohortsRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/analytics/cohorts' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"cohorts": [
{
"week": "2026-06-22",
"distinct_user_count": 247,
"average_events_per_user": "8.03"
}
]
}| Field | Type | Meaning |
|---|---|---|
| cohorts | array<value> · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "tier_required",
"message": "Tier 2 is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}2 operations
/api/v1/partner/usersLists users with a current individual-access grant. Requires Tier 2 and verified compliance; every row is PHI-audited.
/api/v1/partner/usersRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/users' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.user_id | string · required | See the response example for representative data. |
| data.scope | string · required | See the response example for representative data. |
| data.granted_at | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "compliance_required",
"message": "Compliance verification is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/users/{userId}/recordsReturns 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.
/api/v1/partner/users/{userId}/recordsRequest
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'| Parameter | In | Type | Description |
|---|---|---|---|
| userId* | path | string | User UUID with an active individual-access grant.Example: 6bc72c8d-6d8a-4e85-9cbb-c02d19dca12f |
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| user_id | string · required | See the response example for representative data. |
| meals | array<object> · required | See the response example for representative data. |
| meals.id | string · required | See the response example for representative data. |
| meals.user_id | string · required | See the response example for representative data. |
| meals.timestamp | string · required | See the response example for representative data. |
| meals.name | string · required | See the response example for representative data. |
| meals.ingredients | array<object> · required | See the response example for representative data. |
| meals.ingredients.name | string · required | See the response example for representative data. |
| meals.ingredients.amount | integer · required | See the response example for representative data. |
| meals.ingredients.unit | string · required | See the response example for representative data. |
| meals.ingredients.nutrition | object · required | See the response example for representative data. |
| meals.total_calories | string · required | See the response example for representative data. |
| meals.meal_score | string · required | See the response example for representative data. |
| meals.is_favorite | boolean · required | See the response example for representative data. |
| meals.meal_classifications | array<object> · required | See the response example for representative data. |
| meals.meal_classifications.key | string · required | See the response example for representative data. |
| meals.meal_classifications.label | string · required | See the response example for representative data. |
| meals.meal_classification_version | string · required | See the response example for representative data. |
| meals.meal_classified_at | string · required | See the response example for representative data. |
| meals.meal_behavior_events | array<value> · required | See the response example for representative data. |
| meals.meal_behavior_version | string · required | See the response example for representative data. |
| meals.meal_behavior_detected_at | string · required | See the response example for representative data. |
| meals.source_app_id | string · required | See the response example for representative data. |
| workouts | array<object> · required | See the response example for representative data. |
| workouts.id | string · required | See the response example for representative data. |
| workouts.user_id | string · required | See the response example for representative data. |
| workouts.type | string · required | See the response example for representative data. |
| workouts.start_time | string · required | See the response example for representative data. |
| workouts.end_time | string · required | See the response example for representative data. |
| workouts.duration_minutes | integer · required | See the response example for representative data. |
| workouts.calories_burned | integer · required | See the response example for representative data. |
| workouts.average_heart_rate | integer · required | See the response example for representative data. |
| workouts.min_heart_rate | integer · required | See the response example for representative data. |
| workouts.max_heart_rate | integer · required | See the response example for representative data. |
| workouts.heart_rate_samples | array<object> · required | See the response example for representative data. |
| workouts.heart_rate_samples.offset_seconds | integer · required | See the response example for representative data. |
| workouts.heart_rate_samples.bpm | integer · required | See the response example for representative data. |
| workouts.distance_meters | integer · required | See the response example for representative data. |
| workouts.steps | integer · required | See the response example for representative data. |
| workouts.elevation_gain_meters | integer · required | See the response example for representative data. |
| workouts.average_speed_mps | number · required | See the response example for representative data. |
| workouts.max_speed_mps | number · required | See the response example for representative data. |
| workouts.average_power_watts | integer · required | See the response example for representative data. |
| workouts.average_cadence | integer · required | See the response example for representative data. |
| workouts.calorie_samples | array<object> · required | See the response example for representative data. |
| workouts.calorie_samples.offset_seconds | integer · required | See the response example for representative data. |
| workouts.calorie_samples.calories | integer · required | See the response example for representative data. |
| workouts.provider | string · required | See the response example for representative data. |
| workouts.original_id | string · required | See the response example for representative data. |
| workouts.grade | string · required | See the response example for representative data. |
| workouts.synced_at | string · required | See the response example for representative data. |
| workouts.created_at | string · required | See the response example for representative data. |
| workouts.updated_at | string · required | See the response example for representative data. |
| workouts.raw_type | string · required | See the response example for representative data. |
| workouts.source_app_id | string · required | See the response example for representative data. |
| moods | array<object> · required | See the response example for representative data. |
| moods.id | string · required | See the response example for representative data. |
| moods.user_id | string · required | See the response example for representative data. |
| moods.mood_value | integer · required | See the response example for representative data. |
| moods.mood_key | string · required | See the response example for representative data. |
| moods.mood_label | string · required | See the response example for representative data. |
| moods.mood_emoji | string · required | See the response example for representative data. |
| moods.source | string · required | See the response example for representative data. |
| moods.meal_log_id | string · required | See the response example for representative data. |
| moods.recorded_at | string · required | See the response example for representative data. |
| moods.local_entry_date | string · required | See the response example for representative data. |
| moods.timezone | string · required | See the response example for representative data. |
| moods.created_at | string · required | See the response example for representative data. |
| moods.source_app_id | string · required | See the response example for representative data. |
| physical_exams | array<object> · required | See the response example for representative data. |
| physical_exams.id | string · required | See the response example for representative data. |
| physical_exams.user_id | string · required | See the response example for representative data. |
| physical_exams.snapshot_at | string · required | See the response example for representative data. |
| physical_exams.source | string · required | See the response example for representative data. |
| physical_exams.height | string · required | See the response example for representative data. |
| physical_exams.weight | string · required | See the response example for representative data. |
| physical_exams.bmi | string · required | See the response example for representative data. |
| physical_exams.systolic_bp | integer · required | See the response example for representative data. |
| physical_exams.diastolic_bp | integer · required | See the response example for representative data. |
| physical_exams.body_temp_f | string · required | See the response example for representative data. |
| physical_exams.resting_hr | integer · required | See the response example for representative data. |
| physical_exams.respiratory_rate | integer · required | See the response example for representative data. |
| physical_exams.created_at | string · required | See the response example for representative data. |
| physical_exams.source_app_id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "compliance_required",
"message": "Compliance verification is required.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}3 operations
/api/v1/partner/webhooksLists registered webhook destinations without returning signing secrets.
/api/v1/partner/webhooksRequest
curl --request GET 'https://www.foodabcs.com/api/v1/partner/webhooks' \
--header 'Authorization: Bearer $PARTNER_API_KEY' \
--header 'Accept: application/json'This request has no path or query parameters.
Response
The request completed successfully.
{
"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"
}
]
}| Field | Type | Meaning |
|---|---|---|
| data | array<object> · required | See the response example for representative data. |
| data.id | string · required | See the response example for representative data. |
| data.url | string · required | See the response example for representative data. |
| data.events | array<string> · required | See the response example for representative data. |
| data.status | string · required | See the response example for representative data. |
| data.created_at | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/webhooksRegisters a destination and returns its signing secret once. Store the secret securely; later list calls omit it.
/api/v1/partner/webhooksRequest
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"
]
}'| Parameter | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Optional unique key that safely replays the first response when the same request body is retried.Example: 61d6c26b-4f60-4a03-a8df-c65bf86a6b64 |
{
"url": "https://partner.example.com/webhooks/foodabcs",
"events": [
"meal.graded",
"grant.revoked"
]
}Response
The request completed successfully.
{
"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"
}| Field | Type | Meaning |
|---|---|---|
| id | string · required | See the response example for representative data. |
| url | string · required | See the response example for representative data. |
| events | array<string> · required | See the response example for representative data. |
| status | string · required | See the response example for representative data. |
| created_at | string · required | See the response example for representative data. |
| secret | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The Idempotency-Key was already used with a different request body.
{
"error": {
"code": "idempotency_conflict",
"message": "Idempotency-Key was already used with a different request.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}/api/v1/partner/webhooks/{webhookId}Deletes one webhook destination owned by the partner.
/api/v1/partner/webhooks/{webhookId}Request
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'| Parameter | In | Type | Description |
|---|---|---|---|
| webhookId* | path | string | Webhook UUID.Example: 7d3fb86b-470d-4855-8daf-c574a81bf2dc |
Response
The request completed successfully.
{
"deleted": true,
"id": "7d3fb86b-470d-4855-8daf-c574a81bf2dc"
}| Field | Type | Meaning |
|---|---|---|
| deleted | boolean · required | See the response example for representative data. |
| id | string · required | See the response example for representative data. |
The bearer token is missing, invalid, expired, or revoked.
{
"error": {
"code": "invalid_token",
"message": "Missing bearer token.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing setup is required, or API access is suspended after the payment grace period.
{
"error": {
"code": "billing_setup_required",
"message": "Complete billing setup before using API credentials.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Billing access or durable usage metering could not be verified before endpoint work began.
{
"error": {
"code": "metering_unavailable",
"message": "API metering is temporarily unavailable.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The credential lacks the required scope, tier, compliance state, consent, or active partner status.
{
"error": {
"code": "insufficient_scope",
"message": "Required scope is missing.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The requested resource does not exist or is not visible to this credential.
{
"error": {
"code": "not_found",
"message": "Resource not found.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}A body, path, or query value failed validation.
{
"error": {
"code": "validation_failed",
"message": "One or more request values are invalid.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}The app exceeded its rate limit or monthly spend cap.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}FoodABCs could not complete the request.
{
"error": {
"code": "internal_error",
"message": "Internal server error.",
"request_id": "8f6d26b4-4a8b-4c61-a2ba-f08a3f5c15a1"
}
}Pricing
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
Core user-authorized API features plus usage, reliability, and high-level operational data.
Tier 2
Cohort analytics and approved individual-record workflows with suppression and compliance safeguards.
Errors
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.
{
"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 request401Missing, expired, or invalid credential403Scope, tier, consent, or compliance requirement not met404The requested resource does not exist or is not visible409Idempotency key was reused with different request data422Valid JSON that fails field or query validation429Rate limit or spend cap exceeded500Unexpected server failure; report the request IDUse 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
JSON
Download the machine-readable v1 contract for your API client or generator.
Legal
Review credential, data, billing, security, and permitted-use requirements.
Portal
Manage applications, keys, webhooks, usage, and billing in one place.
Create a sandbox application and make your first FoodABCs request today.