M19 ships 49 pre-built REST endpoints organized into 8 functional areas — the posting side (opportunities, notes, templates), the review side (proposals, conversations), the hired side (engagements, time cards), and the localized lookups behind every form. Each endpoint is backed by its own stored procedure. Skim any area below.
Everything is POST + JSON body — no verb quirks. The funnel reads left to right across the areas: a posting attracts proposals, an accepted proposal becomes an engagement, and the engagement accrues approved time. Every endpoint maps one-to-one onto a stored procedure and shares the request/response envelope used everywhere else in the CleenUI API.
The posting — a job, a gig, or a contract. Save covers drafting and editing; publish handles both the single posting and the scheduled Publish On batch; update-status drives the validated lifecycle (Draft, Published, Publish On, Archived, Deleted); delete is soft and admin-visible; clone copies a posting into a fresh Draft.
/opportunity/saveInserts or updates an opportunity and upserts its requested language row./opportunity/detailReturns the opportunity plus language, attachment, note, and engagement result sets./opportunity/filterReturns a paged opportunity list with localized text and total-count metadata./opportunity/cloneCreates a Draft copy with a new code and copies languages and attachments./opportunity/publishPublishes one opportunity or runs the scheduled-publication batch./opportunity/update-statusApplies a validated status transition and returns the updated opportunity./opportunity/deleteSoft-deletes an opportunity and moves it to the Deleted status.Internal notes on the posting itself — timestamped, attributed, localized, and soft-deleted like everything else in the module.
/opportunity/note/saveInserts or updates an opportunity note and its localized body./opportunity/note/filterReturns a paged, localized list of non-deleted notes for an opportunity./opportunity/note/deleteSoft-deletes an opportunity note.Reusable posting templates — account-scoped or global — carrying localized prefill text for the From-a-template creation path. Clone copies a template with every language row under it.
/opportunity/template/saveInserts or updates an account-scoped or global opportunity template./opportunity/template/detailReturns the template row and all of its language rows./opportunity/template/filterReturns a paged list of accessible templates with localized prefill fields./opportunity/template/cloneCreates a new template and copies all source language rows./opportunity/template/deleteSoft-deletes an opportunity template.The review side of the funnel. Shortlist and favorite are independent, idempotent flags with audit fields; update-status moves the pipeline in any valid direction and records the history; accept is the hire moment — it flips the proposal to Hired and creates its Pending engagement in one transaction.
/proposal/detailReturns the proposal plus languages, attachments, notes, and status-change history./proposal/filterReturns a paged, localized proposal list with total-count metadata./proposal/acceptMoves a proposal to Hired and creates its Pending engagement in one transaction./proposal/shortlistSets the proposal shortlist flag and audit fields idempotently./proposal/unshortlistClears the proposal shortlist flag and audit fields idempotently./proposal/favoriteSets the proposal favorite flag and audit fields idempotently./proposal/unfavoriteClears the proposal favorite flag and audit fields idempotently./proposal/update-statusApplies any valid non-no-op proposal status transition and records its history.Chat and video calls live in the platform’s messaging module; Work stores only the join. Reviewer notes on the applicant carry the reasoning — fit, impressions, concerns — localized like all display text.
/proposal/conversation/saveIdempotently links an existing chat conversation to a proposal./proposal/conversation/filterReturns a paged list of proposal/conversation join rows./proposal/note/saveInserts or updates a proposal note and its localized body./proposal/note/filterReturns a paged, localized list of non-deleted proposal notes./proposal/note/deleteSoft-deletes a proposal note.One per accepted proposal — many per posting. Save creates the engagement with its initial Pending status history; update-status drives pause, terminate, and re-engage, stamping the lifecycle dates the accrual logic honors; detail returns the engagement with its status history, notes, and related time cards.
/engagement/saveInserts or updates an engagement and creates its initial Pending status history on insert./engagement/detailReturns the engagement, status history, notes, and related time cards./engagement/filterReturns a paged, localized engagement list with status and term codes./engagement/update-statusApplies a status transition, writes status history, and updates lifecycle stamps./engagement/note/saveInserts or updates an engagement note and its localized body./engagement/note/filterReturns a paged, localized list of non-deleted engagement notes./engagement/note/deleteSoft-deletes an engagement note.Entry-first time tracking: saving an entry creates the engagement’s weekly card when one doesn’t exist yet. Entries are blocked on paused or terminated engagements, auto-approved when the engagement’s approval type is Automatic, and locked once billed — approve handles one entry or every eligible entry on a card.
/engagement/time-card/detailResolves a time card by ID, code, or engagement plus period start./engagement/time-card-entry/saveInserts or updates an entry and creates the engagement’s weekly card when needed./engagement/time-card-entry/filterReturns a paged list of non-deleted time-card entries./engagement/time-card-entry/approveManually approves or rejects one entry or all eligible entries on a card./engagement/time-card-entry/deleteSoft-deletes one unbilled time-card entry and returns the deleted entry.The localized lookup surface every work form reads — posting types, statuses, visibility, compensation terms, approval types, and the reason vocabularies behind both status-change flows. All display text resolves through the platform’s translation layer.
/opportunity/type/filterReturns localized opportunity-type choices./opportunity/status-type/filterReturns localized opportunity status choices./opportunity/visibility-type/filterReturns localized visibility choices for work postings./opportunity/term-type/filterReturns localized compensation-term choices for work postings and engagements./proposal/status-type/filterReturns localized proposal status choices./proposal/status-change-reason-type/filterReturns localized reasons for proposal status changes./engagement/approval-type/filterReturns the localized approval-type lookup rows used by work forms./engagement/status-type/filterReturns localized engagement status choices./engagement/status-change-reason-type/filterReturns localized reasons for engagement status changes.Book a 30-minute review and we’ll trace any operation end to end — from React component to stored procedure — using your team’s actual use case.