changedInput schema / properties / block_id / description
Previous value: -"Run only this block."New value: +"Run only this block (custom reports only; built-in reports take section)."
addedInput schema / properties / definition
Added value: +{
+ "additionalProperties": false,
+ "description": "The report to check and run. Required unless report_id is sent.",
+ "example": {
+ "blocks": [
+ {
+ "compare": "previous_period",
+ "dataset": "interview_results",
+ "id": "headline",
+ "measures": [
+ "completed",
+ "avg_score",
+ "shortlisted"
+ ],
+ "type": "kpi"
+ },
+ {
+ "dataset": "interview_results",
+ "dimensions": [
+ {
+ "field": "date",
+ "grain": "week"
+ }
+ ],
+ "id": "trend",
+ "measures": [
+ "completed"
+ ],
+ "title": "Completed per week",
+ "type": "line",
+ "width": 8
+ },
+ {
+ "dataset": "interview_results",
+ "dimensions": [
+ "position"
+ ],
+ "id": "by_position",
+ "limit": 25,
+ "measures": [
+ "completed",
+ "avg_score",
+ "shortlisted"
+ ],
+ "sort": [
+ {
+ "dir": "desc",
+ "field": "completed"
+ }
+ ],
+ "title": "By position",
+ "type": "table"
+ }
+ ],
+ "filters": {
+ "period": {
+ "preset": "last_30_days"
+ }
+ },
+ "schema": "jobmojito.report/v1",
+ "title": "Weekly hiring pulse"
+ },
+ "properties": {
+ "blocks": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "compare": {
+ "description": "kpi / funnel only: also return the same numbers for the period before.",
+ "enum": [
+ "previous_period"
+ ],
+ "type": "string"
+ },
+ "dataset": {
+ "description": "Dataset id from report-catalog. Not used by a text block.",
+ "example": "interview_results",
+ "type": "string"
+ },
+ "dimensions": {
+ "items": {
+ "anyOf": [
+ {
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "field": {
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+ },
+ "grain": {
+ "description": "For a date field: day (default), week, month, quarter or year.",
+ "enum": [
+ "day",
+ "week",
+ "month",
+ "quarter",
+ "year"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "field"
+ ],
+ "type": "object"
+ }
+ ],
+ "description": "A dimension field id, or {\"field\", \"grain\"} for a date."
+ },
+ "maxItems": 2,
+ "type": "array"
+ },
+ "id": {
+ "example": "by_position",
+ "pattern": "^[A-Za-z0-9_-]{1,40}$",
+ "type": "string"
+ },
+ "limit": {
+ "description": "Rows for a table / bar / line. Default 100 (line 500).",
+ "maximum": 500,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "measures": {
+ "description": "1 to 6 measure ids of the dataset.",
+ "example": [
+ "completed",
+ "avg_score"
+ ],
+ "items": {
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+ },
+ "maxItems": 6,
+ "minItems": 1,
+ "type": "array"
+ },
+ "sort": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "dir": {
+ "enum": [
+ "asc",
+ "desc"
+ ],
+ "type": "string"
+ },
+ "field": {
+ "description": "A dimension or measure the block selects.",
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "field"
+ ],
+ "type": "object"
+ },
+ "maxItems": 3,
+ "type": "array"
+ },
+ "text": {
+ "description": "Text block only: the note (plain text, line breaks kept).",
+ "maxLength": 4000,
+ "type": "string"
+ },
+ "title": {
+ "maxLength": 120,
+ "type": "string"
+ },
+ "type": {
+ "description": "kpi: one total per measure (no dimensions; add compare previous_period for a change). funnel: 2+ measures as steps (no dimensions). table: 0-2 dimensions. bar: 1-2 dimensions. stacked_bar: exactly 2 dimensions. line: first dimension a date. text: a note, only `text`.",
+ "enum": [
+ "kpi",
+ "table",
+ "bar",
+ "stacked_bar",
+ "line",
+ "funnel",
+ "text"
+ ],
+ "type": "string"
+ },
+ "where": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "field": {
+ "description": "A dimension of the block's dataset.",
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+ },
+ "op": {
+ "enum": [
+ "eq",
+ "neq",
+ "in",
+ "not_in",
+ "gt",
+ "gte",
+ "lt",
+ "lte",
+ "between",
+ "is_empty",
+ "is_not_empty"
+ ],
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ]
+ },
+ "type": "array"
+ }
+ ],
+ "description": "One value for eq / neq / gt / gte / lt / lte, a list for in / not_in, [low, high] for between, nothing for is_empty / is_not_empty."
+ }
+ },
+ "required": [
+ "field",
+ "op"
+ ],
+ "type": "object"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "width": {
+ "description": "Columns of a 12-column grid. Default 12.",
+ "maximum": 12,
+ "minimum": 1,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "id",
+ "type"
+ ],
+ "type": "object"
+ },
+ "maxItems": 12,
+ "type": "array"
+ },
+ "description": {
+ "maxLength": 1000,
+ "type": "string"
+ },
+ "filters": {
+ "additionalProperties": false,
+ "description": "Filters for every block of the report. Each viewer can override them for themselves.",
+ "properties": {
+ "include_test": {
+ "description": "Include test runs. Default false.",
+ "type": "boolean"
+ },
+ "interview_ids": {
+ "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.",
+ "items": {
+ "format": "uuid",
+ "type": "string"
+ },
+ "maxItems": 200,
+ "type": "array"
+ },
+ "period": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "preset": {
+ "enum": [
+ "last_7_days",
+ "last_30_days",
+ "last_90_days",
+ "this_month",
+ "last_month",
+ "this_quarter",
+ "last_quarter",
+ "this_year",
+ "last_year",
+ "all_time"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "preset"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "to": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ }
+ ],
+ "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.",
+ "example": {
+ "preset": "last_30_days"
+ }
+ },
+ "position_ids": {
+ "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.",
+ "items": {
+ "format": "uuid",
+ "type": "string"
+ },
+ "maxItems": 200,
+ "type": "array"
+ },
+ "without_position": {
+ "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "schema": {
+ "description": "Always \"jobmojito.report/v1\".",
+ "enum": [
+ "jobmojito.report/v1"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "schema",
+ "title",
+ "blocks"
+ ],
+ "type": "object"
+}
removedInput schema / properties / draft
Removed value: -{
- "default": "false",
- "description": "Run the unpublished draft instead (only if you can edit the report).",
- "enum": [
- "true",
- "false"
- ],
- "example": "false",
- "type": "string"
-}
addedInput schema / properties / filters / allOf
Added value: +[
+ {
+ "additionalProperties": false,
+ "description": "Filters for every block of the report. Each viewer can override them for themselves.",
+ "properties": {
+ "include_test": {
+ "description": "Include test runs. Default false.",
+ "type": "boolean"
+ },
+ "interview_ids": {
+ "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.",
+ "items": {
+ "format": "uuid",
+ "type": "string"
+ },
+ "maxItems": 200,
+ "type": "array"
+ },
+ "period": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "preset": {
+ "enum": [
+ "last_7_days",
+ "last_30_days",
+ "last_90_days",
+ "this_month",
+ "last_month",
+ "this_quarter",
+ "last_quarter",
+ "this_year",
+ "last_year",
+ "all_time"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "preset"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "to": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ }
+ ],
+ "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.",
+ "example": {
+ "preset": "last_30_days"
+ }
+ },
+ "position_ids": {
+ "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.",
+ "items": {
+ "format": "uuid",
+ "type": "string"
+ },
+ "maxItems": 200,
+ "type": "array"
+ },
+ "without_position": {
+ "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Applied on top of definition.filters (custom reports only)."
+ }
+]
removedInput schema / properties / filters / description
Removed value: -"Optional JSON ReportFilters to apply on top, e.g. {\"period\":{\"preset\":\"last_month\"}}."
removedInput schema / properties / filters / type
Removed value: -"string"
addedInput schema / properties / from
Added value: +{
+ "description": "Built-in reports only: first day of the period (YYYY-MM-DD, UTC, inclusive). Default: 30 days before `to` (90 for fairness).",
+ "example": "2026-10-01",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+}
removedInput schema / properties / id
Removed value: -{
- "description": "Report id (from list_reports).",
- "format": "uuid",
- "type": "string"
-}
addedInput schema / properties / include_candidates
Added value: +{
+ "description": "Built-in reports only: also run the sections that list candidates by name (candidates true in list_reports). Default false. Every such read is recorded in the audit log.",
+ "type": "boolean"
+}
addedInput schema / properties / interview_id
Added value: +{
+ "description": "Built-in reports only: one interview (interview_def_set.id), for the sections that take it. Not with position_id.",
+ "format": "uuid",
+ "type": "string"
+}
addedInput schema / properties / limit
Added value: +{
+ "description": "Built-in reports only: rows per section (1 to 500). Default 50, or 20 for a section of large rows (ATS jobs).",
+ "maximum": 500,
+ "minimum": 1,
+ "type": "integer"
+}
changedInput schema / properties / merchant_id / description
Previous value: -"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant."New value: +"Optional merchant to act on. Admins and sub-merchant operators only; other callers always use their token's merchant."
removedInput schema / properties / merchant_id / example
Removed value: -"28106cba-1c27-4e53-b149-32113e5e8e31"
addedInput schema / properties / offset
Added value: +{
+ "description": "Built-in reports only: rows to skip in each section (default 0); see each block's pagination.",
+ "minimum": 0,
+ "type": "integer"
+}
addedInput schema / properties / position_id
Added value: +{
+ "description": "Built-in reports only: one position (position_def_set.id), for the sections that take it (filters in list_reports).",
+ "format": "uuid",
+ "type": "string"
+}
addedInput schema / properties / report_id
Added value: +{
+ "description": "Instead of definition: run a saved custom report (its uuid; your saved filters, then filters, apply) or a built-in report id (builtin:<name>, from list_reports scope builtin).",
+ "example": "builtin:recruiter_workload",
+ "type": "string"
+}
addedInput schema / properties / section
Added value: +{
+ "description": "Built-in reports only: run only this section (ids in list_reports). Default: every section.",
+ "example": "positions",
+ "pattern": "^[a-z][a-z0-9_]{0,40}$",
+ "type": "string"
+}
addedInput schema / properties / stage
Added value: +{
+ "description": "builtin:fairness_monitoring only: pre_screening, ai_interview (default) or final.",
+ "enum": [
+ "pre_screening",
+ "ai_interview",
+ "final"
+ ],
+ "type": "string"
+}
addedInput schema / properties / to
Added value: +{
+ "description": "Built-in reports only: last day of the period (YYYY-MM-DD, UTC, inclusive). Default: today. At most 400 days after `from`.",
+ "example": "2026-10-31",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+}
addedInput schema / properties / version
Added value: +{
+ "description": "With a custom report_id: the version you read; a newer one is refused with 409.",
+ "minimum": 1,
+ "type": "integer"
+}
changedInput schema / required
Previous value: -[
- "id"
-]New value: +[]
addedOutput schema / properties / admin_url
Added value: +{
+ "description": "Built-in reports: the report in the JobMojito admin.",
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedOutput schema / properties / blocks / description
Added value: +"One result per block. A built-in report returns one per section: block_id is the section id, plus title, candidates (lists candidates by name), columns, rows and pagination {limit, offset, total (null when unknown), has_more}. A section that cannot run for you is ok=false with the reason."
addedOutput schema / properties / builtin_id
Added value: +{
+ "description": "The built-in report that ran (instead of report_id).",
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedOutput schema / properties / description
Added value: +{
+ "description": "Built-in reports: what the report shows.",
+ "type": [
+ "string",
+ "null"
+ ]
+}
changedOutput schema / properties / filters / description
Previous value: -"The filters the blocks ran with (report defaults, then your saved filters, then the ones you passed)."New value: +"The filters the blocks ran with (custom: report defaults, then your saved filters, then the ones you passed; built-in: period, position_id or interview_id, stage, include_candidates, limit, offset)."
addedOutput schema / properties / kind
Added value: +{
+ "description": "builtin for a built-in report; absent for a custom report.",
+ "enum": [
+ "builtin",
+ null
+ ],
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedOutput schema / properties / report_id / description
Added value: +"The custom report that ran."