ProtectedapiGet the API base URL for the platform
ProtectedbufferCommon params shared by all Buffer actions.
ProtectedcommonCommon parameters for all social media actions
ProtectedoauthOAuth-specific parameters that all OAuth actions should include
ProtectedplatformGet the platform name (e.g., 'Twitter', 'LinkedIn')
ProtectedbuildBuild a standardized error result from a caught exception.
ProtectedbuildBuild common API headers including authentication
OptionaladditionalHeaders: Record<string, string>ProtectedcreateCreate a post via the createPost mutation.
metadata is Buffer's per-service extras channel, keyed by service name — e.g.
{ linkedin: { annotations: [...] } } for
ProtecteddeleteDelete a post via the deletePost mutation.
ProtectedensureValidate CompanyIntegrationID and initialize OAuth.
Pass the full RunActionParams so the per-request provider on params.Provider is
threaded into initializeOAuth (multi-tenant correctness — every entity load/save
inside the OAuth flow binds to the request's connection, not the global default).
CompanyIntegrationID stays required even when CredentialID is given: it is what
identifies which Buffer integration this is, and the org/channel context still
comes from it. CredentialID only changes whose token the calls are made with.
Returns null on success, or an error result.
ProtectedexecuteExecute a GraphQL query or mutation against the Buffer API.
Optionalvariables: Record<string, unknown>ProtectedextractProtectedfetchFetch all channels for an organization.
ProtectedfetchFetch posts with optional filters and cursor-based pagination.
Optionalfilters: {Optionalfirst: numberOptionalafter: stringProtectedformatFormat date for API requests (ISO 8601)
ProtectedgetThe token every Buffer call is made with: the CredentialID token when one was
supplied, otherwise the CompanyIntegration's own.
ProtectedgetGet custom attributes from company integration
ProtectedgetHelper to get parameter value from params array
ProtectedgetGet profile ID from parameters or default from integration
ProtectedgetGet the refresh token
ProtectedgroupGroup posts by day using a date accessor.
ProtectedhandleProtectedhandleHandle rate limiting with exponential backoff
OptionalretryAfter: numberProtectedinitializeInitialize OAuth connection by loading integration details.
the MJ Company Integration ID to load
Optionalparams: RunActionParamsthe running action's params; params.Provider is captured so all
subsequent entity loads/saves bind to the per-request provider (multi-tenant
correctness). When omitted, falls back to the global default Metadata provider.
ProtectedInternalInternal method that must be implemented by derived action classes. This is where the actual action logic should be implemented.
The action execution parameters including typed context
Promise resolving to the action result
ProtectedisDetermine if an error is an authentication error. Can be overridden by subclasses for platform-specific error detection.
ProtectedisCheck if the current token is expired
ProtectedlogLog API request for debugging
Optionaldata: anyProtectedlogLog API response for debugging
ProtectedmakeProtectedmapProtectednormalizeNormalize platform-specific analytics to common format
ProtectednormalizeConvert platform-specific post data to common format
ProtectedparseParse date from API response
ProtectedparseParse rate limit headers from API response
ProtectedrefreshRefresh the access token using the refresh token. Must be implemented by platform-specific subclasses.
ProtectedresolveLoad an access token out of an MJ: Credentials row.
This is the seam for acting as an identity other than the tenant's own Buffer connection — publishing to an employee's personal channel, reading the queue of the person who owns it. The token stays in the credential store; only its ID travels through action params.
A CredentialID that was supplied but cannot be read is fatal, never a
silent fallback to the CompanyIntegration token: falling back would publish
under the wrong identity, and the caller would have no way to notice.
Returns the token, or an error result to hand straight back to the caller.
ProtectedresolveResolve org ID from params or by fetching the account's first org.
Executes the action with the provided parameters.
The action execution parameters including context
Promise resolving to the action result
ProtectedsearchSearch for posts on the platform
ProtectedsetSet custom attributes in company integration
ProtectedsetSet an output parameter value by name.
ProtectedupdateUpdate stored tokens after refresh
OptionalrefreshToken: stringOptionalexpiresIn: numberProtecteduploadProtecteduploadProtectedvalidate
Creates a new post in Buffer via the GraphQL createPost mutation.
The new API accepts one channelId per mutation call. To post to multiple channels, pass an array of ChannelIDs and a separate createPost call is made for each.
Two params exist for posting on someone else's behalf.
CredentialID(on every Buffer action) makes the calls with a token from anMJ: Credentialsrow instead of the tenant's own connection, which is what publishing to an employee's personal channel requires.PlatformMetadatapasses Buffer's per-service extras through —{ "linkedin": { "annotations": [...] } }is how anMention
survives the trip, and without it the post publishes as plain text with the mention spelled out.