Need help with stream-php?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

129 Stars 37 Forks BSD 3-Clause "New" or "Revised" License 337 Commits 6 Opened issues


PHP Client - Build Activity Feeds & Streams with

Services available


Need anything else?

Contributors list


build Latest Stable Version

stream-php is the official PHP client for Stream, a web service for building scalable newsfeeds and activity streams.

Note that there is also a higher level Laravel integration which hooks into the Eloquent ORM.

You can sign up for a Stream account at



composer require get-stream/stream

Composer will install our latest version automatically.

PHP compatibility

Current releases require PHP

or higher, and depends on Guzzle version

If you need to use the client with an old PHP or earlier versions of Guzzle, you can grab an earlier version of this package, for example:

composer require get-stream/stream:"~2.1.0"

See the action for details of how it is built and tested against different PHP versions.


Our full documentation for this package is available at

Quick start

First, signup here for a free account and grab your API key and secret.

Initiating a Client and a Feed object:

// Instantiate a new client, find your API keys in the dashboard.
$client = new GetStream\Stream\Client('YOUR_API_KEY', 'YOUR_API_SECRET');

// Instantiate a feed object $userFeed = $client->feed('user', '1');

By default, the Client will target the GetStream REST API at
. If you want to change this for some reason you can set the
environment variable.

Activities in a feed:

// Create a new activity
$data = [
    'actor' => '1',
    'verb' => 'like',
    'object' => '3',
    'foreign_id' => 'like:42',

$response = $userFeed->addActivity($data);

// The response will include Stream's internal ID: // {"id": "e561...", "actor": "1", ...}

// Get the latest activities for this user's personal feed, based on who they are following. $response = $userFeed->getActivities();

// The response will be the json decoded API response. // {"duration": 45ms, "next": "/api/v1.0/feed/...", "results": [...]}

// Remove an activity by its ID $userFeed->removeActivity('e561de8f-00f1-11e4-b400-0cc47a024be0');

// To remove activities by their foreign_id, set the "foreign id" flag to true. $userFeed->removeActivity('like:42', true);

Following/follower relations of a feed:

// When user 1 starts following user 37's activities
$userFeed->follow('user', '37');

// When user 1 stops following user 37's activities $userFeed->unfollow('user', '37');

// Retrieve followers of a feed $userFeed->followers();

// Retrieve feeds followed by $userFeed $userFeed->following();

Advanced activity operations:

// Create a bit more complex activity with custom fields
$data = [
    'actor' => 1,
    'verb' => 'run',
    'object' => 1,
    'foreign_id' => 'run:42',

// Custom fields:
'course' => [
    'name'=> 'Golden Gate park',
    'distance'=> 10,
'participants' => ['Thierry', 'Tommaso'],
'started_at' => new DateTime('now', new DateTimeZone('Pacific/Nauru'),


// Add an activity and push it to other feeds too using the to field $data = [ 'actor' => '1', 'verb' => 'like', 'object' => '3', 'to' => [ 'user:44', 'user:45', ], ];


// Batch adding activities $activities = [ ['actor' => '1', 'verb' => 'tweet', 'object' => '1'], ['actor' => '2', 'verb' => 'like', 'object' => '3'], ];


// Delete an entire feed and its content $userFeed->delete();

Advanced batching:

// Batch operations (batch activity add, batch follow)
$batcher = $client->batcher();

// Add one activity to many feeds $activity = ['actor' => '1', 'verb' => 'tweet', 'object' => '1']; $feeds = ['user:1', 'user:2'];

$batcher->addToMany($activity, $feeds);

// Create many follow relations $follows = [ ['source' => 'user:b1', 'target' => 'user:b2'], ['source' => 'user:b1', 'target' => 'user:b3'], ];


Generating tokens for client-side usage:

// Generating a user token
$userToken = $client->createUserSessionToken("the-user-id");


If your app hits a ratelimit, a StreamFeedException is thrown. You can get additional info by catching the exception and calling the following methods:

try {
}catch(StreamFeedException $e){
    $limit = $e->getRateLimitLimit();
    $remaining = $e->getRateLimitRemaining();
    $reset = $e->getRateLimitReset(); // a unix timestamp


The reactions module has the following methods.

- add(string $kind, string $activityId, string $userId, array $data=null, array $targetFeeds=null)
- addChild(string $kind, string $parentId, string $userId, array $data=null, array $targetFeeds=null)
- delete(string $reactionId)
- filter(string $lookupField, string $lookupValue, string $kind=null, array $params=null)
- get(string $reactionId)
- update(string $reactionId, array $data=null, array $targetFeeds=null)

Also see documention on the reactions endpoint

$reaction = $client->reactions()->add('like', $activity_id, 'bob');

$bob_likes = $client->reactions()->filter('user_id', 'bob', 'like');



The users module has the following methods.

- add(string $userId, array $data=null, bool $getOrCreate=false)
- createReference(string $userId)
- delete(string $userId)
- get(string $userId)
- update(string $userId, array $data=null)

Also see documention on the users endpoint

$user = $client->users()->add('42');

$user = $client->users()->update('42', array('name' => 'Arthur Dent');


Again, our full documentation with all options and methods, is available at

Framework integration


There's a higher level integration with Laravel called

. The

integration helps you to hook into the Laravel's Eloquent ORM to sync data to Stream.


We love contributions. We love contributions with tests even more! To run the test-suite to ensure everything still works, run phpunit:

vendor/bin/phpunit --testsuite "Unit Test Suite"

Copyright and License Information

Project is licensed under the BSD 3-Clause.

We are hiring!

We've recently closed a $38 million Series B funding round and we keep actively growing. Our APIs are used by more than a billion end-users, and you'll have a chance to make a huge impact on the product within a team of the strongest engineers all over the world.

Check out our current openings and apply via Stream's website.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.