Deals and opportunities
Pipelines, deals and the forecast, plus the shared opportunity board.
11 endpoints· 4 called live· 7 not exercised here· verified against http://127.0.0.1:8741
11 endpoints
GET/api/v1/salesshift/dealsCalled liveDeals, optionally filtered by pipeline and status.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| pipeline_id | string(uuid)? | optional | |
| status_filter | string? | optional |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/deals' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"organization_id": "str",
"pipeline_id": "str",
"stage_id": "str",
"name": "str",
"amount": "float",
"currency": "str",
"expected_close": "null",
"contact_id": "null",
"company_id": "null",
"status": "str",
"lost_reason": "null",
"tags": [
"<empty list>"
],
"created_at": "str",
"updated_at": "str"
},
"...x22"
]
}POST/api/v1/salesshift/dealsNot exercised hereCreate a deal, defaulting to the org's first pipeline and stage when none is given.
Request body (required) — DealCreate
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | required | |
| pipeline_id | string(uuid)? | optional | |
| stage_id | string(uuid)? | optional | |
| amount | number? | optional | |
| currency | string | optional | Default "USD". |
| expected_close | string(date)? | optional | |
| contact_id | string(uuid)? | optional | |
| company_id | string(uuid)? | optional | |
| tags | string[] | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/deals' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "name": "<string>", "pipeline_id": "<string(uuid)>", "stage_id": "<string(uuid)>", "amount": 0, "currency": "USD", "expected_close": "<string(date)>", "contact_id": "<string(uuid)>", "company_id": "<string(uuid)>", "tags": [ "<string>" ] }'Response · 201
{
"id": "string(uuid)",
"organization_id": "string(uuid)",
"pipeline_id": "string(uuid)",
"stage_id": "string(uuid)",
"name": "string",
"amount": "number?",
"currency": "string",
"expected_close": "string(date)?",
"contact_id": "string(uuid)?",
"company_id": "string(uuid)?",
"status": "string",
"lost_reason": "string?",
"tags": "string[]?",
"created_at": "string(date-time)",
"updated_at": "string(date-time)"
}Errors
| Status | detail |
|---|---|
| 400 | Pipeline has no stages |
PUT/api/v1/salesshift/deals/{deal_id}Not exercised hereUpdate a deal from a partial payload.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| deal_id | string(uuid) | required |
Request body (required) — DealUpdate
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string? | optional | |
| amount | number? | optional | |
| currency | string? | optional | |
| expected_close | string(date)? | optional | |
| contact_id | string(uuid)? | optional | |
| company_id | string(uuid)? | optional | |
| status | string? | optional | |
| lost_reason | string? | optional | |
| tags | string[]? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X PUT 'https://api.vxcloud.io/api/v1/salesshift/deals/{deal_id}' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "name": "<string>", "amount": 0, "currency": "<string>", "expected_close": "<string(date)>", "contact_id": "<string(uuid)>", "company_id": "<string(uuid)>", "status": "<string>", "lost_reason": "<string>", "tags": [ "<string>" ] }'Response · 200
{
"id": "string(uuid)",
"organization_id": "string(uuid)",
"pipeline_id": "string(uuid)",
"stage_id": "string(uuid)",
"name": "string",
"amount": "number?",
"currency": "string",
"expected_close": "string(date)?",
"contact_id": "string(uuid)?",
"company_id": "string(uuid)?",
"status": "string",
"lost_reason": "string?",
"tags": "string[]?",
"created_at": "string(date-time)",
"updated_at": "string(date-time)"
}Errors
| Status | detail |
|---|---|
| 404 | Deal not found |
DELETE/api/v1/salesshift/deals/{deal_id}Not exercised hereDelete a deal.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| deal_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/deals/{deal_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Deal not found |
PUT/api/v1/salesshift/deals/{deal_id}/moveNot exercised herePowers drag-and-drop Kanban.
Powers drag-and-drop Kanban. Won/lost stages update deal status.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| deal_id | string(uuid) | required |
Request body (required) — DealMove
| Field | Type | Required | Notes |
|---|---|---|---|
| stage_id | string(uuid) | required |
Values in the request below are typed placeholders, not sample data.
Request
curl -X PUT 'https://api.vxcloud.io/api/v1/salesshift/deals/{deal_id}/move' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "stage_id": "<string(uuid)>" }'Response · 200
{
"id": "string(uuid)",
"organization_id": "string(uuid)",
"pipeline_id": "string(uuid)",
"stage_id": "string(uuid)",
"name": "string",
"amount": "number?",
"currency": "string",
"expected_close": "string(date)?",
"contact_id": "string(uuid)?",
"company_id": "string(uuid)?",
"status": "string",
"lost_reason": "string?",
"tags": "string[]?",
"created_at": "string(date-time)",
"updated_at": "string(date-time)"
}Errors
| Status | detail |
|---|---|
| 404 | Deal not found |
| 404 | Stage not found |
GET/api/v1/salesshift/deals/forecastCalled liveWeighted pipeline forecast: sum(amount * stage.win_probability).
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/deals/forecast' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": {
"stages": [
{
"stage": "...",
"deal_count": "...",
"total_value": "...",
"weighted_value": "..."
},
"...x6"
],
"total_pipeline": "float",
"weighted_forecast": "float"
}
}GET/api/v1/salesshift/opportunitiesCalled liveOpen, user-posted opportunities; retired platform seed rows are excluded.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| q | string | optional | Default "". |
| category | string | optional | Default "". |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/opportunities' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"title": "str",
"description": "str",
"category": "str",
"skills": [
"...",
"...x2"
],
"company_name": "str",
"contact_email": "str",
"location": "null",
"budget_min": "float",
"budget_max": "float",
"currency": "str",
"duration": "str",
"status": "str",
"is_platform": "bool",
"posted_by": "str",
"applications_count": "int",
"created_at": "str",
"my_application": "null"
},
"...x2"
],
"categories": [
"str",
"...x10"
]
}POST/api/v1/salesshift/opportunitiesNot exercised herePost an opportunity to the shared board.
Request body (required) — OpportunityIn
| Field | Type | Required | Notes |
|---|---|---|---|
| title | string | required | ≤ 300 chars. |
| description | string | required | |
| category | string | optional | Default "Other". |
| skills | string[] | optional | Default []. |
| company_name | string | optional | Default "". |
| contact_email | string | optional | Default "". |
| location | string | optional | Default "". |
| budget_min | number? | optional | |
| budget_max | number? | optional | |
| duration | string | optional | Default "". |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/opportunities' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "title": "<string>", "description": "<string>", "category": "Other", "skills": [], "company_name": "", "contact_email": "", "location": "", "budget_min": 0, "budget_max": 0, "duration": "" }'Response · 201
{
"data": "…",
"success": "…"
}POST/api/v1/salesshift/opportunities/{opportunity_id}/applyNot exercised hereApply to an open opportunity.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| opportunity_id | string(uuid) | required |
Request body (required) — ApplyIn
| Field | Type | Required | Notes |
|---|---|---|---|
| message | string | required | |
| proposed_rate | string | optional | Default "". |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/opportunities/{opportunity_id}/apply' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "message": "<string>", "proposed_rate": "" }'Response · 200
{
"email_sent": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Opportunity not found or closed |
| 409 | Already applied to this opportunity |
POST/api/v1/salesshift/opportunities/{opportunity_id}/convertNot exercised hereOpportunity → lead (contact) → contract (deal) in the default pipeline.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| opportunity_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/opportunities/{opportunity_id}/convert' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"already_converted": "…",
"contact_id": "…",
"deal_id": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Opportunity not found |
| 400 | No pipeline yet — open Contracts once first |
| 400 | Pipeline has no stages |
GET/api/v1/salesshift/pipelinesCalled liveThe organization's deal pipelines and their stages, seeding a default pipeline on first use.
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/pipelines' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"organization_id": "str",
"name": "str",
"is_default": "bool",
"is_active": "bool",
"stages": [
"...",
"...x6"
]
},
"...x1"
]
}