Note: The TIE API is currently a proprietary Trendence service. Parts of the TIE system are available as a Trendence product — see the Trendence API documentation for details. We’re planning to open the data source interface for generic REST APIs in a future version.

The TIE (Talent Intelligence Engine) is Trendence’s labour market intelligence system. We use TIE to power TREVL visualizations with real-time data on salaries, skills, vacancies, and more. The TIE data source connects TREVL components to the TIE REST API — unlike Cube queries, TIE components use API endpoints and a different reference syntax.

Enabling TIE

Add api: tie to your component. This switches from the default Cube data source to the TIE REST API.

id: salary-chart
type: chart
api: tie
api-parameters:
  profession:
    id: "43104"
    taxonomy: kldb
  location:
    country: DE
  time:
    start_month_offset: -12
    end_month_offset: 0
highchartsData:
  series:
  - data:
      y: "$salary.data.q50"

Reference Syntax

TIE uses a structured $-reference syntax with three levels: endpoint, scope, and field.

Standard form

$endpoint.data.field      # row data
$endpoint.meta.field      # response metadata

Examples:

y: "$salary.data.q50"                        # salary quantile from row
name: "$hard-skills.data.label"              # skill name from row
total: "$vacancies-count.meta.total_results" # total from metadata

Resource-qualified form

When accessing endpoints outside the default professions resource, prefix with the resource name:

$resource.endpoint.data.field
$resource.endpoint.meta.field

Examples:

y: "$professions.salary.data.q50"                # explicit professions resource
y: "$surveys.option-distribution.data.share"     # surveys resource

The resource qualifier is optional for professions endpoints — $salary.data.q50 and $professions.salary.data.q50 are equivalent.

Known resources

Resource Base path Description
professions /api/v1/professions/ Labour market data per profession (default)
surveys /api/v1/surveys/ Survey response analytics

Legacy form

For backward compatibility, the legacy short form still works:

y: "$salary.q50"    # equivalent to $salary.data.q50

api-parameters

The api-parameters section defines what gets sent in the POST body to the TIE API. Only parameters you explicitly define are sent — there are no implicit defaults except profession.

api-parameters:
  profession:
    id: "43104"
    taxonomy: kldb
  location:
    country: DE
  time:
    start_month_offset: -12
    end_month_offset: 0
  language: de
  limit: 25
  threshold: 0.6

Parameter reference

Parameter Type Description
profession object {id, taxonomy} — required for most endpoints. Falls back to {id: "43104", taxonomy: "kldb"} if omitted
location object {country, region?, city?} — geographic filter
time object {start_month_offset, end_month_offset} or {month_offset} — time range
language string "de" or "en" — response language
limit integer Maximum number of results
offset integer Pagination offset
threshold float Minimum similarity threshold (0.0–1.0)
aggregate_time boolean Aggregate across time periods

Important: StrictModel validation

TIE endpoints use strict request validation. Sending a parameter that an endpoint does not accept will result in an HTTP 422 error. Only include parameters that the specific endpoint supports.

For example, hard-skills accepts profession, language, limit, threshold but not location or time. If you add location to the api-parameters, the request will fail.

Runtime parameter overrides

When a component is rendered in the context of a specific profession (e.g., on the REKO profession detail page), the param_override is merged into the api-parameters:

# The controller provides:
{param_override: {profession: {id: "43104", taxonomy: "kldb"}}}

This overrides the profession in api-parameters, so the same component works for any profession.

Professions Endpoints

These endpoints live under /api/v1/professions/.

Attribute endpoints

Flat list endpoints that return skills, tools, and responsibilities.

Endpoint Accepts Returns
hard-skills profession, language, limit, threshold [{id, label, similarity}]
soft-skills profession, language, limit, threshold, time [{skill, value}]
tools profession, language, limit, threshold [{tool, value}]
responsibilities profession, language, limit, threshold [{responsibility, value}]

Example:

id: hard-skills-table
type: table
api: tie
api-parameters:
  limit: 16
  threshold: 0.6
  language: de
tableData:
  columns:
  - value: "$hard-skills.data.label"
    identifier: skill
  headers:
  - name: "Fachliche Kompetenz"

Market intelligence endpoints

Time-series endpoints for salary, scarcity, and vacancy data.

Endpoint Accepts Returns
salary profession, location, time [{date, salary_quantiles: {q10..q90}}]
scarcity profession, location, time [{date, scarcity_index, ...}]
vacancies-count profession, location, time, threshold, aggregate_time [{date, vacancies}]
jobseekers-count profession, location, time [{date, jobseekers}]
vacancies-jobseekers-ratio profession, location, time [{date, vacancies, jobseekers, ratio}]

Example:

id: vacancies-count-line
type: chart
api: tie
api-parameters:
  profession:
    id: "43104"
    taxonomy: kldb
  location:
    country: DE
  time:
    start_month_offset: -12
    end_month_offset: 0
highchartsData:
  chart:
    type: line
  series:
  - name: "Stellenangebote"
    data:
      x: "$vacancies-count.data.date"
      y: "$vacancies-count.data.vacancies"

Vacancy distribution endpoints

Endpoint Accepts Returns
vacancies profession, location, threshold, limit, offset [{vacancy_title, organization_name, ...}]
vacancy-sources profession, location, time, aggregate_time, limit [{sources: [{source, count, share}]}]
vacancy-employers profession, location, time, aggregate_time, limit [{employers: [{employer, count, share}]}]
vacancy-industries profession, location, time, language, aggregate_time, limit [{industries: [...]}]

Reference data endpoints

Endpoint Accepts Returns
countries language, limit, offset [{id, value}]
regions language, limit, offset, country [{id, value}]
cities language, limit, offset, country [{id, value}]

Surveys Endpoints

Surveys endpoints live under /api/v1/surveys/ and require a survey_id path parameter.

option-distribution

Returns answer distribution for a specific survey question.

id: survey-question
type: table
api: tie
api-parameters:
  survey_id: "hrm"
  question_key: "Q-1"
  time:
    month_offset: 0
  limit: 20
tableData:
  columns:
  - value: "$surveys.option-distribution.data.option"
    identifier: option
  - value: "$surveys.option-distribution.data.share"
    identifier: share
  headers:
  - name: "Antwort"
  - name: "Anteil"

The survey_id is extracted from api-parameters and placed in the URL path: /api/v1/surveys/{survey_id}/option-distribution. It is not sent in the POST body.

Accepted parameters:

Parameter Type Required Description
survey_id string yes Survey identifier (used in URL path)
question_key string yes Question identifier
time object no {month_offset} or {start_date, end_date}
location object no {country?, region?, city?}
profession object no {id, taxonomy}
filters object no Additional key-value filters
limit integer no Max results (1-100, default 20)

Postprocess with TIE data

TIE components can use postprocess just like Cube components. The $result variable contains the fetched rows.

postprocess: |-
  if ($result.length === 0) { $result = []; } else {
    var last = $result[$result.length - 1];
    var sq = last.salary_quantiles;
    $result = ["q10","q25","q50","q75","q90"].map(function(p) {
      return {percentile: p, salary: sq[p]};
    });
  }

Always guard against empty data — TIE may return no results for certain professions or parameters.

Computed fields with TIE data

Computed fields work the same way as with Cube data. Arguments can reference TIE $endpoint.data.* and $endpoint.meta.*:

computed:
- name: share_percent
  arguments:
    raw_share: "$hard-skills.data.similarity"
  code: "raw_share * 100"

Allowed endpoints

TIE endpoints must be explicitly allowed in the TIE_ALLOWED_ENDPOINTS environment variable. The format supports resource-qualified entries:

TIE_ALLOWED_ENDPOINTS=salary,hard-skills,surveys:option-distribution

Unqualified entries default to the professions resource. Use resource:endpoint for other resources.