{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/42min-us/json-schema/42min-us-series-action-result-schema.json",
  "title": "SeriesActionResult",
  "description": "The outcome of one series action. Each action fills in only its own fields, so\nread the ones documented for the endpoint you called.\n",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/_original/42min-us-api-openapi.yml#/components/schemas/SeriesActionResult",
  "type": "object",
  "properties": {
    "held": {
      "type": "integer",
      "description": "Pause. Occurrences canceled and recorded as owed."
    },
    "created": {
      "type": "integer",
      "description": "Resume. Replacement occurrences booked."
    },
    "skipped": {
      "type": "array",
      "description": "Resume. Dates the pattern generates but cannot use, whether or not anything was booked.",
      "items": {
        "$ref": "#/$defs/SeriesSkip"
      }
    },
    "owed": {
      "type": "integer",
      "description": "Resume. Occurrences still waiting for a replacement. Non-zero means the series stays paused."
    },
    "canceled": {
      "type": "integer",
      "description": "End. Occurrences canceled for good."
    },
    "moved": {
      "type": "integer",
      "description": "Change host. Occurrences transferred."
    },
    "unchanged": {
      "type": "integer",
      "description": "Change host. Occurrences already hosted by the target, so nothing to transfer."
    },
    "stopped_by": {
      "type": [
        "string",
        "null"
      ],
      "description": "Change host. Why the run stopped early, or null when it finished and the\nseries host was changed. A closed set of codes, safe to branch on:\n\n- `series_busy`: another action took the series over mid-run. The same\n  condition, and the same code, as the 409 this API throws for it.\n- `host_not_allowed`: the credential may not move meetings to that host.\n- `host_not_eligible`: the new host is not an active user of this\n  organization.\n- `host_calendar_required`: the new host has no writable calendar of the\n  provider this event type's meeting link needs.\n- `host_already_booked`: the new host already has another meeting at that\n  occurrence's time. An ordinary scheduling conflict, not a fault of ours;\n  pick a different host or time for it and repeat the call.\n- `occurrence_shared`: one occurrence shares its conference or calendar\n  entry with another booking, so its host cannot be moved on its own.\n- `occurrence_canceled`: one occurrence was canceled while the run went.\n- `occurrence_not_found`: one occurrence could not be found; it may have\n  been removed while the run was going.\n- `occurrence_changed`: one occurrence moved while the run went.\n- `occurrence_busy`: another operation on one occurrence is still\n  finishing.\n- `host_change_unavailable`: the per-meeting transfer lock could not be\n  taken. Transient; retry.\n- `internal_error`: an unexpected failure. Quote `meta.request_id`.\n\nWhatever the reason, `moved` occurrences ARE on the new host and the series\nhost is unchanged, so the call can simply be repeated once the cause is\nfixed.\n",
      "enum": [
        null,
        "series_busy",
        "host_not_allowed",
        "host_not_eligible",
        "host_calendar_required",
        "host_already_booked",
        "occurrence_shared",
        "occurrence_canceled",
        "occurrence_not_found",
        "occurrence_changed",
        "occurrence_busy",
        "host_change_unavailable",
        "internal_error"
      ]
    },
    "superseded": {
      "type": "boolean",
      "description": "Pause, Resume and End, plus the resume a pattern-changing PATCH embeds\nunder `resumed`. Another action took the series over while this one was\nrunning, so it stopped where it was. The counts above are what it did\nfinish; repeat the call to do the rest. Change Host never sets this; it\nreports the same situation through `stopped_by` instead.\n\nUnder `resumed` it also covers the case where the resume never started:\nthe PATCH wrote the new pattern and paused the series, and another action\nthen took it over before a single replacement was booked. That is\n`created: 0` with `owed` naming what is still waiting. Read the series\nagain and call `/resume` with the current `ETag`.\n\nThe same field also covers a resume that DID start booking replacements\nbefore being taken over: `created` and `skipped` are what that partial\nwalk actually did, real confirmed meetings and all, never zeroed out\nbecause the run did not finish. `owed` still names what is left, and\n`/resume` with the current `ETag` converges on the rest.\n"
    }
  },
  "$defs": {
    "SeriesSkip": {
      "type": "object",
      "description": "A date in the pattern that could not be booked. It does not shift; it is dropped.",
      "required": [
        "start_at",
        "reason"
      ],
      "properties": {
        "start_at": {
          "type": "string",
          "format": "date-time"
        },
        "reason": {
          "type": "string",
          "enum": [
            "conflict"
          ]
        }
      }
    }
  }
}