Glints TapJobs data API
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
API surface
Search jobs (GraphQL)
POST
/api/graphqlopendataReturns 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 glyphsinferred from l10n packs en/id/vi plus Airbridge domain loker.glints.com (Indonesian TapLoker market)
Fetch public candidate profile
GET
/api/publicProfiles/{userId}osintLoads 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 iconsinferred from public profile URLs under glints.com/{country}/profile/public/{uuid} that the app opens via https://glints.com deeplinksfield names (firstName, lastName, salaryExpectation, currencyCode, city, resume) match the candidate object the product has historically exposed on publicProfiles
List job applications
GET
/api/jobApplicationsosintReturns 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 packageinferred 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
/connectionosintOpens 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/connectioninferred 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-orderopenfinanceCreates 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.googleKeyinferred 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/recommendedosintReturns 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
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-empinferred 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.