Hilokal B2B API (1.5.0)

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.

Host

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.

Authentication

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.

Authorization scoping

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:

  • Active organization manager or administrator: sees all rows for the organization.
  • Regular member: sees only their own data — TBM sessions / signatures from sessions they ran themselves, and their own confirmation status for board posts.

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.

Temporary image download URLs

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.

Pagination

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).

Partner Web Launch

Securely launch HiWorker web features from a partner application without exposing the API key to the mobile client.

Create a one-time partner web launch URL

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.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
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 ko, en, or vi. Do not send a nationality name or country code.

destination
string
Default: "home"
Enum: "home" "tbm" "boards" "display"

Initial web screen. Omit this field to open the combined Home screen.

Responses

Request samples

Content type
application/json
{
  • "externalUserId": "PG_USER_12345",
  • "site": {
    },
  • "project": {
    },
  • "role": "manager",
  • "name": "홍길동",
  • "language": "ko",
  • "destination": "home"
}

Response samples

Content type
application/json
{}

Organization Users

Active users in the customer organization.

List organization users

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Live Translation

HiWorker live-translation records.

List translation sessions

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List translation session summaries

Returns the list of translation session summaries for the organization.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List translations for one session

Returns the detailed source/target translation segments for one session.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

sessionId
required
integer >= 1

ID of the translation session (from live-translation-sessions or live-translation-summaries).

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Translation History

Combined 1:1, meeting, TBM, field-display, and Desktop Translator records.

List combined translation-history sessions

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List transcriptions and translations for one history session

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

sessionId
required
integer >= 1

ID from translation-history-sessions.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "session": {
    },
  • "board": {
    },
  • "images": [
    ],
  • "data": [
    ],
  • "totals": {
    },
  • "pagination": {
    }
}

List image translations recorded during one session

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

sessionId
required
integer >= 1

ID from translation-history-sessions.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "session": {
    },
  • "board": {
    },
  • "data": [
    ]
}

Get fresh URLs for one recorded image translation

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.

Authorizations:
ApiKeyAuth
path Parameters
imageTranslationId
required
integer >= 1

Image translation id returned by a translation-history endpoint.

query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

TBM & Safety Attendance

TBM / safety-training attendance proofs (출석 증적).

List TBM / safety-training attendance records

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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 Z or an explicit UTC offset.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List translator sessions (legacy route) Deprecated

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

string or string

Inclusive lower bound. A date-only value is interpreted as a Korean calendar day (UTC+09:00). Datetimes must include Z or an explicit UTC offset.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List worker signatures for one TBM session

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

sessionId
required
integer >= 1

ID of the TBM session (from tbm-sessions).

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "session": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Notice Board

Notice-board posts and per-user confirmation records (공지사항 확인 증적).

List active notice-board posts

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

List per-user read/sign confirmations for one board

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.

Authorizations:
ApiKeyAuth
query Parameters
email
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 header. It is required for legacy keys unless the header is supplied.

boardId
required
integer >= 1

ID of the board post (from boards).

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.

header Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "board": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}