Update One Partner Relationship
PATCH https://api.suger.cloud/org/{orgId}/prm/partner/{partnerId}
Update the editable fields of one partner relationship: the assigned partner manager, the relationship status, the partner types, and the profile fields under `info` (company details, cloud account identifiers, CRM account link, champion contact, relationship and engagement type, tier, portal template, commission plan, Slack channel). Every field is optional and merges independently — send only what changes; omitted fields keep their stored value. Set `partnerManager` to "__unassigned" to clear it. `partnerTier` must name a tier defined in this organization's partnership config, `engagementType` must be a standard engagement type, and `relationshipType` must be WE_ARE_SELLER, PARTNER_IS_SELLER or BOTH; any of them being unknown fails the request. A partner organization never sets `relationshipType`: with a seller on Fours it follows that seller's choice, flipped to the partner's side. When a partner organization sends it, it is ignored and the rest of the update still applies. Revenue, deal counts, recommendation scores and AI summaries are computed by Fours and cannot be set here. Use GetPrmPartnerDetail to read a partner's current values before updating.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
orgId | path | string | yes | Organization ID |
partnerId | path | string | yes | Partner ID |
Request Body
Required. Content-Type: application/json · Schema: PrmPartnerUpdate
PrmPartnerUpdate fields:
| Field | Type | Required | Description |
|---|---|---|---|
info | PrmPartnerUpdateInfo | no | |
partnerManager | string | no | PartnerManager is the assigned manager's identifier. Send "__unassigned" to clear it; omit to leave it unchanged. |
partnerTypes | array<string> | no | |
status | PartnershipStatus | no |
PrmPartnerUpdateInfo fields:
| Field | Type | Required | Description |
|---|---|---|---|
buyerIds | array<string> | no | BuyerIDs / SellerIDs are the partner's cloud account identifiers, edited from the partner profile's Cloud Account IDs card. |
channels | array<string> | no | |
crmAccountInfo | CrmAccountInfo | no | |
customCommissionPlanId | string | no | CustomCommissionPlanID assigns a custom commission plan to this partner. |
employees | string | no | |
engagementType | EngagementType | no | |
founded | string | no | |
location | string | no | |
name | string | no | |
partnerChampionContact | PartnerChampionContact | no | |
partnerTier | string | no | PartnerTier must reference a tier defined in this org's partnership config. |
partnerViewTemplateId | string | no | PartnerViewTemplateID assigns a partner-portal Overview template. |
relationshipType | RelationshipType | no | |
sellerIds | object | no | |
slackChannelId | string | no | |
slackChannelName | string | no |
CrmAccountInfo fields:
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | no | AccountID is the CRM account/company record ID. |
accountName | string | no | AccountName is the display name of the CRM account. |
provider | string | no | Provider identifies which CRM the account belongs to ("SALESFORCE" or "HUBSPOT"). |
PartnerChampionContact fields:
| Field | Type | Required | Description |
|---|---|---|---|
contactId | string | no | ContactID is the CRM contact record ID. |
email | string | no | Email is the contact's email address. |
name | string | no | Name is the contact's full name. |
title | string | no | Title is the contact's job title. |
Responses
200 — OK
Content-Type: application/json · Schema: Partnership
Partnership fields:
| Field | Type | Required | Description |
|---|---|---|---|
companyId | string | no | The partner's company ID from identity.buyer.company_id, used to group buyers across channels |
createTime | string | no | Creation timestamp |
domain | string | no | Lowercased email domain of the partner (the OTHER side of the relationship). Used for dedup/lookup when provisioning partnerships from inbound flows where the partner has no Fours org and no engagement_id pairing exists. |
globalCompanyId | string | no | FK to workload.global_company.id — links partnership to canonical company record for firmographic data |
id | string | no | ID of the ent. Unique partnership identifier (UUID) |
info | PartnershipInfo | no | |
lastActivityTime | string | no | Most recent activity timestamp (e.g., latest CPPO transaction), updated by sync job |
lastUpdateTime | string | no | Last update timestamp |
organizationId | string | no | The org that owns this partnership record (seller) |
partnerManager | string | no | Fours user ID of the internal partner manager/owner (FK to identity.user, ON DELETE SET NULL) |
partnerOrgId | string | no | The partner's own Fours org ID (nullable if partner is not a Fours org) |
partnerTypes | array<string> | no | Types of partner: RESELLER, SI (System Integrator), ISV, OTHER |
partnershipSince | string | no | When the partnership was established (e.g., first CPPO transaction date) |
status | PartnershipStatus | no |
PartnershipInfo fields:
| Field | Type | Required | Description |
|---|---|---|---|
aiOverview | PartnershipAiOverview | no | |
buyerIds | array<string> | no | BuyerIDs lists the Fours internal buyer IDs grouped under this partnership. Used by frontend to query CPPO offers via the existing offer API. |
channels | array<string> | no | Channels lists the cloud marketplaces this partner operates on (e.g., ["AWS", "AZURE"]). |
crmAccountInfo | CrmAccountInfo | no | |
crmPartnerChampion | PartnerChampionContact | no | |
crmPartnerManager | CrmPartnerManager | no | |
customCommissionPlanId | string | no | CustomCommissionPlanID points at one of the org's custom commission plans (partnership_config.info.customCommissionSettings[].id). Empty/unset means "use Standard Defaults". The share-cosell flow uses this to prepopulate Revenue Share fields per commission type at deal-create time. |
description | string | no | Description is a brief partner summary |
employees | string | no | Employees is the partner's employee count as a string, derived from enriched company info. |
engagementType | EngagementType | no | |
founded | string | no | Founded is the partner's founding year, derived from enriched company info. |
globalCompanyContactIds | array<string> | no | GlobalCompanyContactIds holds IDs of global_company_contact records linked to this partnership. Contacts are read from global_company_contact table using these IDs. |
location | string | no | Location is the partner's location (e.g., "Dover, Delaware"), derived from buyer company info. |
matchingAccounts | array<MatchingCrmAccount> | no | MatchingAccounts lists the CRM accounts whose domain matches the partner's managed accounts. Only populated for partnerships with SUGGESTED status. |
name | string | no | Name is the partner's display name, derived from the buyer with the most complete data. |
ourTier | PartnerTier | no | |
partnerBrand | PartnerBrand | no | |
partnerChampionContact | PartnerChampionContact | no | |
partnerTier | string | no | PartnerTier is the ID of the tier this partner is assigned in the owning org's ISV-defined tier hierarchy. References a PartnerTier.ID in the org's PartnershipConfigInfo.Tiers. Set to the default tier when the partnership is created. Empty means "fall back to the org's default tier" at read time (e.g. a tier was deleted). |
partnerViewTemplateId | string | no | PartnerViewTemplateID is the ID of the partner-portal Overview template (partnership_config.info.partnerViews.templates[].id) applied to THIS partner (design/partner-portal-customization). Empty/unset means "fall back to the org's Default Template" at render time. |
potentialRevenue | number | no | PotentialRevenue is the total opportunity amount from matching CRM accounts. Only populated for partnerships with SUGGESTED status. |
recommendationReason | string | no | RecommendationReason is an AI-generated human-readable explanation of why this partner is recommended. Only populated for partnerships with SUGGESTED status. |
recommendationScore | number | no | RecommendationScore is a normalized score (0.0–1.0) indicating how good a match this partner is for the ISV. Only populated for partnerships with SUGGESTED status. |
relationshipType | RelationshipType | no | |
revenueByChannel | object | no | RevenueByChannel is revenue broken down by cloud channel and YYYY-MM period. Example: {"AWS": {"2026-01": 50000}, "AZURE": {"2026-02": 30000}}. |
scoreBreakdown | RecommendationScoreBreakdown | no | |
sellerIds | object | no | SellerIDs maps cloud partner to the partner's cloud-specific account ID. AWS -> AWS Account ID (12-digit), AZURE -> Azure MPO Seller ID. Used by frontend to pre-populate the reseller account field when creating CPPOs. |
slackChannelId | string | no | SlackChannelID is the Slack channel this partner's broadcasts / co-sell activity post to. Empty/unset ⇒ no channel configured. |
slackChannelName | string | no | SlackChannelName caches the channel's display name (e.g. "partner-cloudsync-suger"). |
sugerCosellMetrics | PartnershipSugerCosellMetrics | no | |
suggestedRelationshipType | RelationshipType | no | |
totalDeals | integer | no | TotalDeals is the total count of CPPO-related offers for this partner. |
totalRevenue | number | no | TotalRevenue is the sum of disbursed CPPO-attributed revenue for this partner. |
upcomingRevenue | number | no | UpcomingRevenue is the total CommitAmount from active CPPO_OUT offers minus disbursed revenue. |
PartnershipAiOverview fields:
| Field | Type | Required | Description |
|---|---|---|---|
cloudTier | string | no | CloudTier is the partner's cloud marketplace tier level. |
description | string | no | Description is a brief AI-generated summary of the partner company. |
employeeRange | string | no | EmployeeRange is the approximate employee count range (e.g., "100-500"). |
error | string | no | Error holds the error message if generation failed. |
foundedYear | string | no | FoundedYear is the year the company was founded. |
headquarters | string | no | Headquarters is the company's headquarters location (e.g., "San Francisco, CA, USA"). |
keyProducts | array<string> | no | KeyProducts lists the partner's key products or services. |
knownCustomers | array<string> | no | KnownCustomers lists notable customers of the partner. |
lastScraped | string | no | LastScraped is the timestamp of the last AI overview generation (RFC3339). |
retryCount | integer | no | RetryCount is the number of consecutive failed generation attempts for this partnership. The daily Sync Partnerships workflow caps retries at 3 and only retries after a 14-day backoff (see). |
specializations | array<string> | no | Specializations lists the partner's technical specializations. |
status | string | no | Status indicates the generation result: empty for success, "failed" or "empty" on error. |
targetIndustries | array<string> | no | TargetIndustries lists the industries the partner focuses on. |
website | string | no | Website is the partner's website URL as reported by AI. |
CrmAccountInfo fields:
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | no | AccountID is the CRM account/company record ID. |
accountName | string | no | AccountName is the display name of the CRM account. |
provider | string | no | Provider identifies which CRM the account belongs to ("SALESFORCE" or "HUBSPOT"). |
PartnerChampionContact fields:
| Field | Type | Required | Description |
|---|---|---|---|
contactId | string | no | ContactID is the CRM contact record ID. |
email | string | no | Email is the contact's email address. |
name | string | no | Name is the contact's full name. |
title | string | no | Title is the contact's job title. |
CrmPartnerManager fields:
| Field | Type | Required | Description |
|---|---|---|---|
email | string | no | Email is the CRM user's email, lowercased. |
name | string | no | Name is the CRM user's full name. |
status | CrmPartnerManagerStatus | no |
MatchingCrmAccount fields:
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | no | AccountID is the CRM account record ID. |
accountName | string | no | AccountName is the display name of the CRM account. |
domain | string | no | Domain is the normalized domain of the CRM account's website. |
opportunityAmount | number | no | OpportunityAmount is the total opportunity revenue from this account. |
opportunityCount | integer | no | OpportunityCount is the number of opportunities on this account. |
PartnerTier fields:
| Field | Type | Required | Description |
|---|---|---|---|
benefits | string | no | Benefits is a freeform benefits line shown to partners. |
color | string | no | Color is the badge color as a hex string, e.g. "#d4a017". |
description | string | no | Description is shown to partners in the portal. |
id | string | no | ID is a stable identifier referenced by PartnershipInfo.PartnerTier. Assignments survive tier renames/recolors because they key on ID. |
name | string | no | Name is the display label, e.g. "Gold". |
PartnerBrand fields:
| Field | Type | Required | Description |
|---|---|---|---|
bannerTagline | string | no | |
coverStyle | string | no | |
logoFileKey | string | no | |
logoSignedUrl | string | no | |
primaryColor | string | no | |
secondaryColor | string | no |
RecommendationScoreBreakdown fields:
| Field | Type | Required | Description |
|---|---|---|---|
accountScores | array<AccountMatchScore> | no | AccountScores holds per-matched-account scoring details. |
isSugerUser | boolean | no | IsSugerUser is true if the partner is a Fours customer. |
matchCount | integer | no | MatchCount is the number of CRM accounts that matched. |
rawScore | number | no | RawScore is the unnormalized sum of account scores. |
sugerUserBonus | number | no | SugerUserBonus is the additive bonus for being a Fours user. |
totalIsvAccounts | integer | no | TotalISVAccounts is the total number of ISV CRM accounts (used for normalization). |
PartnershipSugerCosellMetrics fields:
| Field | Type | Required | Description |
|---|---|---|---|
activeDeals | integer | no | |
avgDealSize | number | no | |
dealsOverTime | array<PartnershipDealPeriod> | no | DealsOverTime holds quarterly deal counts for the Deals Over Time chart. |
lostDeals | integer | no | |
totalDealValue | number | no | |
totalDeals | integer | no | |
winRate | number | no | Percentage (0-100) |
wonDeals | integer | no |
AccountMatchScore fields:
| Field | Type | Required | Description |
|---|---|---|---|
accountName | string | no | AccountName is the CRM account name. |
baseConfidence | number | no | BaseConfidence is the managed account's confidence mapped to a float (HIGH=0.9, MEDIUM=0.6, LOW=0.3). |
domain | string | no | Domain is the matched domain. |
industryBonus | number | no | IndustryBonus is +0.05 if the CRM account industry matches the managed account industry. |
locationBonus | number | no | LocationBonus is +0.05 if the CRM account location overlaps with the managed account location. |
score | number | no | Score is the total score for this account match (base + bonuses, max 1.0). |
400 — Bad request error
Content-Type: application/json
Example
Generated from this operation's schema. Values are placeholders —
substitute your own ids, and set SUGER_TOKEN to a bearer token
from the OAuth client-credentials exchange.
Request
curl -X PATCH 'https://api.suger.cloud/org/{orgId}/prm/partner/{partnerId}' \
-H "Authorization: Bearer $SUGER_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"info": {
"buyerIds": [
"01H0000000000000000000"
],
"channels": [
"string"
],
"crmAccountInfo": {
"accountId": "01H0000000000000000000",
"accountName": "Acme Corp",
"provider": "string"
},
"customCommissionPlanId": "01H0000000000000000000",
"employees": "string",
"engagementType": "RESELLER",
"founded": "string",
"location": "string",
"name": "Acme Corp",
"partnerChampionContact": {
"contactId": "01H0000000000000000000",
"email": "buyer@example.com",
"name": "Acme Corp",
"title": "string"
},
"partnerTier": "string",
"partnerViewTemplateId": "01H0000000000000000000"
},
"partnerManager": "string",
"partnerTypes": [
"string"
],
"status": "ACTIVE"
}' Response — 200
{
"companyId": "01H0000000000000000000",
"createTime": "2026-01-31T12:00:00Z",
"domain": "string",
"globalCompanyId": "01H0000000000000000000",
"id": "01H0000000000000000000",
"info": {
"aiOverview": {
"cloudTier": "string",
"description": "string",
"employeeRange": "string",
"error": "string",
"foundedYear": "string",
"headquarters": "string",
"keyProducts": [
"string"
],
"knownCustomers": [
"string"
],
"lastScraped": "string",
"retryCount": 1,
"specializations": [
"string"
],
"status": "string"
},
"buyerIds": [
"01H0000000000000000000"
],
"channels": [
"string"
],
"crmAccountInfo": {
"accountId": "01H0000000000000000000",
"accountName": "Acme Corp",
"provider": "string"
},
"crmPartnerChampion": {
"contactId": "01H0000000000000000000",
"email": "buyer@example.com",
"name": "Acme Corp",
"title": "string"
},
"crmPartnerManager": {
"email": "buyer@example.com",
"name": "Acme Corp",
"status": "MATCHED"
},
"customCommissionPlanId": "01H0000000000000000000",
"description": "string",
"employees": "string",
"engagementType": "RESELLER",
"founded": "string",
"globalCompanyContactIds": [
"01H0000000000000000000"
]
},
"lastActivityTime": "2026-01-31T12:00:00Z",
"lastUpdateTime": "2026-01-31T12:00:00Z",
"organizationId": "01H0000000000000000000",
"partnerManager": "string",
"partnerOrgId": "01H0000000000000000000",
"partnerTypes": [
"string"
]
} Error — 400
"string" View as Markdown · API reference overview
Spotted something wrong or out of date on this page? Tell us and we'll correct it.