The Chatter API provides access to Salesforce Chatter REST API endpoints for social collaboration features including feeds, posts, comments, and groups.
Overview
The Chatter API supports:
- Making custom requests to Chatter endpoints
- CRUD operations on Chatter resources
- Batch requests for multiple operations
- Streaming responses
Accessing the Chatter API
const conn = new jsforce.Connection({ /* ... */ });
const chatter = conn.chatter;
Methods
request()
Make a custom request to a Chatter API endpoint.
request
ChatterRequestParams
required
Request configurationHTTP method (GET, POST, PUT, PATCH, DELETE)
Chatter endpoint URL (e.g., /feeds/news/me/feed-elements)
Request body (automatically JSON-stringified if object)
A Request object that can be executed or batched
// GET request
const feedRequest = conn.chatter.request({
method: 'GET',
url: '/feeds/news/me/feed-elements'
});
const feed = await feedRequest;
console.log('Feed items:', feed.elements);
// POST request
const postRequest = conn.chatter.request({
method: 'POST',
url: '/feed-elements',
body: {
feedElementType: 'FeedItem',
subjectId: 'me',
body: {
messageSegments: [
{
type: 'Text',
text: 'Hello from JSForce!'
}
]
}
}
});
const post = await postRequest;
console.log('Created post:', post.id);
resource()
Create a Resource object for CRUD operations on a Chatter resource.
Query parameters to append to the URL
A Resource object with CRUD methods
const userResource = conn.chatter.resource('/users/me');
const user = await userResource.retrieve();
console.log('Current user:', user);
batch()
Execute multiple Chatter requests in a single batch operation.
Array of Request objects created via chatter.request()
Batch response containing results for all requestsWhether any request failed
Array of individual request results
const req1 = conn.chatter.request({
method: 'GET',
url: '/users/me'
});
const req2 = conn.chatter.request({
method: 'GET',
url: '/feeds/news/me/feed-elements'
});
const req3 = conn.chatter.request({
method: 'POST',
url: '/feed-elements',
body: {
feedElementType: 'FeedItem',
subjectId: 'me',
body: {
messageSegments: [{ type: 'Text', text: 'Batch post!' }]
}
}
});
const batchResponse = await conn.chatter.batch([req1, req2, req3]);
console.log('Batch results:', batchResponse.results);
// Individual requests are also resolved
const user = await req1;
const feed = await req2;
const post = await req3;
Resource Methods
The Resource class provides standard CRUD operations:
create()
Create a new resource.
const groupResource = conn.chatter.resource('/chatter-groups');
const newGroup = await groupResource.create({
name: 'Engineering Team',
information: { text: 'Group for engineering discussions' }
});
retrieve()
Retrieve the resource.
const userResource = conn.chatter.resource('/users/005xx000001X8Uz');
const user = await userResource.retrieve();
console.log('User:', user.name);
update()
Update the resource.
const groupResource = conn.chatter.resource('/chatter-groups/0F9xx000000001A');
const updated = await groupResource.update({
information: { text: 'Updated description' }
});
destroy()
Delete the resource.
const feedElementResource = conn.chatter.resource('/feed-elements/0D5xx000000001A');
await feedElementResource.destroy();
console.log('Feed element deleted');
Aliases: delete(), del()
Request Methods
Request objects returned from chatter.request() have these methods:
promise()
Get a Promise for the request result.
const request = conn.chatter.request({
method: 'GET',
url: '/users/me'
});
const result = await request.promise();
stream()
Get a Node.js stream for the response.
const request = conn.chatter.request({
method: 'GET',
url: '/users/me/photo'
});
const photoStream = request.stream();
photoStream.pipe(fs.createWriteStream('profile.jpg'));
then()
Request objects are thenable (Promise-compatible).
const request = conn.chatter.request({
method: 'GET',
url: '/users/me'
});
// Can be used directly with await
const user = await request;
// Or with .then()
request.then(user => {
console.log('User:', user);
});
URL Normalization
The Chatter API automatically normalizes URLs:
// All of these are equivalent:
conn.chatter.request({ method: 'GET', url: '/feeds/news/me/feed-elements' });
conn.chatter.request({ method: 'GET', url: '/chatter/feeds/news/me/feed-elements' });
conn.chatter.request({ method: 'GET', url: '/services/data/v58.0/chatter/feeds/news/me/feed-elements' });
Common Use Cases
Post to Chatter Feed
const post = await conn.chatter.request({
method: 'POST',
url: '/feed-elements',
body: {
feedElementType: 'FeedItem',
subjectId: 'me', // or a record ID
body: {
messageSegments: [
{
type: 'Text',
text: 'Check out this opportunity: '
},
{
type: 'Mention',
id: '005xx000001X8Uz' // user ID
},
{
type: 'Text',
text: ' '
},
{
type: 'EntityLink',
reference: { id: '006xx000001X8Uz' } // opportunity ID
}
]
}
}
});
console.log('Posted:', post.id);
Get User Feed
const feedResource = conn.chatter.resource('/feeds/news/me/feed-elements', {
pageSize: 25
});
const feed = await feedResource.retrieve();
for (const element of feed.elements) {
console.log(`${element.actor.name}: ${element.body.text}`);
}
// Get next page
if (feed.nextPageUrl) {
const nextPage = conn.chatter.resource(feed.nextPageUrl);
const moreFeed = await nextPage.retrieve();
}
Like a Post
const like = await conn.chatter.request({
method: 'POST',
url: `/feed-elements/${feedElementId}/capabilities/chatter-likes/items`
});
const comment = await conn.chatter.request({
method: 'POST',
url: `/feed-elements/${feedElementId}/capabilities/comments/items`,
body: {
body: {
messageSegments: [
{ type: 'Text', text: 'Great post!' }
]
}
}
});
Get Group Members
const members = await conn.chatter.resource(`/chatter-groups/${groupId}/members`).retrieve();
console.log('Members:', members.members);
Complete Example
import jsforce from 'jsforce';
const conn = new jsforce.Connection({
instanceUrl: 'https://yourinstance.salesforce.com',
accessToken: 'your_access_token'
});
// Get current user
const user = await conn.chatter.resource('/users/me').retrieve();
console.log('Logged in as:', user.name);
// Post to feed
const post = await conn.chatter.request({
method: 'POST',
url: '/feed-elements',
body: {
feedElementType: 'FeedItem',
subjectId: 'me',
body: {
messageSegments: [
{ type: 'Text', text: 'Hello from JSForce!' }
]
}
}
});
console.log('Created post:', post.id);
// Get news feed with batch
const feedReq = conn.chatter.request({
method: 'GET',
url: '/feeds/news/me/feed-elements'
});
const groupsReq = conn.chatter.request({
method: 'GET',
url: '/users/me/groups'
});
const batchResult = await conn.chatter.batch([feedReq, groupsReq]);
console.log('Batch completed:', batchResult.hasErrors ? 'with errors' : 'successfully');
const feed = await feedReq;
const groups = await groupsReq;
console.log(`Found ${feed.elements.length} feed items`);
console.log(`Member of ${groups.groups.length} groups`);
TypeScript Support
import type { StreamingMessage, BatchResponse } from 'jsforce';
interface FeedElement {
id: string;
body: { text: string };
actor: { name: string };
}
const request = conn.chatter.request<FeedElement>({
method: 'GET',
url: '/feed-elements/0D5xx000000001A'
});
const element = await request;
console.log(element.actor.name); // TypeScript knows the shape