agentspeed.

pusher.com

scanned 7/26/2026, 5:34:44 AM · fresh · rubric 2026.08.0
Built with Gatsby
robots.txt present: passrobots.txt allows AI agents: passContent-Signal directives: failllms.txt present: passSitemap present: failLink response headers: failCanonical URL: failMCP server card: failOAuth authorization metadata: failOAuth resource metadata: failAPI catalog / OpenAPI: failWeb Bot Auth: failMarkdown negotiation: failText-to-markup ratio: failContent without JavaScript: skipHeading hierarchy: warnCookie wall blocks content: passPage title: passMeta description: passJSON-LD present: failStructured data validates: skipSchema type coverage: passPaywall / login wall: passAgent Skills manifest: failWebMCP actions: failPrimary action reachable: passReachability: passTime to first byte: passFull render time: skipPage weight: pass62/ 100 · D
Needs work

This is how AI agents (not browsers) experience pusher.com. The score weights five categories of machine-readability; the ticks on the arc are the 30 individual checks behind it.

✉ Email me this report + alert me when it changes ↓

Top fixes

failSitemap presentDiscoverability

No reachable sitemap.xml. Publish one and reference it in robots.txt.

Fix · Gatsby: Publish /sitemap.xml and reference it from robots.txt with a Sitemap: line.

failCanonical URLDiscoverability

No <link rel="canonical"> tag in <head>. Agents use canonical URLs to dedupe and cite.

Fix · Gatsby: Add <link rel="canonical" href="…"> pointing at the primary URL of each page.

failJSON-LD presentStructured data

No JSON-LD blocks found. Add a <script type="application/ld+json"> with a schema.org type for this page.

Fix · Gatsby: Add a <script type="application/ld+json"> describing the page (Organization, Article, Product, FAQPage).

failLink response headersDiscoverability

No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.

Fix: Emit `Link:` headers for canonical, alternate-language, and describedby relations. Agents that fetch HEAD-only or stream-render rely on these.

failText-to-markup ratioReadability

Visible text is 4.4% of HTML weight (10320/233854 bytes). Low. Markup may be crowding out agent-usable text.

Fix: Heavy ad or navigation markup crowds out agent-usable text. Aim for a text-to-DOM ratio above 15%.

warnHeading hierarchyReadability

Heading issues: 2 <h1> tags (expected 1).

Fix: Use a single H1 and avoid skipping heading levels (H1 → H3).

Don’t lose this report

Get it in your inbox now — and a heads-up whenever pusher.com’s agent-readiness score changes. Free, unsubscribe anytime.

Fix it

Generated, ready-to-ship files for the gaps above — copy them or download and drop them into your repo.

Add JSON-LD structured data
Paste inside <head>. Use Article/Product instead of Organization on those page types.
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Pusher | Leader In Realtime Technologies",
  "url": "https://pusher.com/",
  "description": "Simple, scalable and reliable. Hosted realtime APIs loved by developers and trusted by giants. Build live dashboards, notifications, geotracking, chat and more."
}
</script>

What the agent receives

The agent’s-eye view
Pusher | Leader In Realtime Technologies Products Build scalable realtime features Programmatic push notifications Developers Docs Read the docs to learn how to use our products Tutorials Explore our tutorials to build apps with Pusher products Support Reach out to our support team for help and advice Glossary Get familiar with Pusher-specific terminology User stories Blog Pricing Build scalable realtime features Programmatic push notifications Sign in Sign up Powering realtime experiences for mobile and web Bi-directional hosted APIs that are flexible, scalable and easy to use. We create and maintain complex messaging infrastructure so you can build the realtime features your users need, fast. Bi-directional hosted APIs that are flexible, scalable and easy to use. Get started today and find out what you can build with Pusher Use Cases Get your free account Pubsub Notifications Publish PHP Node Ruby ASP Java Python Go $pusher -&gt; trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , [ &#x27;message&#x27; =&gt; &#x27;hello world&#x27; ]); PHP Node Ruby ASP Java Python Go $pusher -&gt; trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , [ &#x27;message&#x27; =&gt; &#x27;hello world&#x27; ]); pusher. trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , { &quot;message&quot; : &quot;hello world&quot; }); pusher. trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , { message : &#x27;hello world&#x27; }) pusher. Trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , new { message = &quot;hello world&quot; }); pusher. trigger ( &quot;my-channel&quot; , &quot;my-event&quot; , Collections . singletonMap ( &quot;message&quot; , &quot;hello world&quot; )); pusher. trigger ( &#x27;my-channel&#x27; , &#x27;my-event&#x27; , { &#x27;message&#x27; : &#x27;hello world&#x27; }) pusher.Trigger( &quot;my-channel&quot; , &quot;my-event&quot; , map[ string ] string { &quot;message&quot; : &quot;hello world&quot; , }) Subscribe JS Android iOS (Swift) iOS (Obj-C) var channel = pusher. subscribe ( &#x27;my-channel&#x27; ); channel. bind ( &#x27;my-event&#x27; , function ( data ) { alert( &#x27;Received my-event with message: &#x27; + data .message); }); JS Android iOS (Swift) iOS (Obj-C) var channel = pusher. subscribe ( &#x27;my-channel&#x27; ); channel. bind ( &#x27;my-event&#x27; , function ( data ) { alert( &#x27;Received my-event with message: &#x27; + data .message); }); Channel channel = pusher. subscribe ( &quot;my-channel&quot; ); channel. bind ( &quot;my-event&quot; , new SubscriptionEventListener () { @Override public void onEvent ( String channel, String event, String data ) { System.put.println( &quot;Received event with data: &quot; + data ); } }); let channel = pusher. subscribe ( &quot;my-channel&quot; ) channel. bind ( eventName : &quot;my-event&quot; , callback : { ( optionalData : Any?) -&gt; Void in if let data = optionalData { print ( &quot;Received event with data: \(data) &quot; ) } }) PusherChannel *channel = [pusher subscribeWithChannelName :@ &quot;my-channel&quot; ]; [channel bindWithEventName: @&quot;my-event&quot; callback:^ void ( NSDictionary *data) { NSString *message = data [@ &quot;message&quot; ]; NSLog (@ &quot;message received: %@&quot; , message); }]; Learn more Publish API Node.JS Go Python Java Kotlin Ruby const beamsClient = new PushNotifications ({ instanceId : &#x27;YOUR_INSTANCE_ID_HERE&#x27; , secretKey : &#x27;YOUR_SECRET_KEY_HERE&#x27; }); beamsClient. publishToInterests ([ &#x27;hello&#x27; ], { apns: { aps: { alert : &#x27;Hello!&#x27; } }, fcm: { notification: { title : &#x27;Hello&#x27; , body : &#x27;Hello, world!&#x27; } } }). then ( ( publishResponse ) =&gt; { console . log ( &#x27;Just published:&#x27; , publishResponse. publishId ); }). catch ( ( error ) =&gt; { console . error ( &#x27;Error:&#x27; , error); }); Node.JS Go Python Java Kotlin Ruby const beamsClient = new PushNotifications ({ instanceId : &#x27;YOUR_INSTANCE_ID_HERE&#x27; , secretKey : &#x27;YOUR_SECRET_KEY_HERE&#x27; }); beamsClient. publishToInterests ([ &#x27;hello&#x27; ], { apns: { aps: { alert : &#x27;Hello!&#x27; } }, fcm: { notification: { title : &#x27;Hello&#x27; , body : &#x27;Hello, world!&#x27; } } }). then ( ( publishResponse ) =&gt; { console . log ( &#x27;Just published:&#x27; , publishResponse. publishId ); }). catch ( ( error ) =&gt; { console . error ( &#x27;Error:&#x27; , error); }); const ( instanceId = &quot;YOUR_INSTANCE_ID_HERE&quot; secretKey = &quot;YOUR_SECRET_KEY_HERE&quot; ) beamsClient := pushnotifications.New(instanceId, secretKey) publishRequest := map[ string ] interface {}{ &quot;apns&quot; : map[ string ] interface {}{ &quot;aps&quot; : map[ string ] interface {}{ &quot;alert&quot; : map[ string ] interface {}{ &quot;title&quot; : &quot;Hello&quot; , &quot;body&quot; : &quot;Hello, world&quot; , }, }, }, &quot;fcm&quot; : map[ string ] interface {}{ &quot;notification&quot; : map[ string ] interface {}{ &quot;title&quot; : &quot;Hello&quot; , &quot;body&quot; : &quot;Hello, world&quot; , }, }, } pubId, err := beamsClient.PublishToInterests([] string { &quot;hello&quot; }, publishRequest) if err != nil { fmt.Println(err) } else { fmt. Println ( &quot;Publish Id:&quot; , pubId) } beams_client = PushNotifications( instance_id= &#x27;YOUR_INSTANCE_ID_HERE&#x27; , secret_key= &#x27;YOUR_SECRET_KEY_HERE&#x27; , ) response = beams_client.publish_to_interests( interests=[ &#x27;hello&#x27; ], publish_body={ &#x27;apns&#x27; : { &#x27;aps&#x27; : { &#x27;alert&#x27; : &#x27;Hello!&#x27; , }, }, &#x27;fcm&#x27; : { &#x27;notification&#x27; : { &#x27;title&#x27; : &#x27;Hello&#x27; , &#x27;body&#x27; : &#x27;Hello, world!&#x27; , }, }, }, ) print (response[ &#x27;publishId&#x27; ]) String instanceId = &quot;YOUR_INSTANCE_ID_HERE&quot; ; String secretKey = &quot;YOUR_SECRET_KEY_HERE&quot; ; PushNotifications beamsClient = new PushNotifications (instanceId, secretKey); List &lt; String &gt; interests = Arrays . asList ( &quot;donuts&quot; , &quot;pizza&quot; ); Map &lt; String , Map &gt; publishRequest = new HashMap (); Map &lt; String , String &gt; alert = new HashMap (); alert. put ( &quot;alert&quot; , &quot;hi&quot; ); Map &lt; String , Map &gt; aps = new HashMap (); aps. put ( &quot;aps&quot; , alert); publishRequest. put ( &quot;apns&quot; , aps); Map &lt; String , String &gt; fcmNotification = new HashMap (); fcmNotification. put ( &quot;title&quot; , &quot;hello&quot; ); fcmNotification. put ( &quot;body&quot; , &quot;Hello world&quot; ); Map &lt; String , Map &gt; fcm = new HashMap (); fcm. put ( &quot;notification&quot; , fcmNotification); publishRequest. put ( &quot;fcm&quot; , fcm); beamsClient.publishToInterests(interests, publishRequest); val instanceId = &quot;YOUR_INSTANCE_ID_HERE&quot; val secretKey = &quot;YOUR_SECRET_KEY_HERE&quot; val beamsClient = PushNotifications(instanceId, secretKey) val interests = listOf( &quot;donuts&quot; , &quot;pizza&quot; ) val publishRequest = hashMapOf( &quot;apns&quot; to hashMapOf ( &quot;aps&quot; to hashMapOf ( &quot;alert&quot; to &quot;hi&quot; )), &quot;fcm&quot; to hashMapOf ( &quot;notification&quot; to hashMapOf ( &quot;title&quot; to &quot;hello&quot; , &quot;body&quot; to &quot;Hello world&quot; )) ) beamsClient.publishToInterests(interests, publishRequest) Pusher :: PushNotifications .configure do |config| config. instance_id = &#x27;YOUR_INSTANCE_ID_HERE&#x27; config. secret_key = &#x27;YOUR_SECRET_KEY_HERE&#x27; end data = { apns: { aps: { alert: { title : &#x27;Hello&#x27; , body : &#x27;Hello, world!&#x27; } } }, fcm: { notification: { title : &#x27;Hello&#x27; , body : &#x27;Hello, world!&#x27; } } } Pusher :: PushNotifications . publishToInterests ( interests : [ &#x27;hello&#x27; ], payload : data) Learn more Trusted by Giants. Loved by developers. What can you build with Pusher? Realtime charts From dashboards to stock charts, update data instantly Read more Notifications Critical transactional information, delivered every time Read mor

Show your score

Embed this badge on your site. It links back to this live scan and updates on every rescan.

AgentSpeed score for pusher.com
<a href="https://agentspeed.com/scan/pusher.com"><img src="https://agentspeed.com/badge/pusher.com" alt="AgentSpeed agent-readiness score" height="56"></a>

Track this score

Get this report by email, then a heads-up when pusher.com’s agent-readiness actually changes — a check regressing, or the composite dropping.

Two things never trigger an email: a score change caused by us publishing a new rubric, because that is a different instrument rather than a change to your site, and movement explained only by timing-derived checks, which shift run to run on a site nobody touched.

Want it on your own schedule, with Slack or a webhook instead of email? Score-drift monitoring is on every paid plan.

This score says whether an AI agent could read pusher.com. AI traffic analytics says whether one actually came — and which pages turned it away.

Full breakdown

12 pass1 warn14 fail3 skip
Discoverability
pass
robots.txt present
A robots.txt is reachable at the site root.
100/100
pass
robots.txt allows AI agents
All 9 answer-time access agents allowed.
100/100
fail
Content-Signal directivesemerging
No Content-Signal directives. Add e.g. `Content-Signal: ai-train=no, ai-summarize=yes` to declare granular AI usage policy beyond binary allow/disallow.
0/100
pass
llms.txt present
Found /llms.txt but missing H1 header and markdown links. Not scored.
100/100
fail
Sitemap present
No reachable sitemap.xml. Publish one and reference it in robots.txt.
0/100
fail
Link response headers
No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.
0/100
fail
Canonical URL
No <link rel="canonical"> tag in <head>. Agents use canonical URLs to dedupe and cite.
0/100
fail
MCP server cardemerging
No valid MCP Server Card at /.well-known/mcp/server-card.json. Publish one so agents can discover your tools without HTML scraping.
0/100
fail
OAuth authorization metadataemerging
No RFC 8414 metadata at /.well-known/oauth-authorization-server. Agents that act on behalf of users need this to discover your authorization endpoints.
0/100
fail
OAuth resource metadataemerging
No RFC 9728 metadata at /.well-known/oauth-protected-resource. Publish it so agents can discover required scopes without hand-coded credentials.
0/100
fail
API catalog / OpenAPIemerging
No /.well-known/api-catalog (RFC 9727) and no /openapi.json|yaml. Publish one so agents that integrate with APIs can discover your endpoints.
0/100
fail
Web Bot Authemerging
No Web Bot Auth JWKS at /.well-known/http-message-signatures-directory.json. Publish one to allow trusted agents while keeping a default-deny posture for the rest.
0/100
Readability
fail
Markdown negotiationemerging
Accept: text/markdown returns HTML, not markdown. Serve a markdown variant of primary content when requested; agents summarize and cite it more reliably.
0/100
fail
Text-to-markup ratio
Visible text is 4.4% of HTML weight (10320/233854 bytes). Low. Markup may be crowding out agent-usable text.
33/100
skip
Content without JavaScript
Browser pass unavailable; cannot measure JS dependency.
warn
Heading hierarchy
Heading issues: 2 <h1> tags (expected 1).
75/100
pass
Cookie wall blocks content
No common consent-modal markers detected.
100/100
pass
Page title
A concise <title> is present (40 chars).
100/100
pass
Meta description
A well-sized meta description is present (160 chars).
100/100
Structured data
fail
JSON-LD present
No JSON-LD blocks found. Add a <script type="application/ld+json"> with a schema.org type for this page.
0/100
skip
Structured data validates
No JSON-LD blocks present; nothing to validate (covered by structured_data.jsonld_present).
pass
Schema type coverage
Page intent unclear; no specific schema.org type expected.
100/100
Actionability
pass
Paywall / login wall
No paywall or login-wall detected on the landing URL.
100/100
fail
Agent Skills manifestemerging
No Agent Skills manifest at /.well-known/agent-skills.json. Enumerate the tasks agents can perform (search, add-to-cart, contact-support) so they pick the right one without scraping.
0/100
fail
WebMCP actionsemerging
No WebMCP detected. On pages with first-class actions (cart, support, account), embed a WebMCP server so on-page agents invoke tools directly.
0/100
pass
Primary action reachable
Primary offering identified ("Realtime APIs and push notifications") with price/CTA ("Get your free account").
100/100
pass
Reachability
HTTP 200.
100/100
Performance
pass
Time to first byte
TTFB 78ms. Healthy.
100/100
skip
Full render time
Full-render time unavailable (browser pass skipped or failed).
pass
Page weight
Initial document is a lean 228 KB.
100/100
Beyond the scan

Running AI agents of your own? AgentSpeed also monitors them in production — every run, its latency, cost, and failures, with alerts when something breaks. Free for 10,000 events a month, no credit card.

Start watching free →See plans