Skip to content
SoundSyncAudio software platform

API reference

Reseller Partner Portal API

Read reseller memberships and relationships, manage approved conversations and review external-sale records.

Sign in as the intended reseller account

These first-party /api/partner-portal calls use an account Bearer token, not a partner API key. me and invitation acceptance can be reached before membership exists. Other routes require eligible membership, and the services enforce active partner/relationship ownership for returned records and writes.

The reseller portal is separate from affiliate/collaborator program recipient routes. A program invitation does not grant reseller membership. Keep profile details, customer records, serials, key metadata, private connection links and conversations out of public logs or screenshots.

Relationship and profile decisions

Accept the private invitation as its intended signed-in recipient. Owner/admin members can submit a reseller profile for review, request a developer relationship and decide an eligible inbound request. Pending profile content does not automatically replace the approved public identity.

Read overview, directory, relationships and individual detail before taking an action. Historical order, license, campaign and statement lists remain reports; a reported external amount is not a funded managed-checkout balance or a completed payout.

Conversations and store connections have separate roles

Conversation writes allow eligible owner, admin, technical, support, accounting and marketing members. Starting a thread requires relationshipId, subject and body/message; replies use the thread ID and preserve partner ownership checks.

Store connection access is limited to active owner/admin/technical membership. Creating a connect link rotates private authorization state and can allow credential replacement; it is not a harmless read. The active relationship and connection state must allow it. Follow the WooCommerce guide before authorizing a store.

Fulfillment and webhook availability remain controlled

Manual issue and webhook creation/edit/deletion/test require the existing fulfillment availability setting and operation-specific member role. A disabled setting returns 410 PARTNER_FULFILLMENT_DISABLED; this reference does not enable it or promise general access. External partner API and WooCommerce approval are separate from developer-router retired writes.

An allowed manual issue can fulfill customer access under the external-order contract without collecting a SoundSync payment. An allowed portal webhook test queues a real outbound test; queue acceptance is not delivery, and this test is not a status-edit operation. Creating/rotating a webhook returns private signing material within webhook. Do not log it or bundle it in a plugin.

SoundSync

Use the right integration

Partner Hub Management API

Developer-side relationships and reporting.

External Partner API

API-key requests, order fields and idempotency.

WooCommerce

Store authorization, mapping and reconciliation.

Recipient programs

Affiliate and collaborator agreements and balances.

SoundSync

Requests and responses

GET /api/partner-portal/me

Read signed-in reseller memberships and configured API availability

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: user, memberships, partner_api_enabled, portal.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Available before a membership has been accepted. No membership or partner_api_enabled:false is not permission to bypass approval. Affiliate/collaborator program routes have their own recipient checks.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ]
        },
        "email": {
          "type": "string",
          "format": "email"
        },
        "role": {
          "type": "string"
        },
        "is_reseller": {
          "type": "boolean"
        }
      },
      "additionalProperties": true
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "partner_api_enabled": {
      "type": "boolean"
    },
    "portal": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/invitations/accept

Accept the intended reseller invitation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • token: string (required)
Returns
HTTP 200: partner_id, status.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Private token must match the signed-in intended recipient with verified email. An expired/used token returns 410. Acceptance does not guarantee owner approval, an active relationship or API credentials.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "token": {
      "type": "string"
    }
  },
  "required": [
    "token"
  ],
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "partner_id": {
      "type": "integer",
      "minimum": 1
    },
    "status": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 409, 410, 500, 503.

Operation errors: INVITATION_EXPIRED, INVITED_EMAIL_REQUIRED, EMAIL_VERIFICATION_REQUIRED, MEMBERSHIP_CONFLICT.

PATCH /api/partner-portal/profile/{partnerId}

Submit reseller profile details for review

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • name: string (required)
  • websiteUrl: string
  • summary: string
Returns
HTTP 200: partner, status.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Reseller owner/admin membership is required. Saves a pending profile for review rather than automatically replacing approved public identity.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 2,
      "maxLength": 160
    },
    "websiteUrl": {
      "type": "string"
    },
    "summary": {
      "type": "string",
      "maxLength": 1000
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "partner": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "status": {
      "const": "pending_review"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/overview

Read reseller overview and accessible relationships

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: portal, memberships, pending_approval, overview, relationships.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "portal": {
      "type": "string"
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "pending_approval": {
      "type": "boolean"
    },
    "overview": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "relationships": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/relationships

Read reseller relationships

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: relationships.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "relationships": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/directory/developers

Read developers available for relationship requests

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: developers.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "developers": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/requests

Request a relationship with a developer

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • developerId: integer
  • developer_id: integer
  • partnerId: integer
  • partner_id: integer
  • message: string
  • note: string
  • reason: string
Returns
HTTP 201: relationship.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires an active owner/admin reseller membership. developerId/developer_id is required; partnerId selects the authorized partner when needed. Reconcile an existing request instead of treating a repeated request as another approved relationship.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "developerId": {
      "type": "integer",
      "minimum": 1
    },
    "developer_id": {
      "type": "integer",
      "minimum": 1
    },
    "partnerId": {
      "type": "integer",
      "minimum": 1
    },
    "partner_id": {
      "type": "integer",
      "minimum": 1
    },
    "message": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "additionalProperties": true,
  "anyOf": [
    {
      "required": [
        "developerId"
      ]
    },
    {
      "required": [
        "developer_id"
      ]
    }
  ]
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "relationship": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/relationships/{relationshipId}

Read one accessible relationship and its related records

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: relationship, products, recent_orders, licenses, api_keys, conversations, statements.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "relationship": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "recent_orders": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "licenses": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "api_keys": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "conversations": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "statements": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/relationships/{relationshipId}/accept

Accept an eligible relationship request

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • reason: string
Returns
HTTP 200: relationship.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires eligible owner/admin membership, the correct request side and a supported current state.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "relationship": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/relationships/{relationshipId}/deny

Deny a relationship request

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • reason: string
Returns
HTTP 200: relationship.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires eligible owner/admin membership, the correct request side and a supported current state.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "relationship": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/products

Read reseller products

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: products.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/campaigns

Read reseller campaigns

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: campaigns.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "campaigns": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/api-keys

Read reseller api-keys

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: api_keys.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "api_keys": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/webhooks

Read reseller webhooks

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: webhooks.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "webhooks": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/orders

Read reseller orders

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
  • query limit: integer
Returns
HTTP 200: orders.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "orders": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/licenses

Read reseller licenses

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
  • query limit: integer
Returns
HTTP 200: licenses.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "licenses": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/conversations

Read reseller conversations

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: conversations.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "conversations": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/statements

Read reseller statements

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query relationshipId: integer
Returns
HTTP 200: statements.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Returns only member-accessible partner records. Historical customer identity, serials, commercial terms and conversations are private. Lists do not execute a payout, authorize a download or grant product ownership.
Request, response and error reference

Query and header parameters

[
  {
    "name": "relationshipId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "statements": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/conversations

Start a conversation with the related developer

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • relationshipId: integer
  • relationship_id: integer
  • subject: string (required)
  • body: string
  • message: string
  • threadType: string
  • linkedProductId: integer
  • linkedExternalOrderId: integer
  • attachments: array
Returns
HTTP 201: thread, message.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Eligible active owner/admin/technical/support/accounting/marketing membership is required for conversation writes. Never attach customer credentials or unnecessary personal records.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "relationshipId": {
      "type": "integer",
      "minimum": 1
    },
    "relationship_id": {
      "type": "integer",
      "minimum": 1
    },
    "subject": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "threadType": {
      "type": "string"
    },
    "linkedProductId": {
      "type": "integer",
      "minimum": 1
    },
    "linkedExternalOrderId": {
      "type": "integer",
      "minimum": 1
    },
    "attachments": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true,
  "required": [
    "subject"
  ],
  "allOf": [
    {
      "anyOf": [
        {
          "required": [
            "relationshipId"
          ]
        },
        {
          "required": [
            "relationship_id"
          ]
        }
      ]
    },
    {
      "anyOf": [
        {
          "required": [
            "body"
          ]
        },
        {
          "required": [
            "message"
          ]
        }
      ]
    }
  ]
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "thread": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "message": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/conversations/{threadId}/messages

Reply to an accessible conversation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • body: string
  • message: string
  • attachments: array
Returns
HTTP 201: message.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Uses the same conversation-write role check; a thread ID cannot expand partner access.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "body": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "attachments": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true,
  "anyOf": [
    {
      "required": [
        "body"
      ]
    },
    {
      "required": [
        "message"
      ]
    }
  ]
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "message": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/stores

Read authorized WooCommerce store connections

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: connections.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires active owner/admin/technical membership for the returned store connections.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "connections": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/stores/{connectionId}/connect-link

Rotate the private store authorization link

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: connection.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires eligible store access, an active relationship and a connectable state. Rotates authorization state and may authorize credential replacement. The returned connection contains a private connect link; do not log, publish or poll it.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "connection": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

GET /api/partner-portal/relationships/{relationshipId}/webhook-events

Read partner webhook events and delivery attempts

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • query limit: integer
Returns
HTTP 200: events, deliveries.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request, response and error reference

Query and header parameters

[
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "deliveries": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500, 503.

POST /api/partner-portal/relationships/{relationshipId}/webhooks

Manage the gated relationship webhook operation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • url: string (required)
  • events: array
  • status: active | paused | disabled
  • description: string
  • rotateSecret: boolean
Returns
HTTP 201: webhook.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires fulfillment availability plus active owner/admin/technical membership. A disabled launch gate returns 410 PARTNER_FULFILLMENT_DISABLED before mutation. Creation requires a public HTTPS url; omitted events defaults to order.fulfilled, order.refunded, license.revoked and webhook.test. Creation or explicit rotateSecret/rotate_secret returns private signing material inside webhook, not a top-level secret. Test queues a synthetic event; accepted is not delivered and this portal test is not a status-edit operation.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "order.fulfilled",
          "order.refunded",
          "license.revoked",
          "relationship.requested",
          "relationship.updated",
          "webhook.test"
        ]
      }
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "paused",
        "disabled"
      ]
    },
    "description": {
      "type": "string"
    },
    "rotateSecret": {
      "type": "boolean"
    }
  },
  "additionalProperties": true,
  "required": [
    "url"
  ]
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "webhook": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 410, 500, 503.

Operation errors: PARTNER_FULFILLMENT_DISABLED.

PATCH /api/partner-portal/relationships/{relationshipId}/webhooks/{webhookId}

Manage the gated relationship webhook operation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • url: string
  • events: array
  • status: active | paused | disabled
  • description: string
  • rotateSecret: boolean
Returns
HTTP 200: webhook.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires fulfillment availability plus active owner/admin/technical membership. A disabled launch gate returns 410 PARTNER_FULFILLMENT_DISABLED before mutation. Creation requires a public HTTPS url; omitted events defaults to order.fulfilled, order.refunded, license.revoked and webhook.test. Creation or explicit rotateSecret/rotate_secret returns private signing material inside webhook, not a top-level secret. Test queues a synthetic event; accepted is not delivered and this portal test is not a status-edit operation.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "order.fulfilled",
          "order.refunded",
          "license.revoked",
          "relationship.requested",
          "relationship.updated",
          "webhook.test"
        ]
      }
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "paused",
        "disabled"
      ]
    },
    "description": {
      "type": "string"
    },
    "rotateSecret": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "webhook": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 410, 500, 503.

Operation errors: PARTNER_FULFILLMENT_DISABLED.

DELETE /api/partner-portal/relationships/{relationshipId}/webhooks/{webhookId}

Manage the gated relationship webhook operation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Returns
HTTP 200: deleted, id.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires fulfillment availability plus active owner/admin/technical membership. A disabled launch gate returns 410 PARTNER_FULFILLMENT_DISABLED before mutation. Creation requires a public HTTPS url; omitted events defaults to order.fulfilled, order.refunded, license.revoked and webhook.test. Creation or explicit rotateSecret/rotate_secret returns private signing material inside webhook, not a top-level secret. Test queues a synthetic event; accepted is not delivered and this portal test is not a status-edit operation.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "deleted": {
      "type": "boolean"
    },
    "id": {
      "type": [
        "integer",
        "string"
      ]
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 410, 500, 503.

Operation errors: PARTNER_FULFILLMENT_DISABLED.

POST /api/partner-portal/relationships/{relationshipId}/webhooks/{webhookId}/test

Manage the gated relationship webhook operation

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • message: string
Returns
HTTP 200: success, event.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires fulfillment availability plus active owner/admin/technical membership. A disabled launch gate returns 410 PARTNER_FULFILLMENT_DISABLED before mutation. Creation requires a public HTTPS url; omitted events defaults to order.fulfilled, order.refunded, license.revoked and webhook.test. Creation or explicit rotateSecret/rotate_secret returns private signing material inside webhook, not a top-level secret. Test queues a synthetic event; accepted is not delivered and this portal test is not a status-edit operation.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "event": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 410, 500, 503.

Operation errors: PARTNER_FULFILLMENT_DISABLED.

POST /api/partner-portal/relationships/{relationshipId}/manual-issue

Issue fulfillment through the gated reseller portal

Auth
Account Bearer JWT
Scope
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface.
Request fields
  • header Idempotency-Key: string
  • external_order_id: string
  • externalOrderId: string
  • customer_email: string
  • customer_name: string
  • customer_country: string
  • external_order_url: string
  • currency: string
  • payment_status: paid | refunded | partially_refunded | chargeback | cancelled | unknown
  • purchased_at: string,null
  • total_paid_cents: integer
  • total_paid: number
  • subtotal_cents: integer
  • discount_total_cents: integer
  • tax_total_cents: integer
  • product_id: integer
  • reseller_sku: string
  • quantity: integer
  • items: array
  • idempotency_key: string
  • metadata: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 201: review the response schema below.
Notes
Signed-in account and eligible reseller membership; relationship and partner ownership apply. This is an account-session API, not the external partner API-key interface. Requires fulfillment availability, an active eligible relationship, manual_issue_enabled and owner/admin/technical/support membership. Disabled availability returns 410 PARTNER_FULFILLMENT_DISABLED. external_order_id/externalOrderId and at least one mapped product_id or reseller_sku are required; items supports multiple lines, otherwise the top-level product selection is used. The external order API defines the full accepted pricing, mapping, replay and fulfillment response contract. A missing Idempotency-Key is derived from the relationship and external order ID; do not change the order ID to retry. This can fulfill customer access, not charge a SoundSync-managed payment or absorb external processing fees.
Request, response and error reference

Query and header parameters

[
  {
    "name": "Idempotency-Key",
    "in": "header",
    "required": false,
    "schema": {
      "type": "string"
    }
  }
]

Request (application/json)

{
  "type": "object",
  "properties": {
    "external_order_id": {
      "type": "string"
    },
    "externalOrderId": {
      "type": "string"
    },
    "customer_email": {
      "type": "string",
      "format": "email"
    },
    "customer_name": {
      "type": "string"
    },
    "customer_country": {
      "type": "string"
    },
    "external_order_url": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "payment_status": {
      "type": "string",
      "enum": [
        "paid",
        "refunded",
        "partially_refunded",
        "chargeback",
        "cancelled",
        "unknown"
      ]
    },
    "purchased_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "total_paid_cents": {
      "type": "integer",
      "minimum": 0
    },
    "total_paid": {
      "type": "number"
    },
    "subtotal_cents": {
      "type": "integer"
    },
    "discount_total_cents": {
      "type": "integer"
    },
    "tax_total_cents": {
      "type": "integer"
    },
    "product_id": {
      "type": "integer",
      "minimum": 1
    },
    "reseller_sku": {
      "type": "string"
    },
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "reseller_sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer",
            "minimum": 1
          },
          "unit_reported_price_cents": {
            "type": "integer"
          },
          "line_total_cents": {
            "type": "integer"
          },
          "external_line_item_id": {
            "type": "string"
          },
          "external_product_id": {
            "type": "string"
          },
          "external_variation_id": {
            "type": "string"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
          }
        },
        "additionalProperties": true
      }
    },
    "idempotency_key": {
      "type": "string"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "additionalProperties": true,
  "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
}

Documented failures: 400, 401, 403, 404, 409, 410, 500, 503.

Operation errors: PARTNER_FULFILLMENT_DISABLED.