PhysiqueIQ API
Integrate competition-grade AI physique analysis into your application. Send a photo, get structured feedback on conditioning, muscle development, symmetry, posing, and overall assessment — calibrated to the athlete's division.
Base URL
https://api.physiqueiq.ai
Current Version
v1
Response Format
JSON
Getting started
Generate an API key from your Settings page, then include it as a Bearer token in every request. Each key is scoped to your account and usage tier.
Authentication
All API requests require a valid API key passed via the Authorization header.
Header format
Authorization: Bearer piq_your_api_key_hereKey format
All API keys begin with the prefix piq_ followed by 48 alphanumeric characters. Keys are shown once at creation — store them securely.
Key management
- •Create and revoke keys from the Settings → API Keys section.
- •Each account can have up to 5 active API keys.
- •Revoking a key takes effect immediately and cannot be undone.
- •Never expose API keys in client-side code, public repos, or URLs.
Endpoints
The API currently exposes a single endpoint for physique analysis.
/api/v1/analyzeSubmit a physique photo for AI-powered analysis. Returns structured feedback covering six assessment categories calibrated to the specified competitive division.
Quick start examples
curl -X POST https://api.physiqueiq.ai/v1/analyze \
-H "Authorization: Bearer piq_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"image": "<base64>",
"mimeType": "image/jpeg",
"poseType": "front_double_bicep",
"division": "classic_physique",
"weight": 225,
"weeksOut": "8"
}'Request / Response
Full specification for the analyze endpoint request body and response shape.
Request body
| Field | Type | Status | Description |
|---|---|---|---|
image | string | required | Base64-encoded image data. Max 20MB decoded. Full resolution preferred — do not downscale. |
mimeType | string | required | Image MIME type. One of: "image/jpeg", "image/png". |
poseType | string | required | The mandatory pose shown in the photo. See accepted values below. |
division | string | required | Competitive division. Analysis is calibrated to division-specific judging criteria. |
weight | number | optional | Current bodyweight in pounds. Used for weight cap context in applicable divisions. |
weeksOut | string | optional | Weeks until competition. Adjusts conditioning expectations in the analysis. |
Accepted poseType values
front_relaxedback_relaxedside_relaxedfront_double_bicepback_double_bicepside_chestabs_thighsrear_lat_spreadmost_muscularhands_overheadAccepted division values
classic_physiquemens_physiquebodybuildingfigurebikiniwellnesswomens_physiquefitnessopen_bodybuilding212Example request body
{
"image": "<base64 encoded image data>",
"mimeType": "image/jpeg",
"poseType": "front_double_bicep",
"division": "classic_physique",
"weight": 225,
"weeksOut": "8"
}Response
| Field | Type | Description |
|---|---|---|
analysis.conditioning | string | Conditioning assessment — separation, striations, vascularity, skin thinness, in prose. No body-fat percentage is returned. |
analysis.muscleDevelopment | string | Muscle size, fullness, density, maturity across all visible muscle groups. |
analysis.symmetryProportion | string | Left/right symmetry, proportional balance, structural flow, V-taper or X-frame assessment. |
analysis.posing | string | Pose execution quality, positioning adjustments, presentation feedback. |
analysis.overallAssessment | string | Summary placing the physique in competitive context for the given division. |
analysis.topPriorities | string | Ranked list of the most impactful improvements the athlete should focus on. |
usage.remaining | number | Requests remaining in the current billing period. |
usage.limit | number | Total requests allowed per billing period for your tier. |
model | string | The AI model used for this analysis. |
promptVersion | string | Hash of the prompt version used. Useful for tracking analysis consistency. |
Example response
{
"analysis": {
"conditioning": "Visible separation in quads with emerging feathering ...",
"muscleDevelopment": "Upper chest is full and ties well into the delts ...",
"symmetryProportion": "Right lat appears slightly wider than left ...",
"posing": "Front double bicep is solid — peak is high ...",
"overallAssessment": "Conditioning is on track for 8 weeks out ...",
"topPriorities": "1. Bring up left lat width\n2. Tighten midsection ..."
},
"usage": {
"remaining": 95,
"limit": 100
},
"model": "claude-sonnet-4-6",
"promptVersion": "a1b2c3d4"
}Rate Limits
Request quotas are enforced per billing cycle. Limits reset on your monthly billing date.
| Tier | Monthly Limit | Rate |
|---|---|---|
| Basic | 250 requests | ~8/day |
| Standard | 1,000 requests | ~33/day |
| Professional | 2,500 requests | ~83/day |
| Enterprise | 10,000 requests | ~333/day |
Rate limit headers
Every response includes headers to help you track usage:
X-RateLimit-Limit: 250
X-RateLimit-Remaining: 245
X-RateLimit-Reset: 2026-04-01T00:00:00ZError Handling
The API uses standard HTTP status codes. Errors return a consistent JSON structure.
Error response format
{
"error": {
"code": "INVALID_POSE_TYPE",
"message": "poseType must be one of: front_relaxed, back_relaxed, ...",
"status": 400
}
}| Status | Meaning | Description |
|---|---|---|
400 | Bad Request | Missing or invalid required fields. Check that image, mimeType, poseType, and division are all present and valid. |
401 | Unauthorized | API key is missing, invalid, or revoked. Verify your Authorization header uses a valid piq_ key. |
413 | Payload Too Large | Image exceeds the 20MB size limit. Compress or resize before sending. |
429 | Rate Limited | Monthly request limit reached for your tier. Upgrade your plan or wait for the next billing cycle. |
500 | Server Error | An unexpected error occurred. Retry with exponential backoff. If persistent, contact support. |
Retry strategy
For 5xx errors, retry with exponential backoff starting at 1 second, up to 3 retries. Do not retry 4xx errors — fix the request instead.
API Pricing
Simple, usage-based pricing. All tiers include access to every pose type and division.
Basic
250 requests/month
- 250 requests/month
- All pose types
- All divisions
- Standard response time
- Email support
Standard
Popular1,000 requests/month
- 1,000 requests/month
- All pose types
- All divisions
- Priority response time
- Priority email support
- Webhook notifications
Professional
2,500 requests/month
- 2,500 requests/month
- All pose types
- All divisions
- Fastest response time
- Priority support
- Webhook notifications
- Custom prompt tuning
Enterprise
10,000+ requests/month
- 10,000+ requests/month
- All pose types
- All divisions
- Fastest response time
- Dedicated support channel
- Webhook notifications
- Custom prompt tuning
- SLA guarantee
Need higher volume or custom terms? Contact us for enterprise pricing.
Try It
Build a sample request payload. This does not make an actual API call — use it to generate the request body for your integration.
/api/v1/analyzeGenerated request body
{
"image": "<base64 encoded image data>",
"mimeType": "image/jpeg",
"poseType": "front_double_bicep",
"division": "classic_physique",
"weight": 225,
"weeksOut": "8"
}