Deals

Update a deal

PATCH/deals/{id}

Changes the fields you send and returns the deal. min_investment is in major currency units. Structure-specific details are sent as type_details, which was called meta before this version, and replace the stored details wholesale. description is sanitised as HTML. status can't be set here: it is a read-only field, so sending it returns 422 prohibited (a validation error, not a state conflict); use POST /deals/{id}/actions/publish, unpublish, archive or restore. available_to must be on or after available_from; when only one side is sent, the stored value of the other is used, and a null leaves the window open.

A published deal accepts changes only to external_id, tabs, sponsor_image_id, video_id and the transaction fields (transaction_workflow_id, investor_engagement_enabled and active_tranche_id); any other field, image_id included, returns 409 invalid_state with current_state and allowed_states, so unpublish it first. transaction_workflow_id also needs transaction-workflows:write, and investor_engagement_enabled or active_tranche_id also need transactions:write; without it the call returns 403 missing_scope. An unknown workflow returns 422 exists on transaction_workflow_id, and required_steps when it lacks the Committed or Completed step. A deal with no workflow, and none being assigned in the same call, returns 422 transaction_workflow on investor_engagement_enabled or active_tranche_id. A tranche that isn't on the deal returns 422 exists. Replacing the workflow of a deal that has journey events or investments returns 409 invalid_state. Every assignment creates any missing transaction folders under the deal's root folder. tabs is the whole ordered list of tab keys the deal shows: it must include deal and documents and the id of every live custom tab, repeat no tab, and include team only when the deal has team members. Built-in keys are snake_case (team, global_goals, location, parent_entity, graph_table, fund_strategy, video), and built-in tabs you leave out are turned off; a list that breaks these rules returns 422 on tabs. dry_run shows the result without saving it. Emits deal.updated, with tabs in changed_fields when the tabs change, and when the workflow changes it notifies the deal's participants. image_id and sponsor_image_id must be files in the deal's assets folder, else 422 exists. video_id is a Vimeo video id of digits only: setting it turns the video tab on and null turns it off, unless tabs is sent in the same request, which then decides. Sending the previous values undoes it.

Path parameters

  • idstring (uuid)Required#

    The deal's id, a uuid. An unknown id, or a deal the token can't see, returns 404.

Query parameters

  • dry_runboolean#

    Validate and run the call without committing it, returning what the real call would return with meta.dry_run set.

Request body

application/json, required · DealUpdate

  • namestring#

    The deal name.

  • summarystring | null#

    The short summary shown on deal cards.

  • descriptionstring | null#

    The deal description, as HTML. It is sanitised on write.

  • currencystring#

    The ISO 4217 currency.

  • min_investmentnumber | null#

    The minimum investment, in major currency units.

  • available_fromstring | null#

    When the deal opens to investment.

  • available_tostring | null#

    When the deal closes to investment.

  • structurestring#

    The deal structure: direct, fund or tradeable.

    One of: direct, fund, tradeable
  • sub_structurestring#

    The deal sub-structure: debt, equity, hybrid, multi_asset, real_assets, real_estate or earthshot_solution.

    One of: debt, equity, hybrid, multi_asset, real_assets, real_estate, earthshot_solution
  • type_detailsobject#

    The structure-specific details that the legacy meta field held, keyed by field name, such as sector or growthStage. Enum-backed values are validated and lower-cased. GET /deals/lookups lists the allowed values.

  • sponsorstring | null#

    The sponsor name.

  • show_funding_securedboolean#

    Whether investors see how much funding is secured.

  • allow_questionsboolean#

    Whether investors can ask questions.

  • request_further_docsboolean#

    Whether investors can request further documents.

  • external_idstring | null#

    Your own reference for the deal. It can be changed on a published deal.

  • transaction_workflow_idstring (uuid)#

    The transaction workflow investors follow. It can be changed on a published deal, and needs transaction-workflows:write.

  • investor_engagement_enabledboolean#

    Whether investors can start investing through the transaction workflow. It can be changed on a published deal, and needs transactions:write.

  • active_tranche_idstring | null#

    The tranche new investments join, or null to clear it. It can be changed on a published deal, and needs transactions:write.

  • tabsstring[]#

    The whole ordered list of tabs investors see. It must include deal and documents and the id of every custom tab of the deal, repeat no tab, and include team only when the deal has team members. Built-in tabs you leave out are turned off. It can be changed on a published deal.

  • image_idstring | null#

    The deal image: a file in the deal's assets folder, else 422 exists. Null clears it. A published deal returns 409 invalid_state.

  • sponsor_image_idstring | null#

    The sponsor logo: a file in the deal's assets folder, else 422 exists. Null clears it. It can be changed on a published deal.

  • video_idstring | null#

    The Vimeo video id, digits only. Setting it turns the video tab on and null turns it off, unless tabs is sent in the same request. It can be changed on a published deal.

{
  "min_investment": 50000,
  "type_details": {
    "sector": "information_technology",
    "growthStage": "growth"
  }
}

Responses

200

The updated deal.

Deal
{
  "data": {
    "id": "f6071829-3a4b-4c5d-9e6f-8091a2b3c4d5",
    "name": "Series B — Acme Robotics",
    "status": "published",
    "external": false,
    "external_id": "CRM-2026-0042",
    "summary": "Late-stage growth round in autonomous logistics.",
    "description": "<p>Acme Robotics is raising a Series B.</p>",
    "currency": "USD",
    "min_investment": 25000,
    "structure": "direct",
    "sub_structure": "equity",
    "type_details": {
      "sector": "information_technology",
      "growthStage": "growth"
    },
    "sponsor": "Acme Capital",
    "show_funding_secured": true,
    "allow_questions": false,
    "request_further_docs": false,
    "available_from": "2026-07-01T00:00:00+00:00",
    "available_to": "2026-09-30T23:59:59+00:00",
    "transaction_workflow_id": "1b2c3d4e-5f60-4a7b-8c9d-0e1f2a3b4c5d",
    "investor_engagement_enabled": true,
    "active_tranche_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "drafted_at": "2026-06-15T10:30:00+00:00",
    "approval_started_at": "2026-06-16T09:00:00+00:00",
    "approved_at": "2026-06-17T09:00:00+00:00",
    "published_at": "2026-06-18T09:00:00+00:00",
    "rejected_at": null,
    "retired_at": null,
    "tabs": [
      "deal",
      "documents",
      "video"
    ],
    "image_id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
    "sponsor_image_id": null,
    "video_id": "76979871",
    "custom_status_id": null,
    "created_at": "2026-06-15T10:30:00+00:00",
    "updated_at": "2026-06-18T09:00:00+00:00"
  }
}
401

Authentication failed. error.code is one of invalid_token, expired, revoked.

Error
403

Authorization failed. error.code is one of org_disabled, ip_blocked, missing_scope, scope_disabled, user_disabled.

Error
404

Resource not found (error.code = not_found).

Error
409

The request conflicts with existing state (error.code = conflict), e.g. a compliance flow with the requested name already exists.

Error
422

The request can't be processed (HTTP 422): validation_failed with one ErrorDetail per problem, or a code documented on the operation.

Error
429

Rate limit exceeded (error.code = rate_limited).

Error

Examples

curl -X PATCH https://your-org-domain/kong/core/api/v2/deals/{id}\
  -H "Authorization: Bearer $HELM_API_KEY"\
  -H "Content-Type: application/json"\
  -d '{
  "min_investment": 50000,
  "type_details": {
    "sector": "information_technology",
    "growthStage": "growth"
  }
}'