---
title: "Getting started"
description: "Make your first authenticated call to the Skin Analysis API in under five minutes using a JPEG and a Partner ID."
editUrl: true
head: []
template: "doc"
sidebar: {"order":1,"hidden":false,"attrs":{}}
pagefind: true
draft: false
kind: "guide"
tags: ["skin-analysis", "authentication", "quickstart"]
---
import { Steps, Tabs, TabItem, Aside } from "@astrojs/starlight/components";

This guide gets you from zero to a successful round-trip against the test environment. It assumes nothing besides `curl` (or `fetch` / `requests`) and a frontal-face JPEG of at least 600×600 pixels.

<Aside>
Use Partner ID **`jmlv6b2qtS`** for evaluation. It targets `https://partner-test.revieve.com/api/3/` and is safe to commit. Production credentials are issued separately.
</Aside>

<Aside type="caution">
The `components` query parameter is **opt-in additive**, not "filter to". Sending no value means *all defaults*, not *none*. If you want a slim response, pass an explicit comma-separated list. There is no `Authorization` header — auth rides as a `partner_id` form field on the multipart body.
</Aside>

<Steps>

1. **Pick or grab a test image.**

   Any frontal-face JPEG of at least 600×600 pixels works. Strong even lighting and a neutral background give the cleanest results.

2. **Send the image.**

   <Tabs syncKey="lang">
     <TabItem label="curl">
       ```bash
       curl -X POST \
         "https://partner-test.revieve.com/api/3/analyzeImage/?skintone=0&gender=unknown&components=wrinkles,redness,acne,skin_age" \
         -F "partner_id=jmlv6b2qtS" \
         -F "image=@./selfie.jpg"
       ```
     </TabItem>
     <TabItem label="JavaScript (fetch)">
       ```js
       const form = new FormData();
       form.append("partner_id", "jmlv6b2qtS");
       form.append("image", fileInput.files[0]);

       const url = new URL("https://partner-test.revieve.com/api/3/analyzeImage/");
       url.searchParams.set("skintone", "0");
       url.searchParams.set("gender", "unknown");
       url.searchParams.set("components", "wrinkles,redness,acne,skin_age");

       const res = await fetch(url, { method: "POST", body: form });
       const data = await res.json();
       ```
     </TabItem>
     <TabItem label="Python">
       ```python
       import requests

       with open("selfie.jpg", "rb") as f:
           res = requests.post(
               "https://partner-test.revieve.com/api/3/analyzeImage/",
               params={
                   "skintone": 0,
                   "gender": "unknown",
                   "components": "wrinkles,redness,acne,skin_age",
               },
               data={"partner_id": "jmlv6b2qtS"},
               files={"image": f},
           )
           data = res.json()
       ```
     </TabItem>
   </Tabs>

3. **Read the top-level response.**

   ```json
   {
     "message": "OK",
     "face_area": { "bounding_box": [...], "rotation": -2.1 },
     "status": [],
     "results": [
       { "description": "wrinkles", "value": 0.34, "message": "Ok", "..." },
       { "description": "redness",  "value": 0.18, "message": "Ok", "..." }
     ]
   }
   ```

   - `message: "OK"` confirms the call succeeded with no quality issues.
   - Each entry in `results[]` is one component you asked for.
   - `status[]` is empty here; if a code shows up, see [Interpreting results](/guides/interpreting-results/).

4. **Iterate on the `components` list.**

   Trim it to exactly what your UI uses. Fewer components → faster response, smaller payload.

</Steps>

## What's next

- [Authentication](/guides/authentication/) — the Partner-ID model in detail.
- [Your first skin analysis](/guides/your-first-skin-analysis/) — a longer walk-through that wires the response into a UI.
- [Interpreting results](/guides/interpreting-results/) — how to render scores, masks, and overlays.
- [API reference](/api/skin-analysis/) — every parameter, every response field.
