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
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
/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.
