- Version: 1.0
- Host: api.massrelevance.com
- Protocols:
http
- Accepts:
application/json
,application/xml
- Responds With:
application/json
,application/xml
The Stream API provides approved status entities from a stream. Use the Stream API to create visualizations of curated Tweets, Facebook posts, Instagram images and more. If you have any questions, please feel free to ask in our API Support Forum or email our support team directly at [email protected]. Additionally, you can peruse our FAQs for answers to some frequently asked questions.
Provides approved status entities from a stream sorted from most recently approved to least recently approved (in most cases, this is reverse chronological order).
Terms and Concepts
To get the most out of the API, you should familiarize yourself with the following terms and concepts:
Experiences is a Khoros Marketing product that, among other things, enables users to create streams for use in visualizations. The API focuses on streams since they are the basic data source for visualizations, and API developers are most interested in leveraging this data to create their own visualizations.
A stream is a curated collection of social posts that updates in real time. Streams are created and configured within the web-based Experiences application. They have three primary configuration areas: sources, rules, and topics.
Sources determine what content to include in the stream. Rules dictate what content to exclude, although sometimes they are be used to automatically approve content too. Content from various social networks is aggregated into a stream - usually one per cultural topic - then run through rules in real-time. Content is sorted into three queues: approved, pending, and rejected. Approved content is surfaced in these APIs; as new content is approved, it’s immediately available in the API. Topics count specific mentions within a stream (useful for ranking items or for counting votes in a social poll).
Streams are owned by users; to make API requests, one must know a stream’s name and the stream owner’s username.
Streams are enabled by default, meaning that content flows into the stream as soon as sources are added. Sources can be turned off, pausing content ingestion while retaining current content, or they can be reset, removing all content from the stream while maintaining all settings.
Entity is a generic word for a social post. Tweets, Facebook posts, Instagram items, etc. are all entities.
Hostname
api.massrelevance.com
Example URL:
http://api.massrelevance.com/MassRelDemo/kindle.json
SSL
api.massrelevance.com
supports requests over SSL. Use https as the protocol instead of HTTP.
Example URL: https://api.massrelevance.com/MassRelDemo/kindle.json
Status Codes
When possible the API returns valid response codes:
- 200 for valid requests
- 404 for requests to streams that do not exist, and
- 500 for things that are the server's fault
However, the API does not support “304 Not Modified” responses.
Encoding (gzip)
The API can gzip responses. Where possible, use gzip! It improves performance. To use gzip, ensure the HTTP client has the Accept-Encoding: gzip header added to requests.
JSONP
Most of the json endpoints support JSONP requests. Use callback or jsonp query parameter on json endpoints.
Example URL: http://api.massrelevance.com/MassRelDemo/kindle.json?callback=foo
Stream API
Displaying Status Entities
Special care must be taken when displaying status entities. To access data from the API, a customer must have accepted Khoros Marketing Experiences’s API usage agreement for a given stream. This includes agreeing to comply with Twitter’s Display Requirements and Guidelines for using Tweets in broadcast when displaying Twitter statuses.
TWITTER DISPLAY REQUIREMENTS
https://dev.twitter.com/terms/display-requirements
TWITTER GUIDELINES FOR USING TWEETS IN BROADCAST
https://developer.twitter.com/en/developer-terms/display-requirements
RESOURCE URL
http://api.massrelevance.com/:account/:stream_name.:format
- account: the stream owner's account name (e.g. MassRelDemo)
- stream_name: the name of the stream (e.g. kindle)
- format:
json
,xml
,atom
,rss
Stream Meta API
Provides information about and derived from the entities in a stream. All streams have, by default, a set of meta-information captured about them as they live. Most notably, this information includes:
- counts: total number of entities in a stream, split by their moderation state (pending, approved, rejected)
- activity: arrays of per-minute, per-hour, and per-day counts
This basic/standard meta information is commonly used to render such visualizations as counters, progress meters, and social poll results. Additionally, there are advanced features that may be enabled on a stream-by- stream basis by Khoros Marketing administrators. These features include:
- top retweeted tweets: (Twitter only) the tweets in a stream that have been retweeted the most (minimum 3 retweets)
- top hashtags: the hashtags that have been used the most over the last hour
- top links: the URLs that have been referenced the most over the last 18 hours
- top contributors: (Twitter only) the Twitter users whose tweets have been retweeted or replied to the most within the stream
- top topics: a tally of the number of times that specific keyword sets have been mentioned in the stream
This advanced stream meta information is commonly used to render various leaderboard visualizations.
Standard Meta Information
To get a stream’s basic/standard count and activity rate information:
$ curl http://api.massrelevance.com/MassRelDemo/kindle/meta.json
The response:
{
"activity": {
"minute": {},
"daily": {},
"hourly": {}
},
"count": {
"approved": 551979,
"pending": 0,
"rejected": 81681394,
"total": 82233373
},
"name": "kindle",
"full_name": "MassRelDemo/kindle",
"description": "The Twitterverse has some good things to say about the Amazon Kindle.",
"created_at": "2013-09-09T11:26:01-07:00",
"tags": []
}
The arrays of minute-by-minute, hour-by-hour, and day-by-day counts are sorted oldest to newest. The last array item contains the count for the most recent complete period. The second-to-last item contains the count for the period before that, and so on. By default, minute count arrays contain the most recent 60 complete one- minute periods, hourly count arrays contain the most recent 24 complete one-hour periods, and daily count arrays contain the most recent 365 complete one-day periods. Minute, hourly, and daily periods begin and end as per the clock, not on a rolling basis:
- minute: A minute period is defined as a 60 second period that starts at the beginning of a given minute and ends at the beginning of the next minute, e.g. 2:31:00pm - 2:31:59pm.
- hourly: An hourly period is defined as a 60 minute period that starts at the beginning of a given hour, e.g. 2:00:00pm - 2:59:59pm.
- daily: A daily period is defined as a 24 hour period beginning at 12:00:00am UTC and ending at 11:59:59pm UTC.
Advanced Meta Information
A stream with other advanced features enabled will have far more information contained in its meta response.
$ curl http://api.massrelevance.com/MassRelDemo/things-we-do/meta.json
{
"activity": {
"minute": {
"approved": [], // 60 items in each
"pending": [],
"rejected": [],
"total": []
},
"daily": {
"approved": [], // 365 items in each
"pending": [],
"rejected": [],
"total": []
},
"hourly": {
"approved": [], // 24 items in each
"pending": [],
"rejected": [],
"total": []
}
},
"count": {
"approved": 124252729,
"pending": 0,
"rejected": 544896561,
"total": 669149290
},
"name": "things-we-do",
"full_name": "MassRelDemo/things-we-do",
"description": "things-we-do",
"created_at": "2015-10-14T11:40:56-07:00",
"tags": []
}
Advanced Meta Information: Top Retweeted Tweets
Get the top retweeted tweets in this stream.
$ curl http://api.massrelevance.com/MassRelDemo/things-we-do/meta.json?top_periods=a,20120926,2012092616&top_count=3
In this example, we’re asking for the top 3 retweeted tweets in each for 3 specific time periods: all-time in this stream (‘a’), within a specific day (Sept 26, 2012), and within a specific hour of that day (UTC 16:00, Sept 26, 2012).
Advanced Meta Information: Top Hashtags
Get the top discovered hashtags in this stream.
$ curl http://api.massrelevance.com/MassRelDemo/things-we-do/meta.json?num_hashtags=5
The count indicated in the response indicates the number of approved entities in the last hour using that hashtag.
Advanced Meta Information: Top Links
Get the top discovered links in this stream.
$ curl http://api.massrelevance.com/MassRelDemo/things-we-do/meta.json?num_links=5
The count indicated in the response indicates the number of approved entities in the last 18 hours containing that link.
Advanced Meta Information: Top Contributors
Get the top contributors in this stream.
$ curl http://api.massrelevance.com/MassRelDemo/things-we-do/meta.json?num_contributors=5
The count indicated in the response indicates the number of approved entities in the last week containing that user’s handle (@name).
Displaying Status Entities
Special care must be taken when displaying status entities.
To access data from the API, a customer must have accepted Spredfast Experiences’s API usage agreement for a given stream. This includes agreeing to comply with Twitter’s Display Requirements and Guidelines for using Tweets in broadcast when displaying Twitter statuses.
Twitter Display Requirements
https://dev.twitter.com/terms/display-requirements
Twitter Guidelines for using Tweets in broadcast
https://developer.twitter.com/en/developer-terms/display-requirements
http://api.massrelevance.com/:account/:stream_name/entities.json
- account: the stream owner's account name (e.g. MassRelDemo)
- stream_name: the name of the stream (e.g. kindle)
Leaderboard API
Leaderboard visualizations display lists of ranked “things”.
These ranked “things” could be actual entities (e.g. the “Top Tweets” template within Spredfast Experiences), configured topics (“Top Topics”), users (“Top Influencers”), or other pieces of information such as URLs or hashtags mentioned within Tweets. Each Leaderboard API provides the top occurring “things” of the requested type, along with the aggregate counts of each “thing” over a given time range (within a single stream). Unless otherwise noted, all counts are derived from approved entities. Use of these APIs is preferred over use of similar features in the Stream Meta API. The following types of “things” are supported:
TOP HASHTAGS (TOP_HASHTAGS.JSON)
- Returns the most frequently mentioned hashtags (less the the # character) in a stream. Top URLs (top_urls.json)
- Returns the most frequently mentioned URLs in a stream.
TOP TERMS (TOP_TERMS.JSON)
- Returns dynamically discovered top mentioned words and 2-word phrases.
Top User Mentions (top_user_mentions.json) - Returns the users who have been @mentioned the most in a stream.
- Currently, only Twitter content is counted.
Top Constrained Topics (top_constrained_topics.json) - Returns the top constrained topics for a stream.
Notes:
- These APIs are ideal for displaying data aggregated over relatively short time periods: minutes, hours, days or small numbers of weeks. Requests for timeframes beyond that may result in significantly slower response times or failed requests.
- Results may be subject to a 5-10 minute data aggregation delay. Resource URLs
http://api.massrelevance.com/:account/:stream_name/top_[thing].json
Examples
Top Hashtags: http://api.massrelevance.com/massreldemo/kindle/top_hashtags.json
Top URLs: http://api.massrelevance.com/massreldemo/kindle/top_urls.json
Top Terms: http://api.massrelevance.com/massreldemo/kindle/top_terms.json
Top User Mentions: http://api.massrelevance.com/massreldemo/kindle/top_user_mentions.json
Top Constrained Topics: http://api.massrelevance.com/massreldemo/constrained-topics-food/top_constrained_topics.json
Parameters For all of the endpoints listed above, the following parameters are applicable: start (optional) - Relative time or Unix time of the point at which activity data should start.
- Type: string (for relative time) or integer (for Unix time)
- Default: -1h (1 hour ago)
- Example values: -2h,-3600m,-24h,-1d,1403034787
- Relative time specifiers are preferred.
- For relative times, using d (day) as the unit simply implies 24 hours of time; there is no implication of a calendar day.
- Only use the seconds portion of Unix time (JavaScript will return the number in milliseconds; divide that number by 1000 to get a usable time).
resolution (optional) - The time range derived between start and finish will be divided into “windows” of the size specified by resolution.
- Type: string
- Default: 1h
- Example values: 5m,1h,2h,24h
- Minimum value: 5m
limit (optional) - Limits the number of results returned for any given bucket of time.
- Type: integer
- Default: 10
- Example values: 10,20,30
percent (optional) - Returns derived percentages alongside counts. Percentages are derived from the sum of the counts of all returned “things,” which may or may not equal the number of “things” that exist. In other words, if you changelimit, the percentages will change.
- Type: bit
- Default: 0
- Possible values: 0,1
Account API
Provides limited meta information (entity counts, entity activity rates, etc.) about a set of streams belonging to an individual user account.
Commonly, a user in the Spredfast Experiences system will have multiple streams under their account. For example, the MassRelDemo user has (amongst others) streams named:
- galaxy-topic1
- galaxy-topic2
- galaxy-topic3
This API endpoint is useful for accessing meta information about all of these streams in a single request.
Resource URL
http://api.massrelevance.com/:account.:format
- account: The user user account name (e.g., MassRelDemo)
- format: json, XML
Example URL: http://api.massrelevance.com/MassRelDemo.json
In this example, the response will contain meta information about ALL of the streams under the specified account (MassRelDemo).
Example Request
This is a standard account request, returning some meta information for 3 of MassRelDemo’s streams:
$ curl http://api.massrelevance.com/MassRelDemo.json?streams=galaxy-topic1,galaxy-topic2,galaxy-topic3
Compare API
Provides an entity volume comparison, in percentages, between multiple streams. This is commonly used in social polls (like Hashtag Battles) to identify, in real-time, the volume of one topic against others.
Spredfast Experiences templates now leverage Constrained Topics for poll results. Topic counts can be retrieved via the Top Constrained Topics API, the Stream Meta API, or the Compare API (when a single stream with Topics configured is passed to the streams parameter).
Resource URL
http://api.massrelevance.com/compare.:format?streams=:stream_names
- format: json, xml
- stream_names: a comma-delimited set of full stream names in the format of :account/:stream_name (e.g.MassRelDemo/kindle)
In this example, the response will sum the total number approved entities in the 3 specified streams (MassRelDemo/kindle, MassRelDemo/galaxy-topic1, and MassRelDemo/galaxy-topic2), and provide the percentages that each stream’s approved total represents.
Example Requests
Standard Comparison
This is a standard compare request, asking for the volume percentages for 3 streams. Percentage values max out at 100.
$ curl http://api.massrelevance.com/compare.json?streams=MassRelDemo/kindle,MassRelDemo/galaxy-topic1,MassRelDemo/galaxy-topic2
TARGETED COMPARISON
This is the same compare request, but instead of comparing the stream volumes against one another, we’re comparing against a specific volume target of 5000 entities. Each stream’s percentage value is relative to the target.
$ curl http://api.massrelevance.com/compare.json?streams=MassRelDemo/kindle,MassRelDemo/galaxy-topic1,MassRelDemo/galaxy-topic2&target=5000
Flock API
In a Flock to Unlock, the teeming masses strive to unlock goodies by tweeting or posting enough to reach specific volume targets (e.g., display a behind-the-scenes photo if we get 1000 tweets w/the #flock hashtag). The Flock API provides information about the state of a Flock to Unlock, describing percentage progress towards its target thresholds and, if achieved, the thresholds’ unlocked payloads.
Flocks to Unlock thresholds and payloads must be configured by a Spredfast representative.
Resource URL
http://api.massrelevance.com/flock/:account/:flock_name.:format
- account: the flock owner's account name (e.g. massreldemo)
- flock_name: the name of the flock (e.g. example-flock)
- format: json
Example URL:
http://api.massrelevance.com/flock/massreldemo/example-flock.json
Example Request
When making a flock request the response is a JSON object representing the state of the Flock to Unlock. If an error occurs then the response will be empty (whitespace).
$ curl http://api.massrelevance.com/flock/massreldemo/example-flock.json
THRESHOLDS
The thresholds array within the response is where the the unlocked information is contained. A flock to unlock endpoint may have more than one unlock threshold. We use this when there is more than one payoff. The items of the threshold are ordered. The order can be specified. We usually order thresholds such that thresholds that unlock first are earlier in the array. The order is preserved with each request. The two important threshold properties are payload and pct
PAYLOAD
A payload can be specified with any data that can be serialized to JSON. If the threshold condition has not been met, then the payload will NOT BE included. When the threshold condition has been met then pct === 100
PCT
pct is an integer value where 0 >= pct <= 100. When pct === 100, then the threshold condition has been met and there will be a payload included in the threshold (if one has been defined). Each threshold’s pct is independent* of all other thresholds within the array. e.g. if there are 10 thresholds, each one will calculate its own pct depending on its unlock condition. The only time when all thresholds are pct are 0 is when there are 0 tweets. This should not be an issue but it is worth noting.
*= pct acts a little bit differently if the flock endpoint is artificial. i.e. the thresholds unlock at some predetermined time instead of organically through number of tweets. In this case each condition is dependent on the when the previous threshold unlocks.
OTHER PROPERTIES
A name and a description can be defined per threshold. We usually do not use these fields.
Polling Streams
The stream API is traversable, and will only return a fraction of the data available at a time.
The stream API was heavily influenced by Twitter’s timeline APIs. Twitter’s developer center has great documentation on how to use traversable APIs.
Step by Step
For the sake of this example, you are getting status entities about the Amazon Kindle using the following endpoint http://api.massrelevance.com/MassRelDemo/kindle.json
REQUEST THE FIRST SET OF ITEMS
Request the newest 50 items in the stream.
$ curl http://api.massrelevance.com/MassRelDemo/kindle.json?limit=50&since_id=228210196055486464
REQUEST NEWER ITEMS
Use the entity_id property of the first status entity returned as the value for the since_id param of the next request. Status entities are sorted in reverse chronological order (most recently approved on top). Use the since_id param to get newer status entities. Set the value of since_id to the value of the entity_id property from the top most status entity in the array (index=0). If there were no entities in the last response, then continue to use the value from before. $ curl http://api.massrelevance.com/MassRelDemo/kindle.json?limit=50&since_id=228210196055486464
REQUEST OLDER ITEMS
Similar to requesting newer items. After the initial requests, use the entity_id property of the first status entity returned as the value for the start_id param of the next request. $ curl http://api.massrelevance.com/MassRelDemo/kindle.json?limit=50&start_id=227581759888453632
Other Considerations
FREQUENCY OF POLLING
Limit polling to once every 15 seconds per stream per client/browser (four times per minute). Please contact Spredfast if you plan on making requests at a higher rate.
SINCE_ID VS. FROM_ID VS. START_ID
Each parameter will give you a different slice of a stream.
SINCE_ID
since_id will give you newer entities, not including the supplied entity, in a stream from the newest in the stream until limitis reached or until the supplied entity is reached (which ever is first). Essentially it will ensure that the polling stays realtime.
FROM_ID
from_id will give you newer entities, not icluding the supplied entity, in a stream from the supplied entity until the newest (top most) entity is reach or until limit reached. Essentially it will ensure you see every tweet in a stream, however it is likely that you will not remain realtime. Using since_id instead of from_id is highly recommended.
START_ID
start will give you older entities, not including the supplied entity, in a stream from the supplied entity. If more than one is supplied the first of the following supplied is used: since_id, from_id, start_id.
IF A SUPPLIED ENTITY IS NOT IN THE STREAM
The API will return the newest status entity in a stream (just one).
FAQ
General
DO YOU SUPPORT JSONP?
Yes; see the JSONP section for more information.
CAN I CREATE OR MODIFY A STREAM’S CONFIGURATION VIA AN API?
All stream creation and configuration changes must be made within the Experiences UI. The API does not support the programmatic creation and configuration of streams.
WHAT HAPPENS WHEN A STREAM IS RESET?
When a user resets a stream within Experiences, the following things happen: 1. All content is removed from the stream. The Stream API will return no data until new data is sourced and approved (either automatically via rules or manually). 2. Counts are reset to zero. This includes counts in the Stream Meta API including approved, pending, and rejected, along with topic counts. The exception is… 3. Activity counts (counts over time) in the Stream Meta API are not reset. They persist.
Stream API
ARE ENTITY RESPONSES STANDARDIZED?
The API returns the same JSON provided by the social networks with minimal modifications. Because of this, the API response is not standardized across networks.
DO YOU PROVIDE DOCUMENTATION FOR EACH KIND OF ENTITY RESPONSE (TWEET, INSTAGRAM POST, ETC)?
Since the API returns largely unmodified JSON, we recommend you consult the API documentation provided by each social network relevant to the entities you are displaying: • Twitter (see “Example Request”) • Facebook (see post, photo, video, link, status, and comment) • Instagram (see RESPONSE under “/media/media-id” including video example)
In addition, the Displaying Status Entities page includes some tips and tricks along with sample feeds that you’ll want to check out.
WHAT DO YOU MEAN BY LARGELY UNMODIFIED? WE DO ADD A COUPLE OF USEFUL THINGS TO EACH ENTITY:
- network (string): used for determining which network an entity came from. Possible values: twitter, facebook, instagram, google_plus, and rss.
- kind (string): used for determining what kind of status to render. Possible values: instagram_media (Instagram), post, photo, video, link, status, and comment (all Facebook).
- entity_id (string): used for paginating through streams by making multiple requests. See since_idvs. from_id vs.start_id .
HOW DO I RENDER TWITTER MEDIA?
This is explained on the Displaying Status Entities page.
WHAT HAPPENS IF AN ENTITY IS REJECTED?
If an approved entity is later rejected, it will be removed from the API response for future requests. Past requests that contained the now-rejected entity will not be updated to reflect the rejection; rejection notifications are not available via the API. Requests made after the rejection will not contain the rejected content.
IS PENDING OR REJECTED CONTENT AVAILABLE?
The Stream API returns only approved content. Pending and rejected content are not available via the API. In general, metadata (e.g. data returned by the Stream Meta API, Leaderboard APIs, and the Compare API) is derived from approved content, but pending, rejected, and total counts (not content) are available in the Stream Meta API. In practice, approved and total counts are the most frequently used.
HOW IS CONTENT SORTED IN THE API RESPONSE?
By default, content is returned in the order it was approved (more recently approved content on top). In most cases, this will chronological or close-to- chronological creation order, but in the case of manual moderation the order may differ significantly from creation order. Two exceptions apply: • Using reverse=1 will reverse the order of returned entities, but the order remains based on approval time. • For requests using advanced timeframe parameters , content is returned in chronological order based on creation timestamp.
HOW OFTEN CAN I MAKE REQUESTS TO THE API?
We recommend making API requests no more than once every 15 seconds per user. For example: when a user first loads the page, make a request for content; 15 seconds after that, make another request for content, etc.
IS IT POSSIBLE TO PASS MULTIPLE VALUES TO THE NETWORK PARAMETER, (E.G. TWITTER,FACEBOOK)?
No. The network parameter supports a single network only.
HOW SHOULD I RENDER RETWEETS?
Rendering retweets does require some attention. The Displaying Status Entities guide has some tips on how to handle this.
WHY DON’T I GET BACK AS MANY ITEMS AS I REQUESTED (USING LIMIT)?
This can happen for one of two reasons: 1. There simply isn’t enough approved content! For instance, if there are 25 approved items and you request limit=50, a maximum of 25 items will be returned. 2. Deduplication. Very occasionally, a stream’s approved queue can contain duplicate items. Typically this only occurs with Instagram content; when a stream sources two Instagram hashtags, it’s possible for one photo that contains both hashtags to be sourced twice, introducing a duplicate. These duplicates are filtered out in the API response, so you should never see them. However, this deduplication process can reduce the number of returned items; for example, it’s possible to receive 99 items when you requested limit=100 if there is one duplicate pair.
Because of these reasons, make sure your application’s display does not depend on a certain number of items being returned.
CAN I RETRIEVE CONTENT FROM A STREAM THAT CONTAINS CERTAIN KEYWORDS? WHAT ABOUT CONTENT FROM DIFFERENT ACCOUNTS?
The keywords and from parameters might be what you’re looking for! Check out the Stream API documentation for more info.
HOW DO I RENDER LINKED MEDIA SUCH AS IMAGES AND VIDEOS?
The Displaying Status Entities guide has some tips on how to handle this. Facebook images are displaying in low resolution.
HOW DO I RENDER LARGER IMAGES FROM FACEBOOK ITEMS?
The Displaying Status Entities guide has some tips on how to handle this.
HOW DO I RENDER FACEBOOK AVATARS?
The Displaying Status Entities guide has some tips on how to handle this.
HOW DO I RENDER TWITTER LINKS CORRECTLY (WITHOUT DISPLAYING T.CO URLS)? HOW DO I LINK HASHTAGS TO TWITTER SEARCH AND HANDLES TO TWITTER ACCOUNTS?
The Displaying Status Entities guide has some tips on how to handle this. In short: to make this easy, Twitter provides many open-source client libraries to correctly display and link statuses: • JavaScript • Ruby • Java • Objective C
Other
HOW ARE TOP RETWEETS CALCULATED?
Both the Top Shares Leaderboard API and Stream Meta API return “Top Retweets” - a list of the most retweeted content in a stream. Top Retweets are calculated the same way for both APIs: • Top RT only looks at approved content. Content must be approved to be featured. • Top RT derives its retweet counts from the most recently approved retweet of a particular Tweet. For this reason, in order to count retweets correctly, retweets must be approved by default - they have to be in the approved queue for the RT count to increase. • It’s not possible to remove an entity from the Top Retweeted listing, so make sure the stream rules are set correctly to approved appropriate content.
The Top RT section of the Stream Meta API requires that an item have at least 3 retweets before it is featured.
Question not answered?
If you’ve got a question or a suggestion, don’t hesitate to contact the Digital Producer/Technical Project Manager for your project. If you aren’t working with a Digital Producer, shoot an email to our Technical Solutions Consultants ([email protected]). We look forward to hearing from you!