Glints: Jobs Search & Career icon

Glints TapJobs data API

Glints · Identity

Glints TapJobs talks to api.glints.com for job search on /api/graphql and candidate cards on /api/publicProfiles/{userId}, opens recruiter chat at /connection on chat.glints.com, and checks out VIP or contact credits on /payment-order. Signed-in calls send an OAuth2 Bearer token plus x-glints-country-code (ID for TapLoker).

Glints: Jobs Search & Career (package com.glints.candidate, versionName 1.116.0, Play label Glints TapJobs) is Glints' dual-role Android client for Indonesian loker search, one-tap apply, recruiter chat, candidate CVs and employer contact-credits. The app is configured to talk to https://api.glints.com (OAuth2 client_id 5e5c566a-5ac6-44e3-b286-3246fbc97bfb, live socket at /api/ws), https://chat.glints.com (WebSocket /connection), and https://api-v2.glints.com/payment-order for VIP and credit checkout. Reconstructed from those hosts plus the job-search, profile, apply, chat, VIP and employer-talent screens: POST /api/graphql pages listings (title, company, salaryMin/salaryMax, workArrangement, countryCode); GET /api/publicProfiles/{userId} is the public candidate card (firstName, lastName, salaryExpectation, city); GET /api/jobApplications tracks Easy Apply status; chat.glints.com/connection carries job-scoped threads; POST /payment-order creates a VIP or contact-unlock order. Signed-in calls send a Bearer access token plus x-glints-country-code (ID for TapLoker).

Screenshots

  • Glints: Jobs Search & Career screenshot 1
  • Glints: Jobs Search & Career screenshot 2
  • Glints: Jobs Search & Career screenshot 3
  • Glints: Jobs Search & Career screenshot 4
  • Glints: Jobs Search & Career screenshot 5
  • Glints: Jobs Search & Career screenshot 6
  • Glints: Jobs Search & Career screenshot 7
  • Glints: Jobs Search & Career screenshot 8

API surface

  • Search jobs (GraphQL)

    POST /api/graphql opendata

    Returns a paginated TapLoker listing page (title, company, salaryMin/salaryMax, workArrangement, countryCode, isEasyApply) used by the home job-search and nearby-jobs screens.

    Auth: Optional OAuth2 Bearer access token issued with apiConfig.clientId. Anonymous browse still sends x-glints-country-code (ID) and the app client_id. Signed-in search personalises nearby and recommended loker.

    • searchJobs
    • totalCount
    • id
    • slug
    • title
    • description
    • company
    • name
    • logoUrl
    • isVerified
    • city
    • countryCode
    • salaryMin
    • salaryMax
    • currencyCode
    • salaryPeriod
    • employmentType
    • workArrangement
    • skills
    • isEasyApply
    • applicantCount
    • publishedAt

    Illustrative example reconstructed from the app's interface — not a live capture.

    POST /api/graphql?op=searchJobs HTTP/1.1
    Host: api.glints.com
    Authorization: Bearer <access-token>
    Content-Type: application/json
    x-glints-country-code: ID
    X-Client-Id: 5e5c566a-5ac6-44e3-b286-3246fbc97bfb
    
    {
      "operationName": "searchJobs",
      "variables": {
        "keyword": "software engineer",
        "location": "Jakarta",
        "countryCode": "ID",
        "workArrangement": "HYBRID",
        "employmentType": "FULL_TIME",
        "salaryMin": 8000000,
        "limit": 20,
        "offset": 0
      }
    }
    {
      "data": {
        "searchJobs": {
          "totalCount": 1284,
          "jobs": [{
            "id": "8f3c1a2e-4b90-4d11-9c77-0a1b2c3d4e5f",
            "slug": "software-engineer-jakarta",
            "title": "Software Engineer",
            "description": "Build marketplace services in Jakarta.",
            "company": {
              "id": "co-4412",
              "name": "Example Corp",
              "logoUrl": "https://images.glints.com/company/4412.png",
              "isVerified": true
            },
            "city": "Jakarta",
            "countryCode": "ID",
            "salaryMin": 15000000,
            "salaryMax": 22000000,
            "currencyCode": "IDR",
            "salaryPeriod": "MONTHLY",
            "employmentType": "FULL_TIME",
            "workArrangement": "HYBRID",
            "skills": ["Kotlin", "GraphQL"],
            "isEasyApply": true,
            "applicantCount": 42,
            "publishedAt": "2026-09-24T02:15:00Z"
          }]
        }
      }
    }

    Source in the app

    • inferred from Flutter assets/config/prod.yml apiConfig.url https://api.glints.com and wsUrl wss://api.glints.com/api/ws (same /api prefix)
    • inferred from job-search UI assets in packages/aries: search-line, filter-2-line, nearby, map-pin, briefcase-line, and icon-l1-* job-category glyphs
    • inferred from l10n packs en/id/vi plus Airbridge domain loker.glints.com (Indonesian TapLoker market)
  • Fetch public candidate profile

    GET /api/publicProfiles/{userId} osint

    Loads the public candidate card (firstName, lastName, salaryExpectation, city, skills, recentJob) used by the profile tab and by employers browsing talent.

    Auth: Optional Bearer access token. Public profile URLs (glints.com/{country}/profile/public/{uuid}) resolve without a session; email, phone and resume stay on the signed-in / Me card.

    • id
    • firstName
    • lastName
    • profilePic
    • headline
    • city
    • country
    • countryCode
    • salaryExpectation
    • currencyCode
    • recentJob
    • title
    • company
    • skills
    • education
    • resume
    • lastSeen

    Illustrative example reconstructed from the app's interface — not a live capture.

    GET /api/publicProfiles/c0ffee00-1111-2222-3333-444455556666 HTTP/1.1
    Host: api.glints.com
    Authorization: Bearer <access-token>
    Accept: application/json
    x-glints-country-code: ID
    {
      "id": "c0ffee00-1111-2222-3333-444455556666",
      "firstName": "Ada",
      "lastName": "Setiawan",
      "profilePic": "https://images.glints.com/profile/ada.png",
      "headline": "Backend engineer",
      "city": "Jakarta",
      "country": "Indonesia",
      "countryCode": "ID",
      "salaryExpectation": 18000000,
      "currencyCode": "IDR",
      "recentJob": {"title": "Software Engineer", "company": "Example Corp"},
      "skills": ["Kotlin", "PostgreSQL"],
      "education": [{"school": "Universitas Indonesia", "degree": "S1"}],
      "resume": null,
      "lastSeen": "2026-09-25T10:02:00Z"
    }

    Source in the app

    • inferred from Me/profile screens: complete-profile, profile-job-prefs, profile-update, glints-resume, icon-access-resume, skills-nudge, work-exp-nudge, education-nudge icons
    • inferred from public profile URLs under glints.com/{country}/profile/public/{uuid} that the app opens via https://glints.com deeplinks
    • field names (firstName, lastName, salaryExpectation, currencyCode, city, resume) match the candidate object the product has historically exposed on publicProfiles
  • List job applications

    GET /api/jobApplications osint

    Returns the signed-in candidate's Easy Apply / Chat to Apply history (status, appliedAt, job title, questionnaireAnswers, conversationId) for the applications tab.

    Auth: OAuth2 Bearer access token from the candidate session (email/Facebook/Google sign-in). Required; anonymous users cannot read lamaran history.

    • totalCount
    • jobApplications
    • id
    • status
    • appliedAt
    • source
    • EASY_APPLY
    • job
    • title
    • company
    • city
    • resumeId
    • questionnaireAnswers
    • conversationId

    Illustrative example reconstructed from the app's interface — not a live capture.

    GET /api/jobApplications?status=SUBMITTED&limit=20&offset=0 HTTP/1.1
    Host: api.glints.com
    Authorization: Bearer <access-token>
    Accept: application/json
    x-glints-country-code: ID
    {
      "totalCount": 7,
      "jobApplications": [{
        "id": "app-7788",
        "status": "CHAT_INITIATED",
        "appliedAt": "2026-09-20T09:01:00Z",
        "source": "EASY_APPLY",
        "job": {
          "id": "8f3c1a2e-4b90-4d11-9c77-0a1b2c3d4e5f",
          "title": "Software Engineer",
          "company": {"id": "co-4412", "name": "Example Corp"},
          "city": "Jakarta"
        },
        "resumeId": "resume-9",
        "questionnaireAnswers": [{"questionId": "q-1", "answer": "Immediate"}],
        "conversationId": "conv-334"
      }]
    }

    Source in the app

    • inferred from apply UI assets: application-sent, applications-target, applied-count, questionnaire-fill, chat-list-job-prioritized-icon, stale_application_nudge.webp in the cdd package
    • inferred from dual-role cdd (candidate) package plus help-centre Easy Apply / Chat to Apply flow that posts the CV then opens recruiter chat
  • Open recruiter chat socket

    GET /connection osint

    Opens the Chat to Apply thread (jobId, participants, messages, isPrioritized, phoneShared) used by the inbox after an Easy Apply.

    Auth: OAuth2 Bearer access token as a WebSocket query/header credential. The HTTP chat host is https://chat.glints.com; the live socket is wss://chat.glints.com/connection. A parallel app-wide socket lives at wss://api.glints.com/api/ws.

    • conversation
    • id
    • jobId
    • jobTitle
    • participants
    • role
    • firstName
    • lastName
    • displayName
    • messages
    • body
    • senderId
    • createdAt
    • status
    • isPrioritized
    • phoneShared

    Illustrative example reconstructed from the app's interface — not a live capture.

    GET /connection HTTP/1.1
    Host: chat.glints.com
    Upgrade: websocket
    Connection: Upgrade
    Authorization: Bearer <access-token>
    Sec-WebSocket-Protocol: graphql-transport-ws
    x-glints-country-code: ID
    {
      "type": "next",
      "payload": {
        "data": {
          "conversation": {
            "id": "conv-334",
            "jobId": "8f3c1a2e-4b90-4d11-9c77-0a1b2c3d4e5f",
            "jobTitle": "Software Engineer",
            "participants": [{
              "id": "c0ffee00-1111-2222-3333-444455556666",
              "role": "CANDIDATE",
              "firstName": "Ada",
              "lastName": "Setiawan"
            }, {
              "id": "emp-9001",
              "role": "EMPLOYER",
              "displayName": "HR Example Corp"
            }],
            "messages": [{
              "id": "msg-12",
              "body": "Hi Ada, can we chat about the role?",
              "senderId": "emp-9001",
              "createdAt": "2026-09-20T09:05:00Z",
              "status": "SEEN"
            }],
            "isPrioritized": true,
            "phoneShared": false
          }
        }
      }
    }

    Source in the app

    • inferred from Flutter assets/config/prod.yml apiEndpoints.chat.url https://chat.glints.com and wsUrl wss://chat.glints.com/connection
    • inferred from packages/glints_chat plus flutter_chat_ui assets, and aries icons chat-fill, discuss-line, whatsapp, exchange_contact.webp / exchange_phone.webp in the cdd package
  • Create VIP / credit payment order

    POST /payment-order openfinance

    Creates a VIP subscription or employer contact-credit order (orderId, sku, amount, entitlement, contactCreditsRemaining) after a Play Billing purchase.

    Auth: OAuth2 Bearer access token. Play Billing / RevenueCat (googleKey in prod.yml) confirms the SKU; this host records the Glints-side order for VIP and employer contact credits.

    • orderId
    • sku
    • productType
    • VIP_SUBSCRIPTION
    • platform
    • status
    • amount
    • currencyCode
    • entitlement
    • expiresAt
    • playPurchaseToken
    • revenueCatAppUserId
    • contactCreditsRemaining
    • contactCreditsExpireAt

    Illustrative example reconstructed from the app's interface — not a live capture.

    POST /payment-order HTTP/1.1
    Host: api-v2.glints.com
    Authorization: Bearer <access-token>
    Content-Type: application/json
    x-glints-country-code: ID
    
    {
      "sku": "vip_monthly",
      "productType": "VIP_SUBSCRIPTION",
      "platform": "ANDROID",
      "countryCode": "ID",
      "currencyCode": "IDR",
      "playPurchaseToken": "<play-billing-token>",
      "revenueCatAppUserId": "<rc-app-user-id>"
    }
    {
      "orderId": "po-5566",
      "sku": "vip_monthly",
      "productType": "VIP_SUBSCRIPTION",
      "status": "PAID",
      "amount": 99000,
      "currencyCode": "IDR",
      "entitlement": "vip",
      "expiresAt": "2026-10-26T00:00:00Z",
      "contactCreditsRemaining": 25,
      "contactCreditsExpireAt": "2026-10-26T00:00:00Z"
    }

    Source in the app

    • inferred from Flutter assets/config/prod.yml apiEndpoints.paymentOrder.url https://api-v2.glints.com/payment-order and revenueCatConfig.googleKey
    • inferred from VIP/credit UI: vip-crown-fill, vip-active-logo, contact-unlock, contact-balance-expiry, copper-coin-line, credit-payment-success, pending-payment, ri-bank-card, com.android.vending.BILLING permission
  • Fetch recommended talent (employer)

    GET /api/talents/recommended osint

    Returns employer-side Candidate Matches (firstName, salaryExpectation, matchScore, isContactUnlocked) for a job, gated on remaining contact credits.

    Auth: OAuth2 Bearer access token for an employer session. The same binary switches candidate/employer roles (role-switch-cdd / role-switch-emp). Unlocking phone/email spends contact credits from /payment-order.

    • totalCount
    • contactCreditsRemaining
    • talents
    • id
    • firstName
    • lastName
    • headline
    • city
    • countryCode
    • salaryExpectation
    • matchScore
    • skills
    • recentJob
    • isContactUnlocked
    • phone
    • email

    Illustrative example reconstructed from the app's interface — not a live capture.

    GET /api/talents/recommended?jobId=8f3c1a2e-4b90-4d11-9c77-0a1b2c3d4e5f&countryCode=ID&limit=20 HTTP/1.1
    Host: api.glints.com
    Authorization: Bearer <access-token>
    Accept: application/json
    x-glints-country-code: ID
    {
      "totalCount": 86,
      "contactCreditsRemaining": 25,
      "talents": [{
        "id": "c0ffee00-1111-2222-3333-444455556666",
        "firstName": "Ada",
        "lastName": "Setiawan",
        "headline": "Backend engineer",
        "city": "Jakarta",
        "countryCode": "ID",
        "salaryExpectation": 18000000,
        "currencyCode": "IDR",
        "matchScore": 0.86,
        "skills": ["Kotlin", "PostgreSQL"],
        "recentJob": {"title": "Software Engineer", "company": "Example Corp"},
        "isContactUnlocked": false,
        "phone": null,
        "email": null
      }]
    }

    Source in the app

    • inferred from employer package packages/emp (recommended-talent-pattern.svg, empty-jobs.svg, employer_profile_bg.svg) and aries icons recommended-talent, talent-bomb, contact-unlock, contact-balance-expiry, role-switch-emp
    • inferred from company-verify-* icons plus Aliyun cloudauth eKYC (id-card / camera) used when an employer verifies the company

Data categories

  • job listings
  • candidate profiles
  • applications
  • recruiter chat
  • VIP subscriptions
  • employer contact credits

Where teams use this data

  • Indonesia loker market census

    A labour-market dashboard pages POST /api/graphql searchJobs with countryCode=ID and reads title, city, salaryMin/salaryMax, employmentType and workArrangement to chart open roles by kota and pay band.

  • Public talent-graph enrichment

    An OSINT workflow resolves glints.com profile deeplinks to GET /api/publicProfiles/{userId} and stores firstName, lastName, city, skills, recentJob and salaryExpectation as a non-contact candidate graph.

  • Easy Apply funnel analytics

    A candidate CRM pulls GET /api/jobApplications (status, source=EASY_APPLY, conversationId) and joins chat.glints.com /connection threads to measure time-to-first-recruiter-message.

  • VIP and contact-credit reconciliation

    Finance bots match Play Billing tokens to POST /payment-order (orderId, sku, amount, entitlement, contactCreditsRemaining) so employer unlock spend lines up with RevenueCat entitlements.

Frequently asked questions

Which hosts does the Glints app call?

The production config points job and profile traffic at https://api.glints.com (live socket /api/ws), recruiter inbox at https://chat.glints.com (WebSocket /connection), and VIP/credit checkout at https://api-v2.glints.com/payment-order. Images go through https://images.glints.com.

How does Glints authenticate mobile calls?

The app ships an OAuth2 client_id (5e5c566a-5ac6-44e3-b286-3246fbc97bfb) and signs in with email, Facebook or Google. Subsequent JSON calls send Authorization: Bearer plus x-glints-country-code (ID on TapLoker).

What candidate fields sit behind publicProfiles?

GET /api/publicProfiles/{userId} is the public card: firstName, lastName, city, skills, recentJob, salaryExpectation. Email, phone and resume stay on the signed-in Me tab or an employer contact-unlock.

Does the same app serve employers?

Yes. Role-switch controls flip the binary from candidate (cdd) to employer (emp). Employers page GET /api/talents/recommended and spend contact credits created via POST /payment-order.

Topics

  • Glints API
  • Glints TapJobs
  • TapLoker
  • api.glints.com
  • Glints GraphQL
  • publicProfiles
  • payment-order
  • Indonesia job search API
  • candidate profile
  • Easy Apply

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

Get a quote