Skip to content
SoundSyncAudio software platform

API reference

Partner Hub Management API

Manage reseller relationships, product assignments, serial inventory and conversations with developer workspace authentication.

Choose the correct partner surface

These are first-party developer workspace operations authenticated with an account Bearer token. They require partners.view and all-products scope; writes additionally require partners.manage. Serial-pool export also requires partners.manage. An external reseller must use its approved partner integration, not a developer account token.

Relationship discovery, requests, decisions, assignments, serial pools and conversations are separate from external order fulfillment and money movement. A saved commercial term or serial allocation does not prove a sale, collected payment, tax remittance or payout. SoundSync covers processing costs on SoundSync-managed checkout, not an external reseller sale.

Request a relationship, then assign products

Read the reseller directory and existing relationships before requesting one with partnerId. An existing relationship can be returned rather than duplicated. Accept or deny only an eligible request. Pausing/resuming a relationship is not the same as deleting products or refunding customer orders.

Product assignment uses a catalog product ID; later PATCH/DELETE uses the assignment record ID. Review supported SKUs, commercial terms and basis-point shares before saving. Assignment does not grant every product in the workspace. Allocate serial inventory only after checking the active relationship, product eligibility and supported pool rules; reconcile an uncertain allocation before retrying.

Keep conversations and serial exports private

Start a thread with subject and body/message; reply using the thread ID within the same relationship. Message responses return a thread or message wrapper. Thread message pages report has_more, limit and offset. Never include customer passwords, tokens or full serials in messages.

Serial-pool export returns a private CSV attachment containing usable keys. Keep it out of screenshots, public links and logs. Allocation is inventory, not evidence that each key was sold or redeemed.

SoundSync

Retired Partner Hub fulfillment writes

Developer workspace pathCurrent result
POST /api/developer/partners/{relationshipId}/orders410 PARTNER_FULFILLMENT_DISABLED; authorized historical GET reads remain separate.
POST /api/developer/partners/resellers/{relationshipId}/orders410 PARTNER_FULFILLMENT_DISABLED; not the external partner order API.
POST /api/developer/partners/resellers/{relationshipId}/api-keys and /api-keys/{keyId}/rotate or /revoke410 PARTNER_FULFILLMENT_DISABLED on these legacy workspace writes; not a claim that all partner integrations are disabled.
POST /api/developer/partners/resellers/{relationshipId}/statements/generate and PATCH /statements/{statementId}410 PARTNER_FULFILLMENT_DISABLED; historical reports are not payout execution.

SoundSync

External integrations and payout reporting

Partner API

Approved external partner requests and credentials.

WooCommerce

Connection, mapping, orders and serial reconciliation.

Recipient programs

Affiliates, collaborators, attribution and balances.

SoundSync

Requests and responses

GET /api/developer/partners/directory/resellers

Browse the eligible reseller directory

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: resellers.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "resellers": {
      "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/developer/partners/resellers

List developer reseller relationships

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: relationships.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
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/developer/partners/{relationshipId}

Read an owned reseller relationship

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: relationship.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
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."
    }
  },
  "additionalProperties": true
}

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

POST /api/developer/partners/requests

Request a developer-reseller relationship

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • partnerId: integer
  • partner_id: integer
  • message: string
  • reason: string
  • note: string
Returns
HTTP 201: relationship.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. Creates a relationship request, not approval or permission to sell every product.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "partnerId": {
      "type": "integer",
      "minimum": 1
    },
    "partner_id": {
      "type": "integer",
      "minimum": 1
    },
    "message": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true,
  "anyOf": [
    {
      "required": [
        "partnerId"
      ]
    },
    {
      "required": [
        "partner_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.

POST /api/developer/partners/resellers/{relationshipId}/accept

Accept an eligible reseller request

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • reason: string
Returns
HTTP 200: relationship.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. The current request side and status must allow this decision. Re-read state after a conflict.
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/developer/partners/resellers/{relationshipId}/deny

Deny a reseller request

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • reason: string
Returns
HTTP 200: relationship.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. The current request side and status must allow this decision. Re-read state after a conflict.
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/developer/partners/{relationshipId}/pause

Set the relationship to paused

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Returns
HTTP 200: relationship.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply.
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."
    }
  },
  "additionalProperties": true
}

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

POST /api/developer/partners/{relationshipId}/resume

Set the relationship to active

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Returns
HTTP 200: relationship.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply.
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."
    }
  },
  "additionalProperties": true
}

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

GET /api/developer/partners/{relationshipId}/products

List assigned relationship products

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: products.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
Request, response and error reference

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.

POST /api/developer/partners/{relationshipId}/products/assign

Assign or approve an owned product for this relationship

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • productId: integer
  • product_id: integer
  • status: string
  • resellerSku: string
  • reseller_sku: string
  • resellerProductName: string
  • commercialModel: string
  • commissionRateBps: integer
  • developerRevenueShareBps: integer
  • currency: string
  • minimumAdvertisedPriceCents: integer
  • licenseCap: integer
  • monthlyLicenseCap: integer
  • apiEnabled: boolean
  • manualIssueEnabled: boolean
  • staticExportEnabled: boolean
  • metadata: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 201: product.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. Supported snake-case commercial fields are also accepted. Commission/share fields are basis points. This saves an assignment; it does not create a sale, license claim or payout. Review commercial terms before saving.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "productId": {
      "type": "integer",
      "minimum": 1
    },
    "product_id": {
      "type": "integer",
      "minimum": 1
    },
    "status": {
      "type": "string"
    },
    "resellerSku": {
      "type": "string"
    },
    "reseller_sku": {
      "type": "string"
    },
    "resellerProductName": {
      "type": "string"
    },
    "commercialModel": {
      "type": "string"
    },
    "commissionRateBps": {
      "type": "integer"
    },
    "developerRevenueShareBps": {
      "type": "integer"
    },
    "currency": {
      "type": "string"
    },
    "minimumAdvertisedPriceCents": {
      "type": "integer"
    },
    "licenseCap": {
      "type": "integer"
    },
    "monthlyLicenseCap": {
      "type": "integer"
    },
    "apiEnabled": {
      "type": "boolean"
    },
    "manualIssueEnabled": {
      "type": "boolean"
    },
    "staticExportEnabled": {
      "type": "boolean"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true,
  "anyOf": [
    {
      "required": [
        "productId"
      ]
    },
    {
      "required": [
        "product_id"
      ]
    }
  ]
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "product": {
      "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.

PATCH /api/developer/partners/{relationshipId}/products/{assignmentId}

Update the saved product assignment

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • productId: integer
  • product_id: integer
  • status: string
  • resellerSku: string
  • reseller_sku: string
  • resellerProductName: string
  • commercialModel: string
  • commissionRateBps: integer
  • developerRevenueShareBps: integer
  • currency: string
  • minimumAdvertisedPriceCents: integer
  • licenseCap: integer
  • monthlyLicenseCap: integer
  • apiEnabled: boolean
  • manualIssueEnabled: boolean
  • staticExportEnabled: boolean
  • metadata: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 200: product.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. assignmentId is the relationship-product record, not the catalog product ID. Omitted saved fields are retained; reload the assignment before editing commercial terms.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "productId": {
      "type": "integer",
      "minimum": 1
    },
    "product_id": {
      "type": "integer",
      "minimum": 1
    },
    "status": {
      "type": "string"
    },
    "resellerSku": {
      "type": "string"
    },
    "reseller_sku": {
      "type": "string"
    },
    "resellerProductName": {
      "type": "string"
    },
    "commercialModel": {
      "type": "string"
    },
    "commissionRateBps": {
      "type": "integer"
    },
    "developerRevenueShareBps": {
      "type": "integer"
    },
    "currency": {
      "type": "string"
    },
    "minimumAdvertisedPriceCents": {
      "type": "integer"
    },
    "licenseCap": {
      "type": "integer"
    },
    "monthlyLicenseCap": {
      "type": "integer"
    },
    "apiEnabled": {
      "type": "boolean"
    },
    "manualIssueEnabled": {
      "type": "boolean"
    },
    "staticExportEnabled": {
      "type": "boolean"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "product": {
      "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.

DELETE /api/developer/partners/{relationshipId}/products/{assignmentId}

Remove the supported product assignment

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Returns
HTTP 200: product.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. Does not issue a refund or erase customer payment history.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "product": {
      "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/developer/partners/{relationshipId}/serials

Read relationship serial inventory

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: serials.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serials": {
      "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/developer/partners/{relationshipId}/serials/allocate

Allocate product serial inventory

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • productId: integer
  • product_id: integer
  • relationshipProductId: integer
  • quantity: integer
  • batchLabel: string
  • notes: string
  • fulfillmentMode: "generated_serials"
  • prefix: string
  • price: number
  • price_cents: integer
  • sale_price: number
  • sale_price_cents: integer
  • expiresAt: string,null
  • autoRevokeUnusedOnExpiry: boolean
  • promoStart: string,null
  • promoExpires: string,null
Returns
HTTP 201: pool, allocation, quantity, count, items_created, serials.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. The current generated-pool model requires productId/product_id and a regular price or price_cents estimate, including explicit 0 for a free product. quantity defaults to 1. Only generated_serials is supported; serial imports are rejected by this path. Product serial support and an active relationship are checked. The optional four-character prefix is letters/numbers. Expiry must be future-dated; automatic unused-serial removal requires an expiry. Supported snake-case aliases are accepted. This allocates inventory, not proof of a reported sale or payment. No blanket idempotency guarantee; reconcile an uncertain allocation before retrying.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "productId": {
      "type": "integer",
      "minimum": 1
    },
    "product_id": {
      "type": "integer",
      "minimum": 1
    },
    "relationshipProductId": {
      "type": "integer",
      "minimum": 1
    },
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "batchLabel": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "fulfillmentMode": {
      "const": "generated_serials"
    },
    "prefix": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{4}$"
    },
    "price": {
      "type": "number"
    },
    "price_cents": {
      "type": "integer"
    },
    "sale_price": {
      "type": "number"
    },
    "sale_price_cents": {
      "type": "integer"
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "autoRevokeUnusedOnExpiry": {
      "type": "boolean"
    },
    "promoStart": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "promoExpires": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "pool": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "allocation": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    },
    "quantity": {
      "type": "integer"
    },
    "count": {
      "type": "integer"
    },
    "items_created": {
      "type": "integer"
    },
    "serials": {
      "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/developer/partners/{relationshipId}/serials/{poolId}/export

Download allocated serials as private CSV

Auth
Account Bearer JWT
Scope
partners.view + partners.manage and all-products workspace scope.
Returns
HTTP 200: text/csv.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply. This read additionally requires partners.manage because the CSV contains usable serials. Preserve the private attachment; never expose it in public logs or documentation.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

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

GET /api/developer/partners/{relationshipId}/conversations

Read relationship conversation threads

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Returns
HTTP 200: conversations.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
Request, response and error reference

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.

POST /api/developer/partners/{relationshipId}/conversations

Start a relationship conversation

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • body: string
  • message: string
  • attachments: array
  • internal_note: boolean
  • subject: string (required)
  • threadType: string
  • linkedProductId: integer
  • linkedExternalOrderId: integer
Returns
HTTP 201: thread, message.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply. A subject and non-empty body/message are required. Do not put customer credentials or full serials into messages.
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."
      }
    },
    "internal_note": {
      "type": "boolean"
    },
    "subject": {
      "type": "string"
    },
    "threadType": {
      "type": "string"
    },
    "linkedProductId": {
      "type": "integer",
      "minimum": 1
    },
    "linkedExternalOrderId": {
      "type": "integer",
      "minimum": 1
    }
  },
  "required": [
    "subject"
  ],
  "additionalProperties": true,
  "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.

GET /api/developer/partners/resellers/{relationshipId}/conversations/{threadId}/messages

Read messages in an owned relationship thread

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Request fields
  • query limit: integer
  • query offset: integer
Returns
HTTP 200: thread, messages, has_more, limit, offset.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply. The thread must belong to this relationship. Message pages are returned in chronological display order.
Request, response and error reference

Query and header parameters

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

No request body fields are read by this operation.

HTTP 200 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."
    },
    "messages": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "has_more": {
      "type": "boolean"
    },
    "limit": {
      "type": "integer"
    },
    "offset": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

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

POST /api/developer/partners/resellers/{relationshipId}/conversations/{threadId}/messages

Reply to an owned relationship thread

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope. Writes additionally require partners.manage.
Request fields
  • body: string
  • message: string
  • attachments: array
  • internal_note: boolean
Returns
HTTP 201: message.
Notes
partners.view and all-products workspace scope. Writes additionally require partners.manage. Relationship and product ownership checks still apply.
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."
      }
    },
    "internal_note": {
      "type": "boolean"
    }
  },
  "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/developer/partners/{relationshipId}/activity

Read the relationship activity history

Auth
Account Bearer JWT
Scope
partners.view and all-products workspace scope.
Request fields
  • query limit: integer
  • query offset: integer
Returns
HTTP 200: activity.
Notes
partners.view and all-products workspace scope. Relationship and product ownership checks still apply.
Request, response and error reference

Query and header parameters

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

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "activity": {
      "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.