Hootsuite · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Hootsuite REST API

7 actions 7 updates update extends openapi/hootsuite-rest-api-openapi.yml
Generated by API Evangelist Written by API Evangelist tooling for Hootsuite's API. It is a proposal applied on top of the contract, not a document Hootsuite publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-agent-notex-api-evangelistx-conventionsx-artifactsx-agent-warningx-consequencex-reversiblex-standard

Targets 5

$.info
$.paths['/v1/messages'].post
$.paths['/v1/media'].post
$.paths['/v1/socialProfiles'].get
$.tags[?(@.name=='SCIM 2.0')]

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Hootsuite REST API
  version: 1.0.0
x-provenance:
  generated: '2026-08-13'
  method: generated
  source: openapi/hootsuite-rest-api-openapi.yml
  note: Captures API Evangelist enhancements only. The underlying OpenAPI is never mutated - apply this
    overlay to reproduce our annotated view.
extends: openapi/hootsuite-rest-api-openapi.yml
actions:
- target: $.info
  description: Record where this contract came from and that it is first-party.
  update:
    x-api-evangelist:
      provider: Hootsuite
      provider-slug: hootsuite
      source: https://apidocs.hootsuite.com/docs/api/swagger.yaml
      discovered: '2026-08-13'
      catalog: https://apis.io/hootsuite
- target: $.info
  description: Attach the cross-cutting runtime semantics an agent needs and the spec does not state.
  update:
    x-conventions:
      authentication: 'OAuth 2.0 authorization code with refresh tokens, or the custom member_app /
        organization_app grants. Client credentials MUST go in an HTTP Basic header - Hootsuite does
        not accept them in the request body. Authorization codes are single-use and expire in 10 minutes;
        reusing one revokes every token issued from it. Refresh tokens never expire but are single-use.
        Discovery: https://platform.hootsuite.com/.well-known/oauth-authorization-server. See authentication/hootsuite-authentication.yml.'
      authorization: OAuth scope is not the authorization model. Only two scopes exist (offline, analytics:read);
        the real decision is the caller's Hootsuite dashboard role. A correctly scoped call can still
        403 with codes 4002-4010. See scopes/hootsuite-scopes.yml and https://developer.hootsuite.com/docs/api-permissions-matrix.
      errors: 'Errors use Hootsuite''s own envelope, not RFC 9457 problem+json: {"errors":[{"code":1234,"message":"...","id":"...","resource":{"type":"...","id":"..."}}]}.
        A partially-failed request returns BOTH data and errors in one 200 response - never treat a
        200 with a populated errors[] as clean. 97 numeric codes are catalogued in errors/hootsuite-problem-types.yml.
        OAuth endpoints return RFC 6749 bodies and SCIM endpoints return RFC 7644 bodies instead.'
      idempotency: NO IDEMPOTENCY. Hootsuite publishes no Idempotency-Key header and no replay-safe
        retry contract on any surface. A retried POST /v1/messages after a timeout can schedule the
        post twice. Before retrying a write, reconcile with GET /v1/messages and delete the duplicate
        with DELETE /v1/messages/{messageId} while it is still SCHEDULED. See conventions/hootsuite-conventions.yml.
      rate-limits: Hootsuite enforces 20 requests/second and a 100,000 call/day quota per account. Responses
        carry X-Account-Quota, X-Account-Quota-Used and X-Account-Rate-Limit-Requests-Remaining (reported
        per cluster node, so treat as a guide). Exhaustion returns HTTP 429 with error code 1003, 1004
        or 1043 and NO Retry-After header - back off until the end of the current one-second window.
        See rate-limits/hootsuite-rate-limits.yml.
      pagination: Cursor pagination only - no offset or page numbers. Cursors are opaque and returned
        in the response metadata block; echo them back verbatim. Invalid cursor format is error code
        3020.
      artifact: conventions/hootsuite-conventions.yml
- target: $.info
  description: Point at the API Evangelist artifacts derived from this specification.
  update:
    x-artifacts:
      conventions: conventions/hootsuite-conventions.yml
      errors: errors/hootsuite-problem-types.yml
      authentication: authentication/hootsuite-authentication.yml
      scopes: scopes/hootsuite-scopes.yml
      rate-limits: rate-limits/hootsuite-rate-limits.yml
      lifecycle: lifecycle/hootsuite-lifecycle.yml
      conformance: conformance/hootsuite-conformance.yml
      data-model: data-model/hootsuite-data-model.yml
      webhooks: asyncapi/hootsuite-webhooks.yml
      well-known: well-known/hootsuite-well-known.yml
      skills: skills/_index.yml
- target: $.paths['/v1/messages'].post
  description: Flag the platform write that has no idempotency protection and fans out.
  update:
    x-agent-warning: 'This is a real publish to live social networks. It is NOT idempotent and there
      is no Idempotency-Key. It also FANS OUT: socialProfileIds is an array and the response is an array
      of one Message per profile, each with its own id. Pinterest cannot be bundled with any other profile.
      Check SocialProfile.isReauthRequired before scheduling - a value of 1 means the network token
      has lapsed and the publish will fail.'
    x-consequence: write
    x-reversible: Only while state is SCHEDULED, via DELETE /v1/messages/{messageId}.
- target: $.paths['/v1/media'].post
  description: Document the two-step presigned upload the spec does not model.
  update:
    x-agent-note: Two-step upload. This call returns an Amazon S3 uploadUrl; the bytes are then PUT
      to that URL with Content-Type and Content-Length matching the values declared here. Only the first
      valid upload to a URL is kept. Hootsuite deletes uploaded media 90 days after it is used in a
      message.
- target: $.paths['/v1/socialProfiles'].get
  description: Surface the field that predicts publish failure.
  update:
    x-agent-note: isReauthRequired = 1 means the upstream network token has lapsed. Every publish to
      that profile will fail until a human reconnects it. Filter on it before scheduling.
- target: $.tags[?(@.name=='SCIM 2.0')]
  description: Record the standard this tag implements.
  update:
    x-standard: SCIM 2.0 (RFC 7643 / RFC 7644); errors follow RFC 7644 section 3.12.