Daily collection and purpose-built classification
Hiring demand is observed directly from employer career sites and refreshed each day rather than assembled from third-party posting aggregators.
SoftwareIQ maintains source-specific collection for the career-site systems used by covered employers. Each daily run resolves the employer’s current openings and posting identities against the preceding observation. Openings added, removed, or changed at the source are reflected in that day’s capture, subject to the employer site being available.
Career-site or provider changes identified during daily capture become explicit collection events. The affected observation establishes a new baseline so identifier turnover does not appear as artificial net-new demand.
Rules are designed for covered software companies and resolve functions, AE/SDR/channel/renewals/leadership roles, customer success, segments, and geographies.
Conservative role signals identify quota-bearing and full-cycle sales investment when title or responsibility evidence supports the classification.
Company-specific taxonomies attribute product, engineering, and GTM roles to disclosed products, initiatives, motions, and customer relationships.
The purpose-built SI tracker assembles hiring across major global systems integrators and Big Four firms, with a focus on selected priority onshore and nearshore markets. Vendor-practice attribution is conservative; unsubstantiated associations remain unclassified.
Classification reference
Each posting is evaluated in the context of software-industry roles, the covered company, and the evidence available in the source posting.
The classifier uses normalized title and posting content to assign a complete set of analytical dimensions. Broad occupational function is resolved first; specialized commercial, customer-success, geographic, and company-specific investment classifications are then applied only where relevant. Explicit not_applicable, unallocated, and unknown states prevent missing evidence from being converted into a positive signal.
| Dimension | Published field | Interpretation |
|---|---|---|
| Function | function_id / summary_function_id | Occupational function at detailed and summary levels. Use this dimension to separate sales, engineering, product, customer success, marketing, and other work rather than relying on title keywords. |
| Sales role | sales_role_id | Commercial responsibility within the sales function, including account executive, SDR, channel, renewals, and leadership. Quota-bearing or full-cycle designations require supporting title or responsibility evidence. |
| Customer success role | customer_success_role_id | Role type within customer success, separating post-sale coverage and leadership patterns where the source provides enough evidence. |
| AE segment | ae_segment_id | Customer or market segment associated with an account-executive role, such as enterprise or commercial, when the posting supports that distinction. |
| Geography | geography_id | One mutually exclusive geographic leaf derived from the advertised location. Grouping nodes are supplied in the taxonomy for rollups but do not appear as fact values. |
| Development investment | development_* | Company-specific product, platform, infrastructure, or engineering area supported by the role. These fields identify advertised labor allocation, not realized expenditure. |
| GTM investment | gtm_* | Company-specific go-to-market area, motion, or customer relationship supported by the posting. Attribution is made only when the available evidence meets the maintained rule set. |
| SI activity | company and GTM dimensions | Hiring across selected global systems integrators and Big Four firms, with emphasis on priority onshore and nearshore markets and conservative vendor-practice attribution. |
Company-specific allocation states
| State | Meaning |
|---|---|
| allocated | The posting contains sufficient evidence for a maintained company-specific taxonomy member. |
| emerging | Evidence supports a recurring investment theme being monitored separately from the established taxonomy. |
| unallocated | The dimension is relevant, but evidence is insufficient for a defensible company-specific assignment. |
| not_applicable | The dimension does not apply to the posting's normalized function or role. |
| unknown | The classification state cannot be resolved from the available input. |
Versioned methodology and historical consistency
Classifier, taxonomy, and company-allocation rules are released as one compatible classification_version_id. SoftwareIQ periodically improves these components as role language changes, new products emerge, and additional evidence supports more precise classifications. Material releases are documented with their predecessor relationships and validated before becoming the active version.
When a methodology release changes historical classifications, SoftwareIQ may restate the supported classified history under the new version. The underlying direct-source posting observations and observed_total series remain unchanged. Prior classified versions are kept distinct, allowing research teams to pin a version, reproduce an earlier result, and adopt a restatement on their own schedule. Classified observations from different versions should never be spliced into one time series.
Fact semantics
Observed totals and classified intersections answer different questions and must not be added together.
| Record type | Version | Meaning |
|---|---|---|
| observed_total | None | Authoritative collected total for a company, period, and measure. Independent of classifier releases. |
| classified_count | Required | Nonzero count for one complete intersection of every published dimension under a classification version. |
Every posting in a classified row belongs to one function, role-state tuple, company-allocation tuple, and mutually exclusive geography leaf. Therefore filtering one or several dimensions is valid, and the complete classified population reconciles to its observed total for available periods. It is not a collection of independent marginal totals.
- Geography leaves are
united_states,canada,latin_america,europe,apac,mea,other_international, andunknown. internationalis a taxonomy grouping node and never appears in a fact row; expand it to its leaf members.newis based on posting-identity change only when adjacent observations are comparable. At a baseline, the value is null.- Unavailable collection is null, not zero. A legitimate observed count of zero remains zero.
- Daily facts are the primary observation grain. Weekly facts are defined aggregates of the same population and must not be summed with daily rows.
period_startandperiod_enddescribe the observation interval. Collection and publication timestamps describe when SoftwareIQ processed the data, not when an employer created the underlying role.
REST resources
Endpoints expose facts, the dictionaries needed to interpret them, and explicit collection events.
/v1/job-postings/dailyDaily observed totals or versioned classified intersections.
| Parameter | Required | Behavior |
|---|---|---|
| company_id / ticker | No | Company scope; use company_id in persisted workflows. |
| record_type | No | observed_total or classified_count. |
| measure | No | active or new. |
| classification_version_id | No | Defaults to the catalog active version for classified_count. |
| period_start / period_end | No | Inclusive observation window. |
| dimension filters | No | function_id, sales_role_id, ae_segment_id, geography_id, or company-allocation IDs. |
/v1/job-postings/weeklyWeekly facts with the same dimensions and explicit derived/partial status.
/v1/job-taxonomy-membersResolve versioned member IDs, labels, and hierarchy.
| Parameter | Required | Behavior |
|---|---|---|
| taxonomy_version_id | No | Pin the dictionary used by a classified extract. |
| dimension_id | No | Restrict to one dimension. |
/v1/classifier-versionsDiscover compatible classifier, taxonomy, and rule-set versions.
/v1/job-collection-eventsInspect ATS migrations, collection gaps, and comparability impacts.
| Parameter | Required | Behavior |
|---|---|---|
| company_id | No | Affected company. |
| event_type | No | Collection-event type. |
Daily and weekly fact tables
JOB_POSTINGS_DAILY and JOB_POSTINGS_WEEKLY share one contract; only period grain differs.
JOB_POSTINGS_DAILY
Grain: one observed total or nonzero classified dimension intersection per company, date, measure, and applicable version. Stable key: job_posting_row_id.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| job_posting_row_id | STRING | No | Stable ID for one published row. |
| record_type | STRING | No | observed_total or classified_count. |
| classification_version_id | STRING | Yes | Complete classifier/taxonomy/rule-set version; null for invariant observed totals. |
| classifier_version_id | STRING | Yes | Core classifier version for classified rows. |
| taxonomy_version_id | STRING | Yes | Taxonomy dictionary version for classified rows. |
| rule_set_version_id | STRING | Yes | Company-allocation rule-set version for classified rows. |
| company_id | STRING | No | Stable company identifier. |
| ticker | STRING | Yes | Convenience ticker. |
| period_type | STRING | No | daily or weekly. |
| period_start | DATE | No | Start of the observation interval. |
| period_end | DATE | No | Inclusive end of the observation interval. |
| measure | STRING | No | active or new. New is null at a non-comparable baseline. |
| function_id | STRING | Yes | Detailed normalized function. |
| summary_function_id | STRING | Yes | Summarized normalized function. |
| sales_role_id | STRING | Yes | Normalized sales-role classification. |
| customer_success_role_id | STRING | Yes | Normalized customer-success classification. |
| ae_segment_id | STRING | Yes | Account-executive market segment when supported. |
| development_allocation_state | STRING | Yes | Classification state for company-specific development investment. |
| development_root_id | STRING | Yes | Company-specific development taxonomy root. |
| development_area_id | STRING | Yes | Company-specific development area. |
| development_emerging_area_id | STRING | Yes | Emerging development theme when supported. |
| gtm_allocation_state | STRING | Yes | Classification state for company-specific GTM investment. |
| gtm_root_id | STRING | Yes | Company-specific GTM taxonomy root. |
| gtm_area_id | STRING | Yes | Company-specific GTM area. |
| gtm_relationship_id | STRING | Yes | Normalized customer relationship. |
| gtm_motion_id | STRING | Yes | Normalized GTM motion. |
| geography_id | STRING | Yes | One mutually exclusive geography leaf for each classified posting. |
| count | INTEGER | Yes | Observed count; null when the period or measure is unavailable. |
| availability_status | STRING | No | available, partial, or unavailable. |
| continuity_status | STRING | No | continuous, new_baseline, gap, or gap_affected. |
| is_comparable_to_previous | BOOLEAN | No | Whether a change from the prior observation is valid. |
| derived | BOOLEAN | No | Whether the period was derived rather than directly stored at this grain. |
| content_hash | STRING | No | Deterministic publication hash. |
JOB_POSTINGS_WEEKLY
Grain: one observed total or nonzero classified dimension intersection per company, week, measure, and applicable version. Weekly periods can be derived or gap-affected; inspect the status fields.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| job_posting_row_id | STRING | No | Stable ID for one published row. |
| record_type | STRING | No | observed_total or classified_count. |
| classification_version_id | STRING | Yes | Complete classifier/taxonomy/rule-set version; null for invariant observed totals. |
| classifier_version_id | STRING | Yes | Core classifier version for classified rows. |
| taxonomy_version_id | STRING | Yes | Taxonomy dictionary version for classified rows. |
| rule_set_version_id | STRING | Yes | Company-allocation rule-set version for classified rows. |
| company_id | STRING | No | Stable company identifier. |
| ticker | STRING | Yes | Convenience ticker. |
| period_type | STRING | No | daily or weekly. |
| period_start | DATE | No | Start of the observation interval. |
| period_end | DATE | No | Inclusive end of the observation interval. |
| measure | STRING | No | active or new. New is null at a non-comparable baseline. |
| function_id | STRING | Yes | Detailed normalized function. |
| summary_function_id | STRING | Yes | Summarized normalized function. |
| sales_role_id | STRING | Yes | Normalized sales-role classification. |
| customer_success_role_id | STRING | Yes | Normalized customer-success classification. |
| ae_segment_id | STRING | Yes | Account-executive market segment when supported. |
| development_allocation_state | STRING | Yes | Classification state for company-specific development investment. |
| development_root_id | STRING | Yes | Company-specific development taxonomy root. |
| development_area_id | STRING | Yes | Company-specific development area. |
| development_emerging_area_id | STRING | Yes | Emerging development theme when supported. |
| gtm_allocation_state | STRING | Yes | Classification state for company-specific GTM investment. |
| gtm_root_id | STRING | Yes | Company-specific GTM taxonomy root. |
| gtm_area_id | STRING | Yes | Company-specific GTM area. |
| gtm_relationship_id | STRING | Yes | Normalized customer relationship. |
| gtm_motion_id | STRING | Yes | Normalized GTM motion. |
| geography_id | STRING | Yes | One mutually exclusive geography leaf for each classified posting. |
| count | INTEGER | Yes | Observed count; null when the period or measure is unavailable. |
| availability_status | STRING | No | available, partial, or unavailable. |
| continuity_status | STRING | No | continuous, new_baseline, gap, or gap_affected. |
| is_comparable_to_previous | BOOLEAN | No | Whether a change from the prior observation is valid. |
| derived | BOOLEAN | No | Whether the period was derived rather than directly stored at this grain. |
| content_hash | STRING | No | Deterministic publication hash. |
Taxonomy, versions, and collection state
These tables are required inputs for reproducible queries, labels, and continuity controls.
JOB_TAXONOMY_MEMBERS
Stable key: (taxonomy_version_id, dimension_id, member_id).
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| taxonomy_version_id | STRING | No | Taxonomy version. |
| dimension_id | STRING | No | Dimension such as geography or sales_role. |
| member_id | STRING | No | Stable member within its dimension and version. |
| display_name | STRING | No | Human-readable label. |
| parent_member_id | STRING | Yes | Parent for hierarchical rollups. |
| member_type | STRING | Yes | Leaf, group, or taxonomy-specific type. |
| display_order | INTEGER | Yes | Suggested presentation order. |
| content_hash | STRING | No | Publication hash. |
CLASSIFIER_VERSIONS
Stable key: classification_version_id.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| classification_version_id | STRING | No | Stable compatibility tuple and join key. |
| classifier_version_id | STRING | No | Core role classifier version. |
| taxonomy_version_id | STRING | No | Taxonomy dictionary version. |
| rule_set_version_id | STRING | No | Company-specific allocation rules version. |
| ticker | STRING | Yes | Scope ticker where version is company-specific. |
| status | STRING | No | stable, retired, or other lifecycle status. |
| parent_classification_version_ids | STRING | Yes | Canonical JSON list of predecessor versions. |
| content_hash | STRING | No | Publication hash. |
JOB_COLLECTION_EVENTS
Stable key: event_id. Join to facts by company and overlapping period.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| event_id | STRING | No | Stable collection-event identifier. |
| company_id | STRING | No | Affected company. |
| ticker | STRING | Yes | Convenience ticker. |
| event_type | STRING | No | Gap, ATS/provider migration, or other collection event. |
| started_on | DATE | No | Start of the event window. |
| ended_on | DATE | Yes | Inclusive event end; null while open. |
| availability_status | STRING | No | Availability during the event. |
| comparability | STRING | No | Impact on comparison with adjacent observations. |
| public_message | STRING | Yes | Research-facing explanation. |
| review_status | STRING | No | Operational review state. |
| content_hash | STRING | No | Publication hash. |
DATASET_CATALOG
Stable key: dataset_id. Discover the active classifier here; do not hard-code it for current-view applications.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| dataset_id | STRING | No | Dataset identifier. |
| active_classification_version_id | STRING | Yes | Default current version for classified queries. |
| data_updated_at | TIMESTAMP | No | Latest accepted publication time. |
| company_count | INTEGER | No | Companies in the publication. |
| content_hash | STRING | No | Publication hash. |
Research conventions
Use the version, record type, and continuity fields as part of the analytical contract.
- Pin
classification_version_idfor reproducible research and adopt restated classifications as a complete versioned history. - Use
observed_totalfor the collected population andclassified_countfor dimensional analysis; these are two views of the same postings. - Apply continuity and comparability fields before calculating changes across collection events or new baselines.
- Interpret postings as employer demand and investment intent rather than realized hires or financial performance.