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

# Profile

> Fetches a public TikTok profile by username (`handle`) or numeric user id (`userId`) — pass exactly one. Returns identity (ids, username, nickname, bio, bio link, avatars, created date), badges and account type (verified, private, organization, business category, TikTok Shop seller), exact stats (followers, following, likes, videos, friends), the LIVE room id and upcoming LIVE events, visible profile tabs and interaction settings.

<Info>
  **Cost: 1 credit** per successful request. Errors and cache hits (`cache_max_age`) are free.
</Info>

<Accordion title="Copy for AI assistant" icon="sparkles">
  Paste this into ChatGPT, Claude or your coding assistant to generate working code for this endpoint (use the copy button).

  ```text Prompt
  I want to make an API call to /v1/tiktok/profile. Here are the details:

  Endpoint: GET https://api.scraperize.com/v1/tiktok/profile
  Description: Fetches a public TikTok profile by username (`handle`) or numeric user id (`userId`) — pass exactly one. Returns identity (ids, username, nickname, bio, bio link, avatars, created date), badges and account type (verified, private, organization, business category, TikTok Shop seller), exact stats (followers, following, likes, videos, friends), the LIVE room id and upcoming LIVE events, visible profile tabs and interaction settings.

  Required Headers:
  - x-api-key: Your API key

  Parameters:
  - handle (string): The TikTok username (with or without a leading @, or a tiktok.com/@username URL). Provide this or `userId`, not both.
  - userId (string): The TikTok account's numeric user id. Provide this or `handle`, not both.
  - cache_max_age (select): Optional. Return a cached result if one this age or newer exists — served for **0 credits** with `meta.cached=true` and `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and refreshes the cache. Omit to always scrape fresh.

  Example Response:
  {
    "data": {
      "profile": {
        "id": "127905465618821121",
        "secUid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
        "handle": "khaby.lame",
        "url": "https://www.tiktok.com/@khaby.lame",
        "nickname": "Khabane lame",
        "bio": "Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎",
        "bioLink": null,
        "avatarUrl": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=b1663fd…",
        "avatarUrls": {
          "large": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=b1663fd…",
          "medium": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?dr=14579&refresh_token=73ffa012&…",
          "thumb": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=14579&refresh_token=595c67c5&…"
        },
        "createdAt": "2016-08-10T22:02:34.000Z",
        "nicknameUpdatedAt": null,
        "verified": true,
        "privateAccount": false,
        "secret": false,
        "isOrganization": false,
        "ttSeller": false,
        "commerceUserInfo": {
          "commerceUser": false,
          "category": null,
          "categoryButton": false,
          "downloadLink": {
            "android": null,
            "ios": null
          }
        },
        "ftc": false,
        "isADVirtual": false,
        "language": "en",
        "liveRoomId": null,
        "openFavorite": false,
        "relation": 0,
        "uniqueIdModifyTime": null,
        "followingVisibility": 1,
        "isEmbedBanned": false,
        "canExpPlaylist": true,
        "profileEmbedPermission": 1,
        "suggestAccountBind": false,
        "userStoryStatus": 0,
        "recommendReason": null,
        "nowInvitationCardUrl": null,
        "tabs": {
          "music": false,
          "questions": false,
          "playlists": false
        },
        "settings": {
          "comment": 0,
          "duet": 0,
          "stitch": 0,
          "download": 0
        },
        "stats": {
          "followerCount": 162999391,
          "followingCount": 81,
          "likeCount": 2685535182,
          "videoCount": 1357,
          "friendCount": 77
        },
        "liveEvents": []
      },
      "fetchedAt": "2026-10-05T14:44:08.924Z"
    },
    "meta": {
      "requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
      "creditsCharged": 1,
      "creditsRemaining": 4999,
      "cached": false
    }
  }

  Please help me write code in my preferred programming language to make this API call and handle the response appropriately. Include error handling and best practices.
  ```
</Accordion>


## OpenAPI

````yaml /api-reference/openapi.json get /v1/tiktok/profile
openapi: 3.0.3
info:
  title: Scraperize API
  version: 1.0.0
  description: >-
    Extract public data from social media platforms as clean JSON. Endpoints are
    split by platform and by what they return, e.g. `GET /v1/twitter/tweet`.


    ## Authentication

    Send your API key in the `x-api-key` header (or `Authorization: Bearer
    <key>`). Create keys in your dashboard.


    ## Credits

    Each successful live scrape costs **1 credit**. Credits are prepaid and
    never expire.


    ## Caching

    Every endpoint accepts an optional `cache_max_age`
    (`1d`|`3d`|`7d`|`14d`|`30d`). A cache hit within that window is returned for
    **0 credits**.


    ## Responses

    Success returns `{ "data": …, "meta": { "requestId", … } }`. Errors return
    `{ "error": { "code", "message", "requestId" } }` with a matching HTTP
    status. `meta` on a scrape carries `creditsCharged`, `creditsRemaining`,
    `cached`, and (on a hit) `cachedAt`.


    ## Rate limits

    Requests are limited per team per minute; over the limit returns `429` with
    a `Retry-After` header.
servers:
  - url: https://api.scraperize.com
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Twitter
    description: Twitter / X scraping endpoints
  - name: Facebook
    description: Facebook scraping endpoints
  - name: Linkme
    description: Linkme (link.me) scraping endpoints
  - name: Amazon
    description: Amazon (creator shop / storefront) scraping endpoints
  - name: Linkbio
    description: Linkbio (lnk.bio) scraping endpoints
  - name: Pillar
    description: Pillar (pillar.io) scraping endpoints
  - name: Komi
    description: Komi (komi.io) scraping endpoints
  - name: Linktree
    description: Linktree (linktr.ee) scraping endpoints
  - name: Kick
    description: Kick (kick.com) scraping endpoints
  - name: Snapchat
    description: Snapchat (snapchat.com) scraping endpoints
  - name: Telegram
    description: Telegram (t.me) scraping endpoints
  - name: LinkedIn
    description: LinkedIn scraping endpoints
  - name: Twitch
    description: Twitch scraping endpoints
  - name: TikTok
    description: TikTok (tiktok.com) scraping endpoints
paths:
  /v1/tiktok/profile:
    get:
      tags:
        - TikTok
      summary: Profile
      description: >-
        Fetches a public TikTok profile by username (`handle`) or numeric user
        id (`userId`) — pass exactly one. Returns identity (ids, username,
        nickname, bio, bio link, avatars, created date), badges and account type
        (verified, private, organization, business category, TikTok Shop
        seller), exact stats (followers, following, likes, videos, friends), the
        LIVE room id and upcoming LIVE events, visible profile tabs and
        interaction settings.
      parameters:
        - name: handle
          in: query
          required: false
          description: >-
            The TikTok username (with or without a leading @, or a
            tiktok.com/@username URL). Provide this or `userId`, not both.
          schema:
            type: string
          example: khaby.lame
        - name: userId
          in: query
          required: false
          description: >-
            The TikTok account's numeric user id. Provide this or `handle`, not
            both.
          schema:
            type: string
            pattern: ^\d{1,20}$
          example: '127905465618821121'
        - name: cache_max_age
          in: query
          required: false
          description: >-
            Optional. Return a cached result if one this age or newer exists —
            served for **0 credits** with `meta.cached=true` and
            `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and
            refreshes the cache. Omit to always scrape fresh.
          schema:
            type: string
            enum:
              - 1d
              - 3d
              - 7d
              - 14d
              - 30d
          example: 7d
      responses:
        '200':
          description: The TikTok profile.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      profile:
                        type: object
                      fetchedAt:
                        type: string
                        format: date-time
                  meta:
                    type: object
                    description: >-
                      requestId + credit/caching metadata (creditsCharged,
                      creditsRemaining, cached, cachedAt).
                required:
                  - data
                  - meta
              example:
                data:
                  profile:
                    id: '127905465618821121'
                    secUid: >-
                      MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA
                    handle: khaby.lame
                    url: https://www.tiktok.com/@khaby.lame
                    nickname: Khabane lame
                    bio: >-
                      Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r
                      in the right place😎
                    bioLink: null
                    avatarUrl: >-
                      https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=b1663fd5&x-expires=1791381600&x-signature=ubxmRlSLaZrwcOyNvPFj9vaOuqM%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2
                    avatarUrls:
                      large: >-
                        https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=b1663fd5&x-expires=1791381600&x-signature=ubxmRlSLaZrwcOyNvPFj9vaOuqM%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2
                      medium: >-
                        https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?dr=14579&refresh_token=73ffa012&x-expires=1791381600&x-signature=w%2BAMaunTwS1W2qA7ObjMu9yNJRQ%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2
                      thumb: >-
                        https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=14579&refresh_token=595c67c5&x-expires=1791381600&x-signature=Z%2BwHZW93J0WX5GncZ6RUa%2FY0%2F1s%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2
                    createdAt: '2016-08-10T22:02:34.000Z'
                    nicknameUpdatedAt: null
                    verified: true
                    privateAccount: false
                    secret: false
                    isOrganization: false
                    ttSeller: false
                    commerceUserInfo:
                      commerceUser: false
                      category: null
                      categoryButton: false
                      downloadLink:
                        android: null
                        ios: null
                    ftc: false
                    isADVirtual: false
                    language: en
                    liveRoomId: null
                    openFavorite: false
                    relation: 0
                    uniqueIdModifyTime: null
                    followingVisibility: 1
                    isEmbedBanned: false
                    canExpPlaylist: true
                    profileEmbedPermission: 1
                    suggestAccountBind: false
                    userStoryStatus: 0
                    recommendReason: null
                    nowInvitationCardUrl: null
                    tabs:
                      music: false
                      questions: false
                      playlists: false
                    settings:
                      comment: 0
                      duet: 0
                      stitch: 0
                      download: 0
                    stats:
                      followerCount: 162999391
                      followingCount: 81
                      likeCount: 2685535182
                      videoCount: 1357
                      friendCount: 77
                    liveEvents: []
                  fetchedAt: '2026-10-05T14:44:08.924Z'
                meta:
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
                  creditsCharged: 1
                  creditsRemaining: 4999
                  cached: false
        '401':
          description: Missing, invalid, or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: UNAUTHORIZED
                  message: API key required — pass it in the `x-api-key` header.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '402':
          description: Not enough credits for this request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: INSUFFICIENT_CREDITS
                  message: >-
                    This request costs 1 credit, but your balance is 0. Top up
                    to continue.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '404':
          description: No such account (unknown username or id, banned, or unavailable).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: NOT_FOUND
                  message: >-
                    The requested content was not found (it may not exist, be
                    deleted, or be private).
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '422':
          description: >-
            Invalid query parameters (neither or both of handle/userId, or a
            malformed value).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: Request validation failed
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
                  details:
                    - path: url
                      message: Required
        '429':
          description: Over the per-minute rate limit — honour `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: RATE_LIMITED
                  message: >-
                    Rate limit exceeded — max 100 requests per 60s. Retry in
                    ~30s.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '503':
          description: >-
            Temporarily unavailable — retry after `Retry-After`. `error.code`
            tells you why: `UPSTREAM_BLOCKED` (the source blocked this request),
            `EXTRACTION_FAILED` (the source returned unexpected data),
            `PLATFORM_UNAVAILABLE` (the source is down), or
            `SERVICE_UNAVAILABLE` (we are at capacity).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: UPSTREAM_BLOCKED
                  message: >-
                    The source is temporarily unavailable. Please try again
                    shortly.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: NOT_FOUND
            message:
              type: string
              example: The requested content was not found.
            requestId:
              type: string
              example: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
            details:
              type: array
              items:
                type: object
              description: Present on validation errors.
          required:
            - code
            - message
            - requestId
      required:
        - error
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Your API key. Send it in the `x-api-key` header (or `Authorization:
        Bearer <key>`). Create and manage keys from your dashboard.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.