> ## Documentation Index
> Fetch the complete documentation index at: https://opentrain.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Freelancer Profile

> Read an AI trainer's masked public profile by user ID or profile slug: skills, stats, experience, education, and reviews.

Reads an AI trainer's public profile for candidate evaluation — title, bio, skills, stats, label/work experience, education, languages, and reviews. Resolve candidates from proposals (`candidate.id` or `candidate.profileSlug` on [`GET /jobs/{id}/proposals`](/docs/developers/api-reference/jobs/list-proposals)), then [invite](/docs/developers/api-reference/jobs/invite) or [hire](/docs/developers/api-reference/proposals/hire) them.

Identity is masked: first name + last initial (agencies show the agency name with no last-name initial). Personal contact details — including personal email — are never returned; see [privacy](/docs/developers/concepts/privacy-and-work-email). Profiles you cannot view (nonexistent, closed, banned, or restricted by the AI trainer's visibility settings) return `404`, not `403`.

**Requirements:** `proposals:read` scope. Works pre-claim.

## Request

<ParamField path="idOrSlug" type="string" required>
  The AI trainer's user ID or public profile slug.
</ParamField>

## Response

<ResponseField name="freelancer" type="object">
  <Expandable title="freelancer" defaultOpen>
    <ResponseField name="id" type="string">
      User ID.
    </ResponseField>

    <ResponseField name="profileSlug" type="string | null">
      Public profile slug.
    </ResponseField>

    <ResponseField name="profilePath" type="string">
      App-relative profile path (append to `https://app.opentrain.ai`).
    </ResponseField>

    <ResponseField name="displayName" type="string">
      Masked display name, e.g. `Maria G.`.
    </ResponseField>

    <ResponseField name="firstName" type="string | null">
      First name.
    </ResponseField>

    <ResponseField name="lastNameInitial" type="string | null">
      Last-name initial. `null` for agencies.
    </ResponseField>

    <ResponseField name="talentType" type="string | null">
      `Individual` or `Agency`.
    </ResponseField>

    <ResponseField name="title" type="string | null">
      Profile headline.
    </ResponseField>

    <ResponseField name="bio" type="string | null">
      Profile description.
    </ResponseField>

    <ResponseField name="city" type="string | null">
      City.
    </ResponseField>

    <ResponseField name="countryCode" type="string | null">
      ISO country code.
    </ResponseField>

    <ResponseField name="country" type="string | null">
      Country display name.
    </ResponseField>

    <ResponseField name="profilePhotoUrl" type="string | null">
      Profile photo URL.
    </ResponseField>

    <ResponseField name="hourlyRateUsd" type="number | null">
      Listed hourly rate.
    </ResponseField>

    <ResponseField name="availability" type="string | null">
      Stated availability.
    </ResponseField>

    <ResponseField name="expertiseLevel" type="string | null">
      Self-reported expertise level.
    </ResponseField>

    <ResponseField name="englishLevel" type="string | null">
      English proficiency.
    </ResponseField>

    <ResponseField name="memberSince" type="string">
      ISO account-creation timestamp.
    </ResponseField>

    <ResponseField name="identityVerified" type="boolean">
      `true` when identity verification is complete.
    </ResponseField>

    <ResponseField name="skills" type="object">
      `{subjectMatter[], tags[], software[], dataTypes[], labelTypes[]}` — string arrays.
    </ResponseField>

    <ResponseField name="languages" type="object[]">
      `{language, proficiency}` pairs (`proficiency` may be `null`).
    </ResponseField>

    <ResponseField name="stats" type="object">
      `{totalEarnedUsd, billedHours, jobSuccessScore, reviewCount, averageRating}` — `averageRating` is rounded to one decimal, `null` when unrated.
    </ResponseField>

    <ResponseField name="agency" type="object | null">
      For agencies: `{name, website, headcount, industryExperience[]}`. `null` for individuals.
    </ResponseField>

    <ResponseField name="labelExperience" type="object[]">
      Labeling-specific experience entries: `{id, title, description, fromYear, toYear, ongoing, software, dataType, labelTypes[]}`.
    </ResponseField>

    <ResponseField name="workExperience" type="object[]">
      General work history: `{id, title, company, description, fromYear, toYear, current, city, country}`.
    </ResponseField>

    <ResponseField name="education" type="object[]">
      `{id, school, degree, areaOfStudy, fromYear, toYear, description}`.
    </ResponseField>

    <ResponseField name="reviews" type="object[]">
      Employer reviews: `{id, rating, comment, createdAt}` — `rating` rounded to one decimal, `createdAt` ISO.
    </ResponseField>
  </Expandable>
</ResponseField>

## Errors

| Status | `code`         | Meaning                                                                                                |
| ------ | -------------- | ------------------------------------------------------------------------------------------------------ |
| `400`  | `BAD_REQUEST`  | Missing `idOrSlug`                                                                                     |
| `401`  | `UNAUTHORIZED` | Missing or invalid token                                                                               |
| `403`  | `FORBIDDEN`    | Missing `proposals:read` scope                                                                         |
| `404`  | `NOT_FOUND`    | No such profile, or the profile is not visible to you (`details: {resource: "freelancers", idOrSlug}`) |

<RequestExample>
  ```bash curl theme={null}
  curl -sS https://app.opentrain.ai/api/public/v1/freelancers/<USER_ID_OR_SLUG> \
    -H "Authorization: Bearer $OT_API_TOKEN"
  ```

  ```bash CLI theme={null}
  opentrain freelancers get --id <USER_ID_OR_SLUG> --json
  ```

  ```json MCP: opentrain_get_freelancer_profile theme={null}
  {
    "idOrSlug": "<USER_ID_OR_SLUG>"
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "freelancer": {
      "id": "<FREELANCER_ID>",
      "profileSlug": "maria-g",
      "profilePath": "/profile/maria-g",
      "displayName": "Maria G.",
      "firstName": "Maria",
      "lastNameInitial": "G",
      "talentType": "Individual",
      "title": "Text Annotation Specialist",
      "bio": "Native Spanish speaker with 4 years of NLP annotation experience.",
      "city": "Madrid",
      "countryCode": "ES",
      "country": "Spain",
      "profilePhotoUrl": "https://app.opentrain.ai/<PHOTO_PATH>",
      "hourlyRateUsd": 18,
      "availability": "FULL_TIME",
      "expertiseLevel": "EXPERT",
      "englishLevel": "FLUENT",
      "memberSince": "2024-03-02T10:00:00.000Z",
      "identityVerified": true,
      "skills": {
        "subjectMatter": ["Social media", "Customer support"],
        "tags": ["SENTIMENT_ANALYSIS", "TEXT_CLASSIFICATION"],
        "software": ["<ANNOTATION_TOOL>"],
        "dataTypes": ["TEXT"],
        "labelTypes": ["CLASSIFICATION"]
      },
      "languages": [
        { "language": "Spanish", "proficiency": "NATIVE" },
        { "language": "English", "proficiency": "FLUENT" }
      ],
      "stats": {
        "totalEarnedUsd": 2400,
        "billedHours": 310,
        "jobSuccessScore": 98,
        "reviewCount": 7,
        "averageRating": 4.9
      },
      "agency": null,
      "labelExperience": [
        {
          "id": "<EXPERIENCE_ID>",
          "title": "Spanish tweet sentiment corpus",
          "description": "Annotated 120k tweets for a sentiment model.",
          "fromYear": 2023,
          "toYear": 2025,
          "ongoing": false,
          "software": "<ANNOTATION_TOOL>",
          "dataType": "TEXT",
          "labelTypes": ["CLASSIFICATION"]
        }
      ],
      "workExperience": [],
      "education": [],
      "reviews": [
        {
          "id": "<REVIEW_ID>",
          "rating": 5,
          "comment": "Fast, precise, great guideline questions.",
          "createdAt": "2026-01-20T12:00:00.000Z"
        }
      ]
    }
  }
  ```
</ResponseExample>
