Download OpenAPI specification:
REST endpoints for B2B customer data access and secure partner web launches.
HTTP endpoints for B2B customer integrations. Data-access endpoints are read-only; the Partner Web Launch endpoint provisions an authenticated HiWorker web session. Each endpoint is scoped to a single organization via the caller's API key.
The recommended host is https://api.hiworker.com. The legacy host
https://api.hilokal.com continues to accept the same requests for
existing integrations, so no change is required for callers already
using api.hilokal.com. New integrations should target
api.hiworker.com.
Every request must carry an x-api-key header. Keys are provisioned per
customer organization and bound to a fixed list of source IPs. Requests
from un-allowlisted IPs are rejected with 403 Forbidden.
Each key is rate-limited independently to 1,000 requests per 60-minute
window. A rejected request returns 429 Too Many Requests with a
Retry-After header. Excessive failed authentication attempts may also
receive a 429 response.
Successful and error responses include X-Request-Id; include this value
when contacting Hilokal support. Sensitive API responses are returned with
Cache-Control: private, no-store.
Each user account is associated with a single customer organization.
Existing integrations may continue to send an email query parameter
identifying the "calling user" inside the customer's organization.
New integrations should send the same value in the
x-hilokal-user-email header to avoid placing the email address in the
request URL. If both are supplied, the header takes precedence.
Behaviour depends on that user's role:
A 404 Not Found is returned if email does not exist in the
organization.
Site-wide keys may be provisioned with organization access. Those keys may omit the user email and can read all data attributed to their organization. Existing keys retain their current member/manager behaviour.
New keys may be restricted to the following read scopes:
translations:read: translation history, transcriptions, summaries,
image history, and translation details.attendance:read: TBM attendance and TBM session lists.signatures:read: TBM session signatures and board confirmations.boards:read: notice-board posts.users:read: active users in the API key's organization.web-launches:write: issue short-lived, one-time partner web launch
URLs and provision the supplied user/site identity when needed.Existing keys without configured scopes retain access to endpoints that
existed before users:read was introduced. They do not automatically gain
access to organization user data.
Image URLs returned by this API are intentionally short-lived download credentials—not permanent file addresses. Their expiration keeps the underlying images private, limits exposure if an API response or URL is copied or leaked, and grants access without making the storage objects public.
For translation-history images, store the image translation id and
other metadata, not sourceUrl or translatedUrl. Download only while
the current Unix epoch time is earlier than urlExpiresAt. When fresh
access is needed, call
GET /api/v1/b2b/translation-history-images/{imageTranslationId}
using the same API authentication. URL expiration does not mean the
image or its history record was deleted; it only means that particular
download credential can no longer be used.
For notice-board content, store boardId, not the temporary URL embedded
in content. Call GET /api/v1/b2b/boards or
GET /api/v1/b2b/board-confirmations again when
contentUrlExpiresAt is reached. Signature image URLs from
board-confirmations expire after 15 minutes and are refreshed by calling
that endpoint again.
Endpoints that return list payloads accept page (1-indexed, default 1)
and pageSize (default 20, max 100), and respond with a pagination
block. order accepts asc or desc (default desc).
Securely launch HiWorker web features from a partner application without exposing the API key to the mobile client.
Creates an opaque, one-time URL that the partner application opens in Chrome Custom Tabs or SFSafariViewController. The API key remains on the partner backend; the returned URL contains no user or site personal data.
externalUserId and site.id must be stable identifiers from the
partner system. A previously unknown user is provisioned without a
separate signup. The same user ID is reused on later launches, with
its name, language, role, and current site assignment updated.
Each partner site ID is permanently mapped to one HiWorker department.
Existing sites should be reconciled before rollout using the partner's
site catalog. If an unmapped site is first encountered at launch time,
an exact existing department code match is reused; otherwise a new
isolated department is provisioned using site.name. Display names
are never treated as identity. If multiple
existing departments match, HiWorker does not guess: it provisions an
isolated department so that the launch can continue and marks it for
later reconciliation. Later launches reuse the mapping even if the
site's name changes. Optional project.id is retained as launch
context but never used as the site/department mapping key because one
site may contain multiple projects.
The launch URL expires after 90 seconds and can be redeemed once. Successful redemption creates an eight-hour HttpOnly web session and redirects to the requested HiWorker web destination.
HiWorker administrators may block new web access for a specific site.
A valid, authenticated request for a blocked site.id still returns
HTTP 200 with the same launchUrl/expiresAt/expiresInSeconds fields.
That URL is a denial-only, one-use link valid for 90 seconds. It opens
HiWorker's localized access-restricted page without provisioning a user
or issuing a session cookie. Partners continue opening launchUrl as usual;
no special error handling is required for site restrictions. These attempts
are metered as non-billable with internal error code site_access_blocked,
not as successful service access. Invalid API keys, scopes, IP allowlists,
and request validation still use the existing error responses.
The restriction applies to every user and project at that site, including
new users; it does not revoke the company's API key.
An unused launch URL is checked again at redemption. If the site has
since been blocked, no session cookie is issued and the browser is
redirected to a localized access-restricted screen. Already authenticated
web sessions retain their existing expiry; active TBM/translation
connections are not forcibly terminated. After access is restored,
request a fresh launch URL. A denial-only URL never grants access, even
if access is restored before it is opened.
| externalUserId required | string [ 1 .. 255 ] characters Permanent user identifier from the partner system. |
required | object (WebLaunchSite) |
object (WebLaunchProject) | |
| role required | string Enum: "manager" "worker" HiWorker organization role to apply to the user for this and subsequent sessions. |
| name required | string [ 1 .. 100 ] characters Current user display name. |
| language required | string [ 2 .. 16 ] characters BCP-47 language code such as |
| destination | string Default: "home" Enum: "home" "tbm" "boards" "display" Initial web screen. Omit this field to open the combined Home screen. |
{- "externalUserId": "PG_USER_12345",
- "site": {
- "id": "E10450",
- "name": "방배 신동아아파트 재건축정비사업"
}, - "project": {
- "id": "E10450CA"
}, - "role": "manager",
- "name": "홍길동",
- "language": "ko",
- "destination": "home"
}{- "expiresAt": "2026-08-28T01:30:00.000Z",
- "expiresInSeconds": 90
}Returns active organization memberships whose user accounts have not
been deleted. The organization is always derived from x-api-key; it
cannot be selected with a request parameter.
Organization-access keys require the users:read scope and may omit
the calling-user email. Legacy-email keys explicitly provisioned with
users:read must identify an active manager, department manager, or
super administrator. Regular members cannot list other users.
Results use natural display-name ordering, so names ending in numbers
sort numerically. order controls the direction of that ordering.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| search | string <= 100 characters Case-insensitive search across name, email, department, job, and position (max 100 characters). |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "userId": 2465607,
- "name": "김작업",
- "email": "worker@example.com",
- "role": "superAdmin",
- "department": "안전관리팀",
- "departmentId": 42,
- "job": "안전관리",
- "position": "팀장"
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns sessions created by HiWorker's live-translation feature,
including sessions that do not have an AI-generated summary. Use each
sessionId with live-translations to retrieve its translation
segments.
This is separate from the combined Translation History dataset.
Use translation-history-sessions for eligible 1:1, meeting, TBM,
field-display, and Desktop Translator records.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "sessionId": 1234,
- "sessionUser": "홍길동",
- "startedAt": 1748213400000,
- "endedAt": 1748215200000,
- "isActive": true
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns the list of translation session summaries for the organization.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "sessionId": 1234,
- "sessionUser": "홍길동",
- "summary": { },
- "createdAt": 1748213400000
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns the detailed source/target translation segments for one session.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| sessionId required | integer >= 1 ID of the translation session (from |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "id": 98765,
- "createdAt": 0,
- "source": {
- "locale": "ko",
- "text": "안녕하세요."
}, - "target": [
- {
- "locale": "ko",
- "text": "안녕하세요."
}
]
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns eligible 1:1, meeting, TBM, field-display, and Desktop
Translator session records. It applies the same organization,
useful-content, configured minimum-duration, date, and pagination rules
used by the HiWorker Translation History dashboard, while also
including unmatched records from the legacy live-translation archive.
The sessionType value identifies which kind of session each row
represents, while historySource identifies which history store owns
its ID.
For historySource=normalized, use a returned sessionId with
translation-history-transcriptions to retrieve speech content and
translation-history-images to retrieve historical board images.
Legacy records use the existing Live Translation endpoints. Managers
see all sessions in the organization; regular members see only
sessions they ran themselves.
Normalized translation-history IDs belong to a different ID space from
Live Translation IDs. Always use historySource when storing or
routing a returned sessionId.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| startDate | string <date> Inclusive lower bound, interpreted as a Korean calendar date (UTC+09:00), matching the HiWorker dashboard. |
| endDate | string <date> Inclusive upper bound. A date-only value includes that entire Korean calendar day (UTC+09:00). |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "sessionId": 512,
- "historySource": "normalized",
- "sessionUser": "김반장",
- "createdAt": 1748213400000,
- "sessionType": "tbm",
- "transcriptionCount": 24,
- "translationCount": 48,
- "signatureCount": 12
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns the useful content recorded during one session: each source
transcription and all translations generated from it. Rows rejected
by transcription quality filtering are omitted. The top-level
board and images fields include the historical board snapshot,
and image translations recorded during the session. Each image item
represents one recorded translation and includes its source and
translated temporary download URLs. This endpoint does not create new
image translations.
Transcriptions are paginated; every translation belonging to a
returned transcription is included in that transcription's
translations array. Continue requesting pages until all
pagination.totalCount transcriptions have been received. The
totals block reports complete session-level transcription and
translation counts independently of the current page.
Managers can fetch content for any session in the organization; regular members only for sessions they ran themselves.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| sessionId required | integer >= 1 ID from |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "session": {
- "sessionId": 512,
- "sessionUser": "string",
- "createdAt": 0,
- "sessionType": "conversation"
}, - "board": {
- "boardId": 42,
- "boardVersionId": 88,
- "title": "해빙기 안전사고 예방",
- "createdAt": "2019-08-24T14:15:22Z"
}, - "images": [
- {
- "id": 301,
- "sourceLanguage": "ko",
- "targetLanguage": "vi",
- "urlExpiresAt": 1785290100000,
- "createdAt": 1785286800000
}
], - "data": [
- {
- "id": 9201,
- "transcriptionText": "안전모를 착용하세요.",
- "translations": [
- {
- "id": 14021,
- "translatedText": "Please wear a safety helmet.",
- "targetLanguage": "en-US",
- "createdAt": 1784859600500
}
], - "createdAt": 1784859600000,
- "source": "speaker-audio"
}
], - "totals": {
- "transcriptionCount": 24,
- "translationCount": 48
}, - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns the board version used by the session together with the image translations that were actually requested while that session was running. Each item represents one recorded translation and contains temporary URLs for the source and translated image. Source images that were never translated are not returned. This endpoint does not create new translations.
Store the image translation id, not the temporary URLs. Use
translation-history-images/{imageTranslationId} to request fresh URLs.
The URLs are intentionally temporary security credentials and should
not be used after urlExpiresAt. Their expiration does not delete the
image or history record.
Managers can fetch content for any session in the organization; regular members only for sessions they ran themselves.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| sessionId required | integer >= 1 ID from |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "session": {
- "sessionId": 512,
- "sessionUser": "string",
- "createdAt": 0,
- "sessionType": "conversation"
}, - "board": {
- "boardId": 42,
- "boardVersionId": 88,
- "title": "해빙기 안전사고 예방",
- "createdAt": "2019-08-24T14:15:22Z"
}, - "data": [
- {
- "id": 301,
- "sourceLanguage": "ko",
- "targetLanguage": "vi",
- "urlExpiresAt": 1785290100000,
- "createdAt": 1785286800000
}
]
}Returns one image translation by its stable history ID with newly
generated source and translated download URLs. The caller must be
authorized to access the session that owns the image translation.
Use this endpoint whenever a previously returned URL has expired. The
URLs are intentionally temporary security credentials and should not
be used after urlExpiresAt; the stable id is the value integrations
should retain.
| imageTranslationId required | integer >= 1 Image translation |
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
|
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": {
- "id": 301,
- "sourceLanguage": "ko",
- "targetLanguage": "vi",
- "urlExpiresAt": 1785290100000,
- "createdAt": 1785286800000
}
}Returns a flat attendance log across the organization's TBM sessions. One row is one worker signature in one session — attendance evidence (참석 증적). Signers are often guests without accounts, identified by the name and phone number they entered when signing.
Managers see the full organization log; regular members see only signatures collected in sessions they ran themselves.
The signature image itself is not included here — fetch it per
session via tbm-session-signatures.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
string or string Inclusive lower bound on the signature time. A date-only value is
interpreted as a Korean calendar day (UTC+09:00). Datetimes must
include | |
string or string Inclusive upper bound. A date-only value includes that entire Korean calendar day. | |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "id": 1407,
- "sessionId": 512,
- "sessionUser": "김반장",
- "name": "김작업",
- "phoneNumber": "01012345678",
- "createdAt": 1748213400000
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Backward-compatible legacy route. Despite its historical name, this
endpoint returns multiple session types, not only TBM. New
integrations should use translation-history-sessions, which applies
useful-content filtering and clearly identifies each supported mode.
The sessionType value identifies 1:1 conversation, meeting, TBM,
field display, Desktop Translator, or an unclassified legacy session.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
string or string Inclusive lower bound. A date-only value is interpreted as a
Korean calendar day (UTC+09:00). Datetimes must include | |
string or string Inclusive upper bound. A date-only value includes that entire Korean calendar day. | |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "sessionId": 512,
- "historySource": "normalized",
- "sessionUser": "김반장",
- "createdAt": 1748213400000,
- "sessionType": "tbm",
- "transcriptionCount": 24,
- "translationCount": 48,
- "signatureCount": 12
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns the signatures workers submitted for one TBM session — attendance evidence (참석 증적) for that session. Signers are often guests without accounts, identified by the name and phone number they entered when signing.
Managers can fetch signatures for any session in the organization; regular members only for sessions they ran themselves.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| sessionId required | integer >= 1 ID of the TBM session (from |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "session": {
- "sessionId": 512,
- "sessionUser": "string",
- "createdAt": 0,
- "sessionType": "conversation"
}, - "data": [
- {
- "id": 3021,
- "name": "김작업",
- "phoneNumber": "01012345678",
- "signatureData": "string",
- "createdAt": 0
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns active (non-deleted) notice-board posts in the organization, with their latest version's title / content and the calling user's personal read/sign status against that latest version.
Board image markers in content are replaced with temporary signed
download URLs. Use contentUrlExpiresAt to determine when to call
this endpoint again for fresh URLs.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "data": [
- {
- "boardId": 42,
- "title": "5월 안전공지",
- "content": "string",
- "contentUrlExpiresAt": 0,
- "createdAt": 0,
- "authorEmail": "user@example.com",
- "authorName": "string",
- "isRead": true,
- "isSignatured": true
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}Returns each member's read/sign status against the latest version of one board post. Managers see all members; regular members see only their own row.
Note: when a board is edited a new version is created, and prior
signatures no longer count — read and signed always reflect
the latest version.
Board image markers in board.content are replaced with temporary
signed download URLs. Use board.contentUrlExpiresAt to determine
when to call this endpoint again for fresh URLs.
string <email> Deprecated Backward-compatible location for the calling user's email. Existing
integrations may continue to use it. New integrations should use the
| |
| boardId required | integer >= 1 ID of the board post (from |
| page | integer >= 1 Default: 1 1-indexed page number. |
| pageSize | integer [ 1 .. 100 ] Default: 20 Page size (max 100). |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction. |
| x-hilokal-user-email | string <email> Email of the calling user. Recommended instead of the legacy query parameter. It may be omitted for organization-access keys. |
{- "board": {
- "boardId": 42,
- "boardVersionId": 88,
- "title": "string",
- "content": "string",
- "contentUrlExpiresAt": 0,
- "createdAt": 0
}, - "data": [
- {
- "userId": 88421,
- "userEmail": "user@example.com",
- "userName": "김작업",
- "departmentName": "안전팀",
- "read": true,
- "signed": true,
- "readAt": 0,
- "signedAt": 0,
- "signatureImageUrl": "string"
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalCount": 137
}
}