Coorpacademy · OpenAPI Overlay 1.0.0

Coorpacademy Content API — API Evangelist enhancements

7 actions 7 updates documentation
Generated by API Evangelist Written by API Evangelist tooling for Coorpacademy's API. It is a proposal applied on top of the contract, not a document Coorpacademy publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

summarydescriptionx-spec-locationsx-api-evangelist

Targets 6

$.servers
$.info
$.tags
$.paths['/repository/{repository}/external-courses/{ref}'].get
$.paths['/repository/{repository}/external-courses/{ref}'].put
$.paths['/repository/{repository}/external-courses/{ref}'].delete

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: Coorpacademy Content API — API Evangelist enhancements
  version: 1.0.0
x-provenance:
  generated: '2026-08-17'
  method: generated
  source: openapi/coorpacademy-content-openapi.json
  extends: openapi/coorpacademy-content-openapi.json
  note: Overlay only; the harvested specification is never mutated.
actions:
  - target: $.servers
    description: >-
      REORDER AND PRUNE THE SERVER LIST. The published spec lists servers[0] as the relative URL
      `/api/v2`, followed by `http://localhost:3700/api/v2`. A tool that takes the first server gets a
      relative base it cannot resolve; the second is a developer's machine. The production host is
      fourth in the list. Live probe 2026-08-17: https://content.coorpacademy.com/api/v2/notifications
      returned HTTP 401 with {"message":"Invalid or missing authorization key"}, confirming the
      production base.
    update:
      - url: https://content.coorpacademy.com/api/v2
        description: production
      - url: https://content-staging.coorpacademy.com/api/v2
        description: staging
    x-rationale: verified-live-2026-08-17
  - target: $.info
    description: Record the alternate spec location, which the Swagger UI index gets wrong.
    update:
      x-spec-locations:
        served_at: https://content.coorpacademy.com/api-docs
        swagger_ui_declares: https://content.coorpacademy.com/swagger.json
        note: >-
          The Swagger UI at https://api.coorpacademy.com/ builds this document's URL as
          https://content.coorpacademy.com/swagger.json, which returns 404 "Cannot GET /swagger.json".
          The document is actually served at /api-docs. The Content API is therefore BROKEN in
          Coorpacademy's own public API explorer — the dropdown entry `api-content` fails to load.
    x-rationale: verified-live-2026-08-17
  - target: $.tags
    description: >-
      DECLARE THE TAGS. The spec uses 15 distinct tag values across 53 operations but declares none of
      them at the document root, so no tooling can render a grouped, described navigation. Names below
      are the exact strings already used on the operations.
    update:
      - name: externalCourses
        description: External courses and their external contents, per repository.
      - name: bulkExternalContents
        description: Bulk ingestion jobs for external content, with per-row CSV and resource error reports.
      - name: skills
        description: Catalogue skills with locale-specific labels.
      - name: customSkills
        description: Tenant-authored skills (edition side).
      - name: customSkillsConsommation
        description: Tenant-authored skills (published, learner-facing side).
      - name: certifications
        description: Certification editions, diffs and published snapshots.
      - name: certificationsConsommation
        description: Certifications as consumed by learners.
      - name: custom playlists
        description: Tenant-curated playlists (edition side).
      - name: customPlaylistsConsommation
        description: Tenant-curated playlists (published, learner-facing side).
      - name: scripts
        description: Video transcript/subtitle scripts, per video and language.
      - name: notifications
        description: Platform notifications typed feature, maintenance or survey.
      - name: jobs
        description: Repository-wide jobs, e.g. adding a locale to every resource.
  - target: $.paths['/repository/{repository}/external-courses/{ref}'].get
    description: Fill the empty summary and description.
    update:
      summary: Get one external course
      description: >-
        Returns a single external course by its `ref` within the repository. Addressed by the composite
        natural key (repository, ref) — there is no object id. Declares 409 Conflict on a GET, which is
        unusual and undocumented.
  - target: $.paths['/repository/{repository}/external-courses/{ref}'].put
    description: Fill the empty summary and description.
    update:
      summary: Update an external course
      description: >-
        Replaces an external course identified by (repository, ref). Returns 201 rather than 200 on a
        successful update.
  - target: $.paths['/repository/{repository}/external-courses/{ref}'].delete
    description: Fill the empty summary and description.
    update:
      summary: Delete an external course
      description: >-
        Removes an external course identified by (repository, ref). Returns 204. Note that most content
        entities in this API are soft-deleted through their `state` enum rather than removed; confirm
        which applies here before relying on it.
  - target: $.info
    description: >-
      Attach the cross-cutting operating rules an integrator needs and the spec does not state, all
      derived from the spec itself plus live probes. Full detail in the repo artifacts.
    update:
      x-api-evangelist:
        authentication:
          scheme: apiKey
          in: header
          parameter: authorization
          note: >-
            Lower-case `authorization`. Sibling services in the same estate use `Authorization`,
            `token`, `authentication` and `Api-Secret`. See authentication/coorpacademy-authentication.yml.
        idempotency:
          supported: false
          note: >-
            No idempotency key anywhere in the estate. POST upserts are not replay-safe; a 409 on
            (repository, ref, version) is the only collision signal.
        authoring_model:
          pattern: edition / diff / snapshot / consommation
          warning: >-
            Certifications, custom skills and custom playlists exist in parallel edition and
            consommation forms served from different path prefixes (`/repository/...` vs
            `/consommation/repository/...`). WRITING TO THE EDITION DOES NOT CHANGE WHAT LEARNERS SEE.
            Each also exposes PUT .../{ref}/undo to revert an edition to the last published snapshot.
          see: data-model/coorpacademy-data-model.yml
        pagination:
          parameters: [limit, offset, skip, count]
          envelope: none
          note: No total counts, no next/prev links, no Link header.
        soft_delete:
          state_enum: [published, draft, archived, deleted]
          escape_hatch: includeDeleted
        errors:
          rfc9457: false
          shapes: [express-error, bare-message]
          see: errors/coorpacademy-problem-types.yml
        rate_limits:
          published: false
          headers: none
          see: rate-limits/coorpacademy-rate-limits.yml