CRM

Update an opportunity

Updates an opportunity (send only the fields to change).

PATCH
/api/v1/crm/opportunities/{opportunityId}

Request examples

curl https://app.filmo.io/api/v1/crm/opportunities/oppo_8f2a1c \
  --request PATCH \
  --header "Authorization: Bearer $FILMO_API_KEY" \
  --header "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
  --header 'Content-Type: application/json' \
  --data '{
  "amount": "13800.00",
  "expectedCloseDate": "2026-10-22T00:00:00+02:00"
}'
{
  "data": {
    "opportunityId": "opportunity_9f3a2b",
    "identifier": "Example identifier",
    "name": "Example opportunity",
    "status": "open",
    "amount": "120.00",
    "currency": "EUR",
    "pipelineId": "pipeline_9f3a2b",
    "pipelineName": "Example pipeline name",
    "stageId": "stage_9f3a2b",
    "stageName": "Example stage name",
    "stageType": "open",
    "effectiveProbability": 1,
    "weightedAmount": "120.00",
    "daysInStage": 1,
    "expectedCloseDate": "2026-09-01T10:00:00+02:00",
    "contactName": "Example contact name",
    "companyName": "Example company name",
    "ownerName": "Example owner name",
    "source": "inbound_email",
    "createdAt": "2026-09-01T10:00:00+02:00",
    "updatedAt": "2026-09-01T10:00:00+02:00",
    "description": "Example text.",
    "version": 1,
    "collaboratorStaffIds": [
      "collaborator_staff_9f3a2b"
    ],
    "quoteIds": [
      "quote_9f3a2b"
    ],
    "stageHistory": [
      {
        "fromStageId": "from_stage_9f3a2b",
        "toStageId": "to_stage_9f3a2b",
        "toStatus": "Example to status",
        "daysInPrevStage": 1,
        "movedAt": "2026-09-01T10:00:00+02:00",
        "note": "Example text."
      }
    ]
  }
}

Generated from the schema

version is REQUIRED: copy it from the previous read. If someone moved it between your read and your write, the request is rejected instead of overwriting their change. To move stage or close, use their own endpoints.

Authorizations

Bearer API key with the scope below. crm:write

Headers

Idempotency-Keystring

Unique identifier of the request, chosen by the client (a UUID works). Between 1 and 255 characters: an empty header is rejected with 400 validation_error, because the client would believe itself protected. Repeating the same key with the SAME body within 24 h returns the stored response without executing again, with the Idempotent-Replay: true header. With a DIFFERENT body it returns 422. It is the safe way to retry after a network timeout.

Limits: min length 1, max length 255

Example:"9f1c2f4e-3a5b-4f6d-8e7a-0b1c2d3e4f5a"

If-Matchstring

Optimistic locking: the ETag you read from the resource (or *). If the resource changed since, the write is rejected with 412 precondition_failed before doing anything; read it again and retry. Without the header the write always proceeds.

Example:"\"3sT3d9pBvZq4h2N0w8x1YkLmQ7c\""

Path parameters

opportunityIdstringRequired

Opportunity identifier.

Limits: min length 1

Body

application/json

Body schema: OpportunityUpdateBody

namestring

Short name.

Limits: min length 1, max length 200

descriptionstring

Free-text description.

amountstring

Amount as a decimal string, with at most two decimals. E.g.: "12500.00".

Limits: pattern ^\d+(\.\d{1,2})?$

currencystring

Uppercase ISO 4217 code. E.g.: "EUR".

Limits: pattern ^[A-Z]{3}$

probabilityOverrideinteger

Own probability, as a percentage.

Limits: min 0, max 100

expectedCloseDatestring<date-time>

Expected close date, in ISO 8601 with offset.

contactIdstring

Contact (person).

companyIdstring

Contact (company).

ownerStaffIdstring

Sales owner.

sourcestring

Lead source channel: inbound_email, website_form, referral, cold_outreach, event, social, existing_customer, partner or other.

Available options: inbound_email, website_form, referral, cold_outreach, event, social, existing_customer, partner, other

sourceDetailstring

Free-text detail of the channel.

Limits: max length 200

Response

application/json

Successful response.

Response schema: OpportunityDetailDto

Envelope: OpportunityDetailResponse. meta.warnings is present only when the operation is deprecated.

Headers: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay

dataobject

Full detail of a CRM opportunity.

Show child attributes
data.opportunityIdstring

data.identifierstring

data.namestring

data.statusstring

Available options: open, won, lost

data.amountstring

data.currencystring

data.pipelineIdstring

data.pipelineNamestring

data.stageIdstring

data.stageNamestring

data.stageTypestring

Available options: open, won, lost

data.effectiveProbabilitynumber

data.weightedAmountstring

data.daysInStageinteger

data.expectedCloseDatestring<date-time>

data.contactNamestring

data.companyNamestring

data.ownerNamestring

data.sourcestring

Available options: inbound_email, website_form, referral, cold_outreach, event, social, existing_customer, partner, other

data.createdAtstring<date-time>

data.updatedAtstring<date-time>

data.descriptionstring

data.versioninteger

Limits: min 1

data.collaboratorStaffIdsstring[]

data.quoteIdsstring[]

data.stageHistoryobject[]

Show child attributes
data.stageHistory.fromStageIdstring

data.stageHistory.toStageIdstring

data.stageHistory.toStatusstring

data.stageHistory.daysInPrevStageinteger

data.stageHistory.movedAtstring<date-time>

data.stageHistory.notestring

metaobject

Additional information about the response.

Show child attributes
meta.warningsobject[]

Lifecycle warnings; present only when the operation is deprecated.

Show child attributes
meta.warnings.codestring

Stable warning code.

Available options: deprecated

meta.warnings.messagestring

For people: what is deprecated, until when, and what to use.

meta.warnings.sunsetstring

Day (YYYY-MM-DD) the operation stops being served.

meta.warnings.replacementstring | null

operationId of the operation to use instead, or null if there is none.

Errors

StatusCodesMeaning
400validation_errorMalformed query or body. errors[] lists every offending field with its stable code.
402addon_requiredThe account plan does not include the add-on this operation needs; requiredAddon names it.
404not_foundIt does not exist or is outside the scope of the API key.
409conflictThe current state of the resource prevents the operation, a request with that Idempotency-Key is already in progress, or another conditional write (If-Match) held the resource for more than five seconds. errors[0].code says which: in_progress and lock_timeout are solved by retrying; invalid_state is not, because the state of the resource forbids the operation.
412precondition_failedThe If-Match entity tag does not match the current representation. Read the resource again and retry.
422idempotency_key_reusedThe same key was used before with a different body. Change the key.

401, 403, 429, 500 can be returned by any operation. Errors

Deprecation

This operation is not deprecated. Deprecations are announced with a Deprecation header and a sunset date. Versioning policy

  • CRM

    Opportunity

    CRM opportunity: which pipeline and stage it is in, for how much, with whom and with what probability.