Friday, June 16, 2023

How TikTok Is Reading Your Mind Whiteboard Friday

Explore the role of demographics, engagement, and personalized recommendations in how TikTok surfaces content. Discover how TikTok attempts to avoid echo chambers and gain valuable insights into its inner workings. Dive into the fascinating world of TikTok's algorithm in this new Whiteboard Friday episode with Lidia Infante!

How TikTok is reading your mind

Click on the whiteboard image above to open a high resolution version in a new tab!

Video Transcription

Howdy, Moz fans, and welcome to a new edition of Whiteboard Fridays. Have you ever felt like TikTok is reading your mind? It's just an algorithm. My name is Lidia Infante. I'm the Senior SEO Manager at Sanity, and I'm going to talk to you about how TikTok offers you the videos that you like.

What do you like?

What do you like?

The very first thing they're trying to do is to show you videos that interest you. They're trying to keep you in the app as long as possible. So they need to figure out what you like. How are they going to do it? The moment that you sign up, you provide some demographics data. Your age, your gender, where you're signing up from all gives TikTok enough information to start assuming what your interests are going to be and populate your For You page.

Out of that first For You page, the topics that you engage with or don't engage with are going to give TikTok the information about what you might enjoy seeing on your For You page. After that, they're going to try to find related topics to the ones that you have expressed an interest in. For example, I really like cross-stitching.

It's not difficult to assume that I also like interior design or flower arrangements, which I do. TikTok shows them to me, and I stay on the app much longer than I should. Another point of information is your followed profiles and the topics that they talk about or that they are interested about. Your Discover tab behavior is a very strong signal for TikTok too.

What that means is when you search for a hashtag, click on a hashtag, make a TikTok search, search for a user or a trend or a TikTok sound, that's all giving strong information to TikTok about what you like because making a search or diving deeper into the content of a sound is much more complicated behavior than simply just scrolling past on your For You page.

What is the video about?

What is your video about?

Now that they know what you like, they know that they can serve you videos about it. But first they need to understand what the videos that they have in the database of content are about. To do that, they're going to use the visuals. So literally TikTok can "see" with the visual AI the content of your video. What are the objects that are in there?

Are there faces? What are the emotions of the faces? Is there a dog? Is there a chair? They're going to be able to see and process all of that. Another strong signal is going to be the text overlay that you put on your TikTok video, if you have any notes or any content put on there or if you're manually inputting the captions. The audio on your video is very relevant for TikTok to understand what the video is about, and by audio I don't mean TikTok sounds.

We're going to come back to that. I mean the actual voice, the words that you're saying or the ambient noise that sets the location of your video. The captions and hashtags that you use in the video are very relevant and help TikTok understand what it's about as well. When you are done with creating your video and you start typing it out, when you create the cover for your video using the TikTok tools, that gives TikTok that level of information.

Then we've got the TikTok sound. If you're using a TikTok sound that's related to a trend or to a topic, it also gives TikTok the information about what your content is, what the emotional tone of your content is, and so forth. All of these elements, as a hardcore SEO, are what we would treat as on-page SEO but on the TikTok side of things.

Is the video any good?

Is the video any good?

Now they know what you like, they know what their database of videos are about, but they also know that they have a limited amount of time for your attention. So they're going to want to show you only the best of the best of their content. They're going to have to understand if the videos they've got are any good. How are they going to do that?

They're going to be using, amongst other metrics, engagement. So the engagement of users that have expressed similar interest to yours are going to help TikTok predict your potential engagement and how much you're going to like the video. They're also going be favoring native content creation. So any video that's being created directly from TikTok using the TikTok tools is going to get a little bit of a boost.

The language that the content is in is very relevant too. When signing up for TikTok and creating your profile, you state what are the languages that you speak and what is your preferred language. TikTok can also understand this based on your behavior. Then the device that you're using and the strength of your connection also help TikTok serve you lighter videos and shorter videos when you're maybe on a train or don't have as good connection to actually have a good viewing session.

What isn't eligible "For You" page content?

Eligible for you page content

There is some stuff that TikTok does not want to see on their For You page. Any content created by a user that has stated that their date of birth is under 16 is not going to be eligible for the For You page. So if you're trying to be cute and giving your brand account a date of birth of when it was founded, don't because nobody is going to see it.

They're also quite strict with QR codes. They don't want to see any QR codes in there because of safety reasons. You don't know if that QR code is going to take your users to a spam website or a dangerous website showing porn or violent content. But also they don't want to miss out on the affiliate marketing payout that they get when you shop directly on the TikTok Shop.

Any dangerous or violent behavior is also not accepted or eligible for the For You page. So unless it's tagged as done by specialists, don't try this at home and so forth, it's not going to show up. Engagement bait content is also not eligible for the For You page. So content that tries to trick users into engaging with it without them actually naturally wanting to engage with it is going to be demoted from the page.

That type of content is like when on Instagram we used to see posts that said tap twice to see some magic, and the only magic is that you had liked the post and increased the engagement of the brand. That is the type of engagement bait that's not acceptable on TikTok. Another thing that they don't accept on their For You page is any content that shows tobacco products.

Is TikTok capable of breaking bubbles

TikTok breaking the bubbles

TikTok wants to show you videos that interest you and keep you in their platform, but they're also trying to not generate an echo chamber for you. Echo chambers are a very real risk of any recommendation algorithm that's based on interest and engagement, and we have seen a rise in radicalization across different populations because of this.

The way that TikTok is trying to address this problem is by offering random content of random interests, random creators that you've never seen before on your For You page. Initially, they said they were doing this about 10% of the time, but there aren't any current numbers about this activity. This is not enough to remove echo chambers because of the psychological effects of familiarity and their exposure effect.

Once you see something that does not quite fit right with your For You page, you're very quick to scroll. It is a similar phenomenon to banner blindness when we are going around the website. We kind of know what an ad looks like, and we don't even look in that direction. It's a similar effect.

So it is not enough, but one must appreciate that they're trying. If you have found this interesting, you can catch up with me and my content on Twitter @LidiaInfanteM, on LinkedIn looking for Lidia Infante, or on my website lidia-infante.com. Thank you for watching.

Video transcription by Speechpad.com

Thursday, June 15, 2023

Build an SEO Report in Seconds with Domain Overview

How to generate a snapshot SEO report in seconds with Domain Overview

Time. Resources. No matter the day, month, year, or algorithm update, these are 2 commodities of which SEOs will never have enough! We are perpetually searching for ways to systemize, automate, and simplify so that we can spend more time with the fun stuff - brainstorming and strategizing.

One of the most time-consuming SEO tasks is gathering all of your key metrics into one place. There are countless data points to consider when evaluating a site’s current SEO performance, from top keyword rankings to Domain Authority and link metrics.

Many SEOs will create custom SEO reports that are dedicated to tracking keyword rankings, technical SEO, and link signals over time. Creating a Campaign in Moz Pro is a great way to accomplish this! However, a Campaign is meant for the long game - you’ll conduct research, gather data, and discover actionable insights that shape your SEO strategy.

But if you’re looking to create a one-page report - within seconds! - that evaluates the SEO performance of a client website, a potential agency prospect, or a competitor without investing a significant amount of time and effort, Domain Overview is the answer.

What is Domain Overview?

Domain Overview allows you to enter any website domain and immediately understand the current state of a brand’s SEO standings. With this tool, you’ll be able to see key data points from tools within Moz Pro - all in one view - divided into 4 sections: Summary, Rankings, Competition, and Links.

During the beta phase, 91% of users found Domain Overview valuable, stating that it improved workflow efficiency, provided valuable insights of the most important metrics, and supported auditing websites for potential clients.

Image of Domain Overview metrics

How can you use SEO snapshot reports?

A snapshot comes in handy in a variety of situations! Let’s say, for example, I was in the market for a new home. A photo of the house, along with the square footage, bedrooms/bathrooms, address, and price would help me understand whether or not it’s worth my time to schedule an appointment with a real estate agent.

Similarly, Domain Overview will help you gain an understanding of a site’s basic yet holistic SEO performance, revealing whether or not a website is worth further time and research. You’ll quickly discover which keywords they rank for, what their Domain Authority and Page Authority scores are, domains the site has acquired backlinks from, and more.

Below are some potential use cases for the SEO snapshots that Domain Overview can provide:

Client prospecting

As an agency or SEO consultant, when you’re gearing up to pitch a new client, it’s important to prepare yourself with a baseline of their website’s data. Create a one-pager that you can share during a pitch or kickoff meeting and save time and impress your potential client!

Looking for more data than what a snapshot offers? The Domain Overview report provides links to the appropriate areas of Moz Pro where you can view the full and detailed data. For example, you can view all of the keywords that a site is ranking for in Keyword Explorer. This will give you a jump start on gathering data to uncover keyword and competitive SEO opportunities for your new client.

Image of site overview in Moz Pro

Competitor research

Competitor research is an effective method for generating content ideas, discovering link gaps, and ideally, stealing traffic from your competitors! With Moz Pro, you can create a Campaign for your domain or clients that you’ve onboarded, and track up to 3 competitors’ SEO efforts over time. Campaigns produce insights that allow you to spot trends and opportunities from collected data.

However, let’s back up just a bit (cue semi-trailer truck beeping). Before you dive into creating a Campaign, you may want to get a snapshot of a competitor’s current standings. How are they performing? What’s their DA? What do their keyword rankings look like? Are they worth tracking? Domain Overview answers all of these questions in seconds.

Or perhaps you find yourself in a situation where you need to demonstrate a competitor’s current standings to a client. This report will give your client a clear picture of what they’re up against, and empower you to make decisions on your strategy moving forward.

A quick SEO report for your domain

Domain Overview is like a launchpad. It organizes a preview of metrics from different areas of Moz Pro into a single view, which can be helpful to run for your own domain as well as competitor sites.

It can be a helpful way to find quick opportunities. Even while writing this post and punching our domain into the tool, I found a new 404 error that needed to be addressed with a redirect in the Links section of the tool.

Image showing the Links section of the Domain Overview tool

Start creating snapshot SEO reports

We created Domain Overview to gather all of the key metrics that can be helpful to SEOs and website owners into one place, and to create a launchpad into the various set of tools within Moz Pro. I know that I have already gotten value out of the ability to analyze domains so quickly. After a report is generated, I browse the data at a 30,000-foot-view and begin my investigations into SEO opportunities.

In my opinion, Domain Overview effectively mirrors the early phase of the SEO process: allowing you to assess data at a high level, and dig in deeper where you suspect there could be opportunity.

Tuesday, June 13, 2023

6 Local SEO Tasks for Summer Success

Homemade popsicle made of fresh berries

I hope this summer features at least a few lazy days for you, kicking back in the shade with loved ones and a pitcher of iced tea or a tray of homemade popsicles. But the next few months can also be a really exciting time to try out new local SEO and marketing tasks well ahead of the holiday season to see what’s resonating with your community in 2023. Here are 6 smart things to try that could sweeten your local business’ summer success.

1. Get on the Search Labs waiting list

Tweeted screenshot previewing the test of Google's SGE

No one likes standing in line, but there’s one queue you should get in this summer and that’s for Google Search Labs so that you can get the earliest possible access to the new Search Generative Experience (SGE), shown above in Joy Hawkins’ tweet linking to this early bird article. SGE is one of Google’s experiments at incorporating AI into their search results, and while the good news is that early testers are seeing local pack-like results for local SGE searches, the rankings of these “new packs” don’t match up point-for-point with traditional packs or organic results and that’s news your business needs to know. As Noah Learner reports:

Tweet stating that Noah Learner observed a 45%-65% overlap between SGE and traditional results

And as I reported back in April regarding Google’s AI chat Bard rollout, there is definitely some overlap between AI results and older layouts, but there are also some differences. Getting access to SGE so that you can work on puzzling out what causes those differences and understand how to earn top visibility in the new formats will be smart work for any local business.

Whether all of these AI experiments will fundamentally change your business operations or marketing practices remains to be seen. We’re all waiting to find out which products will actually move forward and how many customers will actually integrate them into their daily lives as they have with local packs, Google Maps, Apple Maps and other familiar features. While you’re in line, I recommend reading Greg Sterling’s piece, Google SGE: Meet the New Pack

2. Study the weather and serve the people

image of air conditioner attached to a building

If any part of your business or inventory ties to seasonality, you’re quickly learning that you can’t count on the weather anymore. In 2021, millions of people in Oregon and Washington were desperately hunting for air conditioners when their summer temperatures became 30-40 degrees above normal. Air conditioners just weren’t a “thing” in the Pacific Northwest before, but they are now.

Where I live in Northern California, the extreme drought had gone on for so long, memories of wet winters were fading into myth. Then we got inundated with such rain this past winter that people were scrambling for umbrellas, for wood chips to fill their flooded driveways so that cars wouldn’t sink, for sandbags and French drains. No one is sure what is going to happen when our massive snowpack melts here this year...

The thing about Climate Change is that it causes erratic weather, and we’re just not able to make statements any more like “England is a wet, cool country” or “New York gets heavy winter snowfall”, or “California is dry” and base our inventory on these “facts”. Many local businesses will need to re-think seasonality and activate a more fluid supply chain and inventory structure to accommodate for weather and conditions locals aren’t prepared for or accustomed to.

They may need to extend floorspace time for seasonal products, or at least warehouse them, to be brought out at time of need so that they can be the ones selling the air conditioners to Portland and Seattle and the galoshes to people in San Francisco. Even restaurant menus need to incorporate awareness, because diners may not want to eat cold salads in a wet, foggy summer, or hot chowder when the temperature at the coast is 116 degrees.

Ready your business to respond speedily to sudden changes, using social media and your website to let locals know that you - at least - are prepared to serve them in novel conditions. And don’t overlook how upset people are feeling about these changes. Use your voice to advocate for the transition to green energy in your community and in your nation so that the detriments of Climate Change are actually being addressed instead of simply reacted to on a town-by-town basis.

3. Put on your pro-active shorts

vintage ad depicting three surfer men wearing shorts at the beach

You’ve noticed that video is everywhere in the SERPs, right? When I looked at MozCast this morning, I saw that at least 23% of the searches we track are returning video results. In fact, at this moment in time, it appears that Google is returning videos more often than local packs in this snapshot of our data set:

screenshot of MozCast data showing 23% videos and 18.1% local packs in SERPs

This prevalence is playing a part in why many local SEOs are now recommending that local businesses include some form of video along with every new page they publish. I’d recommend taking that strategy one step further: create two videos for every new page or piece you publish. Why? Take a look at this YouTube result for the multi-location brand Patagonia:

screenshot of YouTube showing both long-form video content from a business and video shorts from the public

As you can see, the top video is one that’s been published by the actual company, but the new-ish Shorts section tells a different story. The brand has complete control over the messaging in their own videos, but what narrative is being built by the Shorts (videos of 60 seconds-or-less) lineup? Random customers (or non-customers) appear to be questioning the company’s prices, creating an atmosphere of controversy by hinting at revealing unknown information, and claiming that the business hates zippers. Is any of this accurate, relevant? Who knows. It doesn’t come from the brand. Meanwhile, two of the results have nothing to do with the business and are, instead, featuring Argentina.

If all of this is beginning to sound familiar, it’s because local businesses and their marketers have encountered this phenomenon before, in the form of Google Business Profile Q&A. When you leave it entirely up to the public to tell your brand story, you may end up with this:

Google business profile question with unhelpful answer from the public

What’s happening here is that a platform exists on which a business can create content, but that platform is being ignored by the business. Customers think the business should have content there to help them out, but where neglect is present, leads are being lost to unhelpful, random information from the public that is not designed to convert. This is one of the best examples I know of user generated content (UGC) gone wrong.

I’m a firm believer in the concept that the customers of customer-centric businesses tell the best brand stories. In fact, as we saw in Moz’s review survey, only 11% of people trust what brands say about themselves more than what customers say about them. I’m a huge fan of UGC and its powers of persuasion, but I also believe that brands should take control wherever they can.

So, this summer, as you’re uploading new product and service pages, refreshing your about page, updating your mission statement, or creating any new content around what your business is and does in your community, experiment with creating both:

  • A long-form video of whatever length that summarizes the content of the page and is uploaded to your YouTube channel

  • A video short that highlights the most important/sharable aspect of the content and is uploaded to the shorts section of your YouTube channel

These shorts can also become the basis of a TikTok feed for your business, if you want to go that way, or can be ideal for sharing on your other existing social channels. And don’t forget that you can upload videos to the image section of your Google Business Profiles! Note that there is debated about the actual length of these. Google’s guidelines say 30 seconds, but videos of over a minute have been spotted. Read this Twitter thread for more conversation on this topic:

Tweet showing the increasing prevalence of video in Google Business Profiles

4. Speaking of Google Business Profiles…

Google business profile for a luxury campground

Here are three tasks to enrich your profiles over the summer that will hopefully increase customer actions surrounding your listing:

  1. Add three new seasonal photos each month this summer. Many local SEOs believe dripping information to Google is a smart strategy for proving freshness. Even if your business doesn’t experience major seasonal changes, use your creativity to showcase your business in the summer sunshine.

  2. Write one new Google Update (formerly known as Google Posts) per week in June, July, and August. Sterling Sky found that Offer-type updates get the most clicks, so focus on your summer specials and discounts, create interest by mentioning that these are time-limited offers, and don’t forget to include a strong call-to-action of what you most want the customer to do after reading your Update.

  3. Check your hours! Many businesses have longer hours in summer, but even if yours don’t change, check your GBP (and other listings) for accuracy. Summer brings visitors to nearly every town. These folks don’t already know when you’re open or closed as locals might. You can keep everyone a happy camper by double-checking that your store hours are listed correctly so that no one is inconvenienced. This will also protect your brand from avoidable negative reviews. If you discover troubling inconsistencies in your hours across the local search ecosystem, consider signing up for Moz Local so that we can quickly distribute accurate information for your business to all the major local business listing platforms around the web.

5. Speaking of visitors to your town…

photo of a vintage Airstream

Motor associations and travel agents say that road trips will remain the top vacation choice for Americans this summer. Some day, I’d like to do a survey of how many reviews people write per each vacation they take. I know I’ve always personally enjoyed reliving my trips after returning home and taking a few minutes to leave reviews for local businesses that helped me out. But until I can poll the public on that, what I can tell you is that TripAdvisor found that travelers are 77% more likely to book a space in your RV park or a cabin at your lodge if you respond to the reviews you’ve already received. 77%!

I can also tell you that 96% of the summer visitors to your town will be reading local business reviews because that’s the percentage of the public that reads reviews in general. And they won’t just be looking at what wanderers like me say about your business. More than 90% will be moderately or extremely influenced by how your business is responding to reviews.

negative review awaiting owner response

If you know you’ve got a backlog of neglected reviews gathering dust in your most visible local business listings, pretend you’re in summer school (sorry, not fun!) and have the homework of writing a response to every review you’ve received in the past year. Tackle a batch every week until you’re caught up. Owner responses publish almost instantly, so you could immediately start benefiting from seasonal visitors seeing you responding to complaints and being there to solve problems. And if you keep up the good work as the year progresses, you’ll have the added benefit of being 100% responsive before the busy holiday season at year’s end. 

6. Communication is everything…and texting is easy!

screenshot of AAA article on communicating safety information to travelers

If you’re on the fence about whether this is the year your local business should invest in texting with customers, consider these stats compiled by my friend Aaron Weiche of LeadFerno:

  • 78% of customers want to text with your business

  • Texting is super fast - 90% of people open texts within three minutes of receiving them

  • 65% of your potential customers will have more positive feelings about your business if you offer text messaging as a mode of communications

There is so much information you could be communicating to customers this summer about your product availability, seasonal amenities, safety protocols, and satisfaction guarantees. You’ll find thousands of articles on the web about relationship-building being the core of good marketing, and the mass adoption of cell phones puts the easiest possible mode of communication right in all of our pockets or hands. In fact, 88% of survey respondents say texting is the main reason they use cell phones, and multiple surveys indicate that it’s become customers’ preferred means of conversing with businesses. This summer would be a great time to make life easier for your customers and your business by opening your text lines for fast and effective communication.

Making local business sun tea

SERP result with recipes for sun tea

Most of the tasks we’ve focused on in today’s column can be implemented relatively speedily for near-immediate benefits to your business. But nearly all of them have an added bonus: local business improvements can also brew slowly, like sun tea. You pop some tea bags and water in a jar and leave them to steep on the patio, and the longer they develop, the richer the taste of the brew. It adds up over time if you’re regularly refining your inventory for changed demand and using features like Google updates to offer specials on your deals. It amounts to something if you’re regularly responding to reviews, building a video library, and being responsive to customers via convenient texting.

These efforts don’t vanish like summer lightning. They gently build habits, content, and connections that should stand your local business in good stead in all seasons. Little efforts add up and even small improvements in your business operations can mean a lot to your customers. Cheers to your business and community this summer. Hope it’s a good one!

Friday, June 9, 2023

How to Explain the Value of SEO to Executives — Whiteboard Friday

In today’s episode of Whiteboard Friday, Seer Interactive’s Larry Waddell discusses how you can translate the SEO work you do for your clients into how executives think of value — specifically, business value.

How to explain the value of SEO to executives

Click on the whiteboard image above to open a high resolution version in a new tab!

Video Transcription

Hello, Moz community, and welcome to another edition of Whiteboard Friday. I'm Larry Waddell, EVP of Business Strategy for Seer Interactive, and today I want to talk to you about how to translate the great work you do for your clients into how they think of value, specifically business value.

So let's jump right in. Now to do it, I'm going to review two frameworks or two ways of thinking. One is the value pyramid. That's where we're going to start. But then we're going to move from there to the four forms of business value, and I'll walk you through that.

So starting with the value pyramid, and this is something I've used at Seer for years, and I've had the great privilege of leading the Analytics team at one point in time, the SEO team, thank you Wil, and the Paid Media team, thank you, Crystal, and through all of that, I've used a very simple construct. As you can see, there's nothing terribly fancy here, but it's a way to help our teams understand the work that they do and to understand the work the clients are asking us to do.

So to start, it's a pyramid like any other, four different layers, and for SEO you can think about the bottom layer as something like link building. It's something very important to do, extremely important, but perhaps at the bottom of the pyramid. Link building we get rankings. With rankings, we get traffic.

Traffic gets us engagement on the website. But we don't stop there of course. Engagement on the website and traffic, now we want to focus on conversions. Now we get those conversions and depending on what our conversion value is, that gets us to revenue. So really nothing earth-shattering there. But I want to introduce a couple other concepts. So you might want to think about titles at your clients.

So if you're down here, perhaps at the bottom of the value pyramid, maybe it's link building, maybe it's other low-level but very important tasks, you might be dealing with somebody who's a specialist or a manager at your client day to day. As you move up this pyramid, where you're talking about things like revenue and you've been in those meetings, you've had these people join your QBRs or they pop into a weekly call or a monthly call, and they have titles like director or VP or CMO.

Every once in a while, you might get a director of finance or a CFO in those meetings. You might also have noticed that those meetings tend to be more strategic. They tend to be focusing on things other than the nitty-gritty tactical that you might be grinding out day to day with your manager at the client.

These folks are worried about business problems. They're worried about things that are impacting the trajectory of the overall business, of which SEO plays a very important part. Down here, perhaps less visibility into those things at the client, but down here we're focused more on SEO problems, rankings, how much traffic are we getting, what are our conversions, content on the site, load speeds, and those sorts of things.

It's not that these folks don't care about that. They're just perhaps removed from it, and they don't necessarily understand how any of this stuff down here impacts the stuff that they care about unless we have a lot of explanation and we've all been there. So what do we do with something like this? Well, we can start to think about a hypothesis around value.

What if there's greater perceived value on the part of these folks at the client, the higher up this pyramid you happen to be? So down here, again, important but perhaps less perceived value than strategic conversations that relate to business problems at your client. So what are the things to worry about down here?

There's actually a lot to worry about down here. So in my experience, if you have engagements that tend to focus mostly on talking about, reporting on, and reviewing activity at the bottom of the value pyramid, you can get locked into just doing that for your client.

The way I like to think about it is this is the big kids table or the adults table perhaps. How do we get a seat at that table? Again, in my experience, if these folks don't see a way to translate what you do into what they care about, you kind of get relegated down here.

Again, there's nothing wrong with it. But the problem is, if we look at fee competition, it tends to be the case that there's higher fee competition down here than there is up here. There tends to be more competitors down here. There's less differentiation between providers down here. You're more susceptible to being ChatGPTed, for example.

You're more susceptible to getting big data out or automated out. You've seen some nibbling around the edges around things that you might characterize as tactical. More and more of it is becoming automated or good enough automation. Maybe it's not perfect, but it's good enough. Then I can save some money because down here there's high fee competition.

You can see the robot there coming to get us. So the thing that we need to do is think about how we move up this pyramid, both in the work that we do and how we talk about the work that we do with clients. So, again, that's moving up the value pyramid and tying more of our work to the business problems that these folks, VPs, CMOs, directors, CFOs care about.

Another way to think about this too is career progression. So if you start off in SEO, you might start down here. You might start doing content audits, and you might start doing link building and things like that. Again, very important things to do. But then over time, this also creates a path for you to sort of think about where you can go as you start to unpack a little bit more of how progressively more sophisticated work you can be doing for clients translates to value for these people, because it turns out these people control the budget.

So you might also have discovered that when it's time for renewals or pitching work, that oftentimes there's a big boss and that big boss sits up here, typically not down there. So that gets us to value. Now, when we think about conversions and we're thinking about revenue generated from our work on a client website, we tend to focus on the revenue of that, and revenue is extremely important.

We can't get anywhere if we're not generating revenue or more revenue for our clients. So revenue for the win. You can see it right there. Well, yes and no, and that gets us to the four types of business value. So there are at least four.

There's a fifth that I'll touch on briefly in a moment. But for the most part we can increase revenue, but ah, not so fast, gross profit. We can reduce cost. We can do something which is called cost avoidance. We can help our clients avoid cost. Then there's insurance value.

In my time at Seer, I've found us in projects that do one or more of these things, oftentimes without our team even realizing that they're creating this additional value. Now down here there's a little bit of an economics lesson, and this is called a utility curve.

I'll get to why that's important in a second, and it'll help me explain why some of these things over here create value, how that actually happens. But let's go back to increasing revenue, gross profit. So questions you can think about if you're focused here. Are you generating more profits for your client, or are you stopping at revenue?

I suggest we take a pause to really consider that. We've had situations where we might be generating more revenue for the client, but it turns out that the unit economics are such that at the gross profit level, the client might be losing money on everything we help the client sell. So even though everything over here has been geared towards up and to the right, better rankings, more traffic, higher engagement, more conversions, more revenue, all for naught if the thing we're selling has crazy shipping costs and the shipping costs are turning out to be a loser for the client.

This person might not be aware of that, but these people might. So you kind of see how understanding a little bit more of what happens at this level can help you put what you're doing here in greater context. So when I talk about gross profit, gross profit is basically revenue minus cost of goods sold or COGS generally speaking.

That's gross profit. The thing to bear in mind is that gross profit pays the rent, not revenue. You still have to pay for the cost of the thing that your client produces, and what's left over is what actually covers other expenses. We don't often think that way when we're doing SEO projects, and we're strictly focused on revenue.

Might want to think about gross profit or asking these kinds of questions, which is a signal. So that's the other thing about this. We don't have to become experts necessarily in our clients' businesses, but maybe asking better questions once we're in the meetings up talking about this stuff with these people that signals, "Hey, I know your business. I understand that there's more going on than just the SEO."

Next is reducing cost. So reducing cost increases value, and that's where this comes in. It's a very simple concept and well-proven that the gain that one might get from a little bit more of something doesn't feel as good as losing a bunch really stinks.

So that's called loss aversion. So it works in such a way that adding a little bit more profit makes the client better off. Losing profit can hurt a lot. It's a concept that's going to be helpful and let me sort of step you through it in more detail.

So if you reduce cost and we make recommendations to our clients all the time. We don't always realize that those clients necessarily are saving more money from what we do. It's a useful thing, but all of our charts over here have to go up and to the right. We don't necessarily report on how much money I saved you.

We tend to report on how much revenue I generated. But there are sometimes conversations and recommendations that we can have with the clients that could be either new tools they can procure, or maybe there are things that we can be doing for a client, like content creation, that we can do at a lower cost than the client can do at another agency or even with an internal team.

So I gave a quick example here. So imagine you have a client that happens to be valued at 10 times their net income let's say. If we save that client $1,000, that might be, "Oh, great." One little thing I threw into an update at the end of the month as I'm talking about the revenue I'm generating, but the CFO will immediately recognize, "Oh, I'm valued at 10x. They just increased the value of my business by $10,000."

That might not be something that ever enters into the conversation if we're just thinking about the SEO work that we do, but we just created a lot of value for somebody. The other one is cost avoidance. This is a tricky one. But this basically means what are the recommendations we can make for a client that will allow them to not spend money on something in the future.

Quick example, some time ago we had a client that was faced with a choice. They were running a m-Dot site and their dot-com for desktop, and they maintained them both. But it came time to upgrade their CMS, and they had two options. One, they could upgrade both systems and continue to maintain a separate mobile and desktop experience.

But if they did that, they would have to hire additional developers and another agency to maintain both sites. The other option was to have a fully fluid site, a dynamic site that allowed them to avoid all that cost. We helped them understand which might be better for their SEO, but using this framework, also which might be better from an expense standpoint.

They chose to do option number two. They avoided all that extra expense, and that was cost avoidance. The reason why that's tricky is because it's hard to prove the counterfactual. We don't know what they literally would have spent had they done both sites, but we know what they budgeted and we said, "Hey, by following this other recommendation, you avoided having to pay this."

That's actually budget savings. Budget savings means, back to our utility curve, that their profit went up, made them better off, possibly also allowed them to increase the value of their business. Lastly, there's insurance, and this is one that is not terribly intuitive until you think about it.

So imagine you have a client that is contemplating a site relaunch. They have an internal SEO team, and they're very confident in their abilities, but they might not have a lot of experience or maybe not as much experience as you in a migration or the site relaunch. So your client might engage you to have a short-term project to help augment the capabilities of their internal team, maybe check on things, maybe be there the night of the conversion, and those sorts of things.

Now it's an additional expense. So this person here might say, "Oh, I don't know if I can get another agency through procurement because we already have an internal team helping us on our migration." But the CFO might say, "Oh no, this is insurance. I will gladly pay an insurance premium to avoid a massive loss if this website is generating a lot of revenue or gross profit for me," because they do that all the time. If you think about all the insurance that a business might spend money on, explaining that SEO project or that technical SEO support project in the context of insurance might make a ton of sense to them if you've been invited to that table and you can explain what you do within that context.

So here, I won't get into the details, but what I will show you is that you will gladly pay this little bit of premium, in other words, your contract to support their internal team. The client might gladly pay that to avoid the possibility of a large loss. So you just have to convince the client that your presence will actually prevent that loss.

That's insurance and that's value for your client. So that's about it. To recap, think about the work that you do and how to translate that into the business challenges that these folks are grappling with. So they might just pop into your QBR or pop into your monthly meeting. They might not understand Penguin and BERT and ChatGPT or any of that stuff, but they do understand what's going to make me more money, gross profit, what's going to save me money, what's going to help me avoid some nasty costs I would really rather not pay, and what's going to insure me.

How are you going to watch my back and prevent some larger loss later? So basically back to where I started, how do you translate your SEO expertise into the language of your client executives? Thank you very much.

Learn more about creating value for clients here

Video transcription by Speechpad.com

Wednesday, June 7, 2023

B2B SEO in 2023: What's New and How to Adapt Your Strategy for Success

In the fast-paced digital landscape of 2023, having a strong online presence is crucial for B2B companies to drive traffic, generate leads, and stay competitive. SEO is pivotal in achieving these goals. This blog post (and its accompanying comprehensive guide) aims to provide B2B marketers, SEO specialists, and business owners with the knowledge and tools necessary to create a successful B2B SEO strategy in 2023. From understanding the latest trends and challenges to implementing effective keyword research, on-page optimization, backlink building, result analysis, and staying up-to-date with SEO trends, let’s discuss what actually “moves the needle” in B2B SEO.

Understand the B2B SEO landscape in 2023

The SEO landscape is constantly evolving, driven by updates to search engine algorithms, changes in user behavior, and the increasing influence of voice search and AI. To create an effective B2B SEO strategy, staying informed about the latest trends is essential. Some key trends in 2023 include:

Mobile-first indexing

With the majority of internet users accessing websites through mobile devices, search engines like Google prioritize mobile-friendly websites in their rankings. This was rolled out years ago, but it is the case across all industries. The B2B industry usually does have a slightly larger audience that views content and websites on desktops (due to the target audience usually being at work when they are researching companies or vendors). However, many still do check their email, conduct research, and view websites on their phones and tablets just as often.

Voice search optimization

As voice search is still widely used with smart devices and now some vehicles (such as Toyota’s new operating system for their lineup, which allows drivers and passengers to look up questions, businesses, and other information from their vehicle’s infotainment system), B2B companies need to optimize their content for voice queries. This involves incorporating natural language, long-tail keywords, and structured data markup to increase visibility in voice search results.

AI in search and marketing

ChatGPT has blossomed in popularity over the last year, reaching a new record for the fastest-growing user base in February 2023, according to Reuters. It now has over 1.16 billion users, according to DemandSage. OpenAI, the owners of ChatGPT, are said to be rolling out a business/enterprise level for organizations who want to make ChatGPT’s offerings available to employees via an encrypted platform (so they can share proprietary information that remains secure), and Microsoft plans to use its technology to let enterprise organizations “create their own” ChatGPT so information stays secure.

Additionally, Google announced at Google I/O in May 2023 that it plans on adding more AI experiences in user’s search journey on Google. This is likely the biggest development with search engine results pages (SERP) changes we’ve seen in a while.

User experience and core web vitals

Search engines increasingly focus on user experience metrics, such as page load speed, mobile responsiveness, and interactivity. Optimizing these factors improves both search rankings and user satisfaction. In 2023 and beyond, a user is much more likely to exit out of a slow page load experience within seconds, figuring they will just find the information they need elsewhere.

Continuous Google algorithm updates

Luckily for those in the SEO industry, Google has started announcing some of their bigger algorithm changes and updates, including when they are going to be taking place. To stay updated with Google changes, be sure to bookmark our Google Algorithm Update History page.

SEO, no matter the industry, is always evolving, so it’s important to regularly read SEO publications (like the Moz Blog), learn from subject matter experts in the space, and continue to stay on top of updates so your strategy can pivot accordingly

Conduct keyword research

Keyword research forms the foundation of a successful B2B SEO strategy. It involves identifying the keywords and phrases potential customers use to find products or services in your industry. To conduct effective B2B keyword research in 2023, consider the following steps:

Understand your target audience

Develop buyer personas and identify their pain points, needs, and search intent. This insight helps you choose keywords that align with your audience's interests. It’s important to pay attention to the “curse of knowledge” and don’t assume your audience has the same level of knowledge about your product that you do. Just because you know how your products work (or that they even exist) doesn’t mean that your audience does. This is a unique opportunity for SEOs to identify the operating knowledge of their target audience so they can best produce content that answers their search queries.

Utilize keyword research tools

Tools like Moz Keyword Explorer provide valuable data on search volume, keyword difficulty, and related keywords. Leverage these tools to identify high-potential keywords. It’s also important to look at your own data in Google Search Console or Google Analytics 4 (GA4). Today’s keyword research is becoming more and more accurate when compared to search engines, and these are all invaluable tools forSEO and keyword-related research.

Focus on long-tail keywords

Long-tail keywords are longer and more specific search queries that tend to have lower competition. Targeting these keywords can help you reach niche audiences and generate high-quality leads. Most B2B product offerings serve a niche purpose, so try to go after keywords that explain the problem or solution of your product or service instead of its name.

For instance, if your company was an “iPaaS” (integration platform as a service), going after keywords around integration, data architecture, and application integration would likely get more traction than repeatedly building content around the term “iPaaS”.

In order to complete effective keyword research, you have to know where to start. Better target audience identification, high-quality tools, and a focus on keywords that users are actually searching for (which are usually problem- or solution-oriented) can help B2B SEOs get the right phrases they need to bring in more users and potential leads.

Optimize on-page content

On-page optimization involves making your website and its pages search engine-friendly. Here are some best practices to optimize your on-page content:

Meta title tags

Craft compelling, concise, and keyword-rich title tags and meta to briefly describe your page's content and entice users to click within 70 characters. The advice on whether or not to include your business name in a meta title tag still isn’t concrete, but if you have the character space, include it at the end after a pipe: |.

Meta descriptions

It’s best practice to write compelling meta descriptions, because that first paragraph on your page not only tells the reader what your content is about, search engines also pull it into the search snippet in a SERP. It is known that Google frequently rewrites meta descriptions, but it’s still worthwhile to spend about 180 characters describing the page so search engines, and search engine users have a good idea of what it’s about.

Header tags

Use header tags (H1, H2, H3, etc.) to structure your content logically and improve readability. Include relevant keywords in your headers to signal the topic of each section. This can also serve as a table of contents if your blog article formatting allows it, improving readability for longer pieces of content (usually over 2000 words). Header tags also get pulled into the SERP and can be used in SERP features such as the ‘People Also Ask’ feature, if they are used in a question-answer format.

Image optimization

Optimize images by compressing their file sizes (for a better page load experience), using descriptive file names, and adding alt text that includes relevant keywords. This helps search engines understand and index your visual content. It also helps make images more accessible to users with visual impairments.

Site architecture

Good site architecture is essential for SEO success because it helps search engines and users find your website pages easier. By doing this, effective site architecture improves user experience, facilitates efficient crawling and indexing by search engines, distributes page authority effectively, and contributes to website speed and performance.

Meta titles and descriptions, headers, and site architecture may seem like SEO 101, but they are still valuable cornerstones to properly optimized content that is going to get indexed faster by search engines and have a longer time on-site for users. Google has preached time and time again about always doing what’s best for users and making sure content is fast, findable, and easy to read checks all the boxes.

Build quality backlinks

Backlinks remain a critical factor in B2B SEO, as they signal the credibility and authority of your website. However, it is essential to focus on quality rather than quantity. Consider the following strategies for building quality backlinks:

Create link-worthy content

Produce high-quality, informative content that provides value to your target audience. This increases the likelihood of other websites linking to your content as a valuable resource. Consider running your own research studies for new industry data that others will want to share, or create infographics, white papers, and other guides.

Split content into separate areas (when it makes sense)

This strategy won’t work for everyone, but if you are at a large organization, it might make sense from a site architecture standpoint to separate different types of content.

For example, Moz has the SEO Learning Center and Blog, and the strategy (and the types of content we produce for each) varies. Many large corporations also have a press mentions section, as well as a media/PR blog, where they release company announcements or press releases.

This helps news outlets and other organizations parse and subscribe to whatever type of content section they’d like. You can see Moz’s “News & Press” page for an example of this type of content area.

When it’s easier for news outlets and others to find your company announcements, they are much more likely to find and link to them more quickly and easily. It’s all about getting users the information they need quickly.

Partnerships

If your executive leadership team agrees to it, working with other organizations that cater to your same target audience but aren’t competitors can be a great way to get more exposure (and traffic) to your brand. Partnerships can entail sending a dedicated email about the other brand to your email list (and they do the same), or collaborating on a promotion through other marketing channels (such as blog posts, white papers, or videos) to get more leads and engagement.

Many organizations still buy backlinks, but in my experience, this is a risky and low ROI strategy. Companies that offer this can’t promise backlinks from high-quality places, and the ones that do may be using nefarious tactics (such as not fully disclosing links in the content they are sharing with the other website to get a link). It’s usually best to think of link building as an inbound strategy, rather than outbound.

Partnerships can be fruitful, but it takes it a lot of planning to make them reputable and pay off for both sides of the deal.

The end game: Optimization to drive results

From on-page optimization to working on your backlink strategy, SEO is truly a sum of its parts: it’s only as good as each component. To see where you're making the most headway, all of the above efforts need to be tracked properly with accurate revenue attribution so you can see where SEO is moving the needle for your B2B organization. To learn more about measuring and analyzing results, visit the measuring success chapter in Moz’s ‘Beginner’s Guide to SEO’ and learn more about measuring organic search traffic quality from Adriana Stein.

Once you have a good understanding of where SEO is making the most impact, you can choose what to prioritize in upcoming quarters and long-term future planning. This can help your B2B SEO efforts compound over time, as most parts of SEO utilize one another to work more effectively. For example, a better site architecture and experience will likely lead to more users linking to your content. Make sure you have a well-rounded program to ensure better results over time.

Monday, June 5, 2023

The Moz Links API: Touch Every Endpoint in Python

The purpose of this Jupyter Notebook is to introduce the Moz Links API using Python. This should work on any notebook hosting environment, such as Google Colab.

If you’re looking at this on Github, the code snippets can be copy/pasted into your own notebook environment. By the time you’ve run this script to the bottom, you will have used every Moz Links API endpoint, and can pick the parts you want for your own project. The official documentation can be found here.

Confused? Be sure to check out my intro to the Moz Links API.

Do global imports

The import statements at the top of a Python program are used to load external resources that are not loaded by default in the Python interpreter. These resources may include libraries or modules that provide additional functionality to the program.

Import statements are usually placed at the top of a program, before any other code is executed. This allows the program to load any necessary resources before they are needed in the program.

Once the resources have been loaded using import statements, they can be used anywhere in the program, not just in the cell where the import statement was written. This allows the program to access the functionality provided by the imported resources throughout its execution.

The libraries here not part of the standard Python library are requests and sqlitedict. You can install the with pip install requests and pip install sqlitedict in your terminal or a Jupyter cell. If you’re using Anaconda, requests is pre-installed.

import json
import requests
from headlines import *
from pprint import pprint
from sqlitedict import SqliteDict as sqldict

Load login values from external file

The code below reads a file named “linksapi.txt” from the “assets” directory, which contains the login credentials, including the access ID and secret key needed to access the Moz API. These credentials are extracted from the file and assigned to two variables named ACCESSID and SECRETKEY. The with statement is used to ensure that the file is properly closed after it’s been read. Create a file whose contents look like this with your credentials manually retreived from moz.com:

ACCESSID: mozscape-1234567890
SECRETKEY: 1234567890abcdef1234567890abcdef

Once the credentials are extracted from the file, they are stored in a tuple named AUTH_TUPLE. This tuple can be used as an argument to the Moz API functions to authenticate and authorize access to the data.

The purpose of this approach is to avoid hard-coding sensitive login credentials directly in the program, which could pose a security risk if the code was shared or published publicly. Instead, the credentials are kept in a separate file that is not included in the repository, and can be easily created and updated as needed. This way, the code can be shared without exposing the credentials to the public.

with open("../assets/linksapi.txt") as fh:
    ACCESSID, SECRETKEY = [x.strip().split(" ")[1] for x in fh.readlines()]

AUTH_TUPLE = (ACCESSID, SECRETKEY)  # Don't show contents

Configure variables

In this code, there are several configuration variables that are used to set up the API call to the Moz Links API.

The first variable, COMMON_ENDPOINT, is a constant that stores the endpoint URL for the Moz API. The second variable, sub_endpoint, is a string that represents the endpoint subpath for the anchor text data, which will be appended to the COMMON_ENDPOINT URL to form the complete API endpoint URL.

The fourth variable, data_dict, is a dictionary that contains the parameters for the API request. In this case, the data_dict specifies the target URL for which we want to retrieve anchor text data, the scope of the data (in this case, page-level), and a limit of 1 result.

Finally, the json_string variable is created by converting the data_dict dictionary into a JSON-formatted string using the json.dumps() function. This string will be used as the request body when making the API call.

These variables are used to configure and parameterize the API request, and can be modified to perform any data_dict request against any Moz Links API sub_endpoint.

COMMON_ENDPOINT = "https://lsapi.seomoz.com/v2/"
sub_endpoint = "anchor_text"
endpoint = COMMON_ENDPOINT + sub_endpoint
data_dict = {"target": "moz.com/blog", "scope": "page", "limit": 1}
json_string = json.dumps(data_dict)

Actually hit the API (ensure success)

In JupyterLab, the last line of a code cell is automatically printed to the output area without requiring an explicit print() statement. The code you provided is using the requests module to send a POST request to a URL url with data in the form of a JSON string json_string. The authentication details are passed using the AUTH_TUPLE variable.

After sending the request, the response object r is printed using the print() statement. This will print the HTTP status code, such as 200 for success, 404 for not found, etc., along with the response headers.

Finally, the .json() method is called on the response object response to parse the response data as JSON and return it as a Python dictionary. This dictionary can be assigned to a variable, used for further processing, or simply printed to the output area without requiring an explicit print() statement due to JupyterLab’s automatic printing behavior for the last line of a code cell.

response = requests.post(endpoint, data=json_string, auth=AUTH_TUPLE)
pprint(response.json())

Outputs:

{'next_token': 'JYkQVg4s9ak8iRBWDiz1qTyguYswnj035nqjRF0IbW96IGJsb2e58hGzcmSomw==',
 'results': [{'anchor_text': 'moz',
              'external_pages': 7183,
              'external_root_domains': 2038}]}

List Sub-endpoints

This code defines a list of different sub-endpoints that can be appended to a common URL prefix to make different API endpoints. An API endpoint is a URL where an API can be accessed by clients. It is a point of entry to the application that acts as a gatekeeper between the client and the server. Each endpoint is identified by a unique URL, which can be used to interact with the API.

In this code, the list of sub-endpoints is defined in the sub_endpoints variable, and each endpoint is represented as a string. The for loop iterates over the list, prints the index number and name of each sub-endpoint using the print function, and increments the index by 1. The enumerate function is used to generate a sequence of pairs consisting of an index and a value from the list.

This code is useful for exploring the available endpoints for a particular API and for selecting the endpoint that corresponds to the desired functionality. By changing the sub-endpoint in the URL, clients can access different resources or perform different operations on the server.

sub_endpoints = [
    "anchor_text",
    "final_redirect",
    "global_top_pages",
    "global_top_root_domains",
    "index_metadata",
    "link_intersect",
    "link_status",
    "linking_root_domains",
    "links",
    "top_pages",
    "url_metrics",
    "usage_data",
]
for i, sub_endpoint in enumerate(sub_endpoints):
    print(i + 1, sub_endpoint)

Outputs:

1 anchor_text
2 final_redirect
3 global_top_pages
4 global_top_root_domains
5 index_metadata
6 link_intersect
7 link_status
8 linking_root_domains
9 links
10 top_pages
11 url_metrics
12 usage_data

Human-friendly labels

This code defines two lists: names and descriptions. The names list contains human-friendly labels for the set of sub-endpoints, while the descriptions list provides a brief description of each endpoint. The two lists are kept in the same order as the points list defined earlier in the code.

By keeping the three lists in the same order, they can be “zipped” together into a single list of tuples using the zip function. This produces a new list where each tuple contains the name, endpoint, and description for a particular API endpoint. This makes it easy to display a user-friendly summary of each API endpoint with its name and description.

The zip function combines the elements of the three lists element-wise, creating a tuple of the first elements from each list, then a tuple of the second elements, and so on. The resulting list of tuples can be iterated over, and each tuple unpacked to access the individual name, endpoint, and description elements for each API endpoint.

names = [
    "Anchor Text",
    "Final Redirect",
    "Global Top Pages",
    "Global Top Root Domains",
    "Index Metadata",
    "Link Intersect",
    "Link Status",
    "Linking Root Domains",
    "Links",
    "Top Pages",
    "URL Metrics",
    "Usage Data",
]

descriptions = [
    "Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.",
    "Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.",
    "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",
    "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",
    "This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)",
    "Use this endpoint to get sources that link to at least one of a list of positive targets and don't link to any of a list of negative targets.",
    "Use this endpoint to get information about links from many sources to a single target.",
    "Use this endpoint to get linking root domains to a target.",
    "Use this endpoint to get links to a target.",
    "This endpoint returns top pages on a target domain.",
    "Use this endpoint to get metrics about one or more urls.",
    "This endpoint Returns the number of rows consumed so far in the current billing period. The count returned might not reflect rows consumed in the last hour. The count returned reflects rows consumed by requests to both the v1 (Moz Links API) and v2 Links APIs.",
]

# Simple zipping example
list(zip(names, sub_endpoints, descriptions))

Outputs:

[('Anchor Text',
  'anchor_text',
  'Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.'),
 ('Final Redirect',
  'final_redirect',
  'Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.'),
 ('Global Top Pages',
  'global_top_pages',
  'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),
 ('Global Top Root Domains',
  'global_top_root_domains',
  'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),
 ('Index Metadata',
  'index_metadata',
  'This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)'),
 ('Link Intersect',
  'link_intersect',
  "Use this endpoint to get sources that link to at least one of a list of positive targets and don't link to any of a list of negative targets."),
 ('Link Status',
  'link_status',
  'Use this endpoint to get information about links from many sources to a single target.'),
 ('Linking Root Domains',
  'linking_root_domains',
  'Use this endpoint to get linking root domains to a target.'),
 ('Links', 'links', 'Use this endpoint to get links to a target.'),
 ('Top Pages',
  'top_pages',
  'This endpoint returns top pages on a target domain.'),
 ('URL Metrics',
  'url_metrics',
  'Use this endpoint to get metrics about one or more urls.'),
 ('Usage Data',
  'usage_data',
  'This endpoint Returns the number of rows consumed so far in the current billing period. The count returned might not reflect rows consumed in the last hour. The count returned reflects rows consumed by requests to both the v1 (Moz Links API) and v2 Links APIs.')]

Show an example request for each endpoint

This is a list of API requests in Python dict format, where each dictionary represents a request to a specific endpoint. Don’t hurt your brain too much trying to read it. Just know that I lifted each example from the original Moz documentation and listed them all here in order as nested Python dicts.

You could call the format is a dict of dicts, where each sub-dictionary corresponds to a specific endpoint, same order as the sub_endpoints, names, and descriptions lists for easy combining. The output of running the below cell is doing that list-combining to document every sub_endpoint.

dict_of_dicts = {
    "anchor_text": {"target": "moz.com/blog", "scope": "page", "limit": 5},
    "links": {
        "target": "moz.com/blog",
        "target_scope": "page",
        "filter": "external+nofollow",
        "limit": 1,
    },
    "final_redirect": {"page": "seomoz.org/blog"},
    "global_top_pages": {"limit": 5},
    "global_top_root_domains": {"limit": 5},
    "index_metadata": {},
    "link_intersect": {
        "positive_targets": [
            {"target": "latimes.com", "scope": "root_domain"},
            {"target": "blog.nytimes.com", "scope": "subdomain"},
        ],
        "negative_targets": [{"target": "moz.com", "scope": "root_domain"}],
        "source_scope": "page",
        "sort": "source_domain_authority",
        "limit": 1,
    },
    "link_status": {
        "target": "moz.com/blog",
        "sources": ["twitter.com", "linkedin.com"],
        "source_scope": "root_domain",
        "target_scope": "page",
    },
    "linking_root_domains": {
        "target": "moz.com/blog",
        "target_scope": "page",
        "filter": "external",
        "sort": "source_domain_authority",
        "limit": 5,
    },
    "top_pages": {"target": "moz.com", "scope": "root_domain", "limit": 5},
    "url_metrics": {"targets": ["moz.com", "nytimes.com"]},
    "usage_data": {},
}

for i, sub_endpoint in enumerate(sub_endpoints):
    h1(f"{i + 1}. {names[i]} ({sub_endpoint})")
    print(descriptions[i])
    h4("Example request:")
    pprint(dict_of_dicts[sub_endpoint])
    print()

Outputs:

# 2. Final Redirect (final_redirect)

Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.
Example request:

{'page': 'seomoz.org/blog'}

[...]

Write a function that hits the API

If we’re going to hit an API over and over in mostly the same way, we want to spare ourselves re-typing everything all the time. That’s why we define functions. That’s the def in the below cell. Once that cell is run, the moz() function can be used anywhere in this Notebook. You need only feed it the sub_endpoint you want to use and a Python dict of your request. It will return the API’s response.

def moz(sub_endpoint, data_dict):
    """Hits Moz Links API with specified endpoint and request and returns results."""
    json_string = json.dumps(data_dict)
    endpoint = COMMON_ENDPOINT + sub_endpoint
    # Below, data is a string (flattened JSON) but auth is a 2-position tuple.
    response = requests.post(endpoint, data=json_string, auth=AUTH_TUPLE)
    return response

This does not output anything to the screen. It just defines the function.

Conditionally hit the API

The code uses a Python package calledb which provides a persistent dictionary-like object that can be stored on disk using the SQLite database engine. The with statement in the code sets up a context manager for the SqliteDict object, which automatically handles opening and closing the database connection. The database file is stored at ../dbs/linksapi.db

The code iterates through each sub-endpoint in the sub_endpoints list, and checks if that data has already been retrieved. If it hasn’t, the API is called using the moz() function and the result is saved in the SqliteDict. The db.commit() statement ensures that any changes made to the dictionary during the iteration are saved to the database.

The SqliteDict serves as a local cache to prevent the API from being hit every time the code block is run if the data has already been collected. By using this cache, the code reduces the number of API requests required, which is useful when working with APIs that have quota limits. Congratulations, you’re using a database!

with sqldict("../dbs/linksapi.db") as db:
    for sub_endpoint in sub_endpoints:
        if sub_endpoint not in db:
            print(sub_endpoint)
            result = moz(sub_endpoint, dict_of_dicts[sub_endpoint])
            db[sub_endpoint] = result
            db.commit()
            print("API hit and response saved!")
            print()
h2("Done")

This does not output anything to the screen. It saves the results of the API-calls to a local database.

Show the locally-stored API responses

This code uses the sqldict context manager to open the SQLite database containing the previously retrieved API data. It then iterates over the keys in the database, which correspond to the endpoints that were previously retrieved.

For each key, the code prints the endpoint name, description, and the data retrieved from the API. The pprint function is used to print the JSON data in a more human-readable format, with indentation and line breaks that make it easier to read.

with sqldict("../dbs/linksapi.db") as db:
    for i, key in enumerate(db):
        h1(f"{i + 1}. {names[i]} ({key})")
        print(descriptions[i])
        print()
        pprint(db[key].json())
        print()

Outputs:

1. Anchor Text (anchor_text)
Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.

{'next_token': 'KIkQVg4s9ak8iRBWDiz1qTyguYswnj035n7bYI0Lc2VvbW96IGJsb2dKBcCodcl47Q==',
 'results': [{'anchor_text': 'moz',
              'external_pages': 7162,
              'external_root_domains': 2026},
             {'anchor_text': 'moz blog',
              'external_pages': 15525,
              'external_root_domains': 1364},
             {'anchor_text': 'the moz blog',
              'external_pages': 7879,
              'external_root_domains': 728},
             {'anchor_text': 'seomoz',
              'external_pages': 17741,
              'external_root_domains': 654},
             {'anchor_text': 'https://moz.com/blog',
              'external_pages': 978,
              'external_root_domains': 491}]}

2. Final Redirect (final_redirect)
Use this endpoint to get data about anchor text used by followed external links to a target. Results are ordered by external_root_domains descending.

{'page': 'moz.com/blog'}

3. Global Top Pages (global_top_pages)
This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)

{'next_token': 'BcLbRwBmrXHK',
 'results': [{'deleted_pages_to_page': 11932076,
              'deleted_pages_to_root_domain': 23942663640,
              'deleted_pages_to_subdomain': 21555752652,
              'deleted_root_domains_to_page': 64700,
              'deleted_root_domains_to_root_domain': 3688228,
              'deleted_root_domains_to_subdomain': 3516235,
              'domain_authority': 96,
              'external_indirect_pages_to_root_domain': 5042652519,
              'external_nofollow_pages_to_page': 31163,
              'external_nofollow_pages_to_root_domain': 12375460748,
              'external_nofollow_pages_to_subdomain': 11393036086,
              'external_pages_to_page': 118102549,
              'external_pages_to_root_domain': 91362310623,
              'external_pages_to_subdomain': 83283626903,
              'external_redirect_pages_to_page': 0,
              'external_redirect_pages_to_root_domain': 445730476,
              'external_redirect_pages_to_subdomain': 432323198,
              'http_code': 5,
              'indirect_root_domains_to_page': 0,
              'indirect_root_domains_to_root_domain': 701121,
              'last_crawled': '2023-01-15',
              'link_propensity': 1.76710455e-05,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 2,
              'nofollow_pages_to_page': 31163,
              'nofollow_pages_to_root_domain': 12375623717,
              'nofollow_pages_to_subdomain': 11393036179,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 0,
              'nofollow_root_domains_to_page': 980,
              'nofollow_root_domains_to_root_domain': 3696150,
              'nofollow_root_domains_to_subdomain': 3622349,
              'page': 'www.facebook.com/Plesk',
              'page_authority': 100,
              'pages_crawled_from_root_domain': 1810872,
              'pages_from_page': 0,
              'pages_from_root_domain': 5289,
              'pages_to_page': 118102549,
              'pages_to_root_domain': 91368257043,
              'pages_to_subdomain': 83288001442,
              'redirect_pages_to_page': 0,
              'redirect_pages_to_root_domain': 447189164,
              'redirect_pages_to_subdomain': 433411292,
              'root_domain': 'facebook.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 32,
              'root_domains_to_page': 491956,
              'root_domains_to_root_domain': 59416650,
              'root_domains_to_subdomain': 50993087,
              'spam_score': 1,
              'subdomain': 'www.facebook.com',
              'title': ''},
             {'deleted_pages_to_page': 5828966,
              'deleted_pages_to_root_domain': 79909678,
              'deleted_pages_to_subdomain': 79909678,
              'deleted_root_domains_to_page': 16552,
              'deleted_root_domains_to_root_domain': 98416,
              'deleted_root_domains_to_subdomain': 98416,
              'domain_authority': 94,
              'external_indirect_pages_to_root_domain': 1177381629,
              'external_nofollow_pages_to_page': 453328699,
              'external_nofollow_pages_to_root_domain': 1643990147,
              'external_nofollow_pages_to_subdomain': 1643990147,
              'external_pages_to_page': 456279611,
              'external_pages_to_root_domain': 2808523112,
              'external_pages_to_subdomain': 2808523112,
              'external_redirect_pages_to_page': 125,
              'external_redirect_pages_to_root_domain': 24941546,
              'external_redirect_pages_to_subdomain': 24941546,
              'http_code': 3,
              'indirect_root_domains_to_page': 723,
              'indirect_root_domains_to_root_domain': 252606,
              'last_crawled': '2023-01-14',
              'link_propensity': 0.118001014,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 121166,
              'nofollow_pages_to_page': 453328699,
              'nofollow_pages_to_root_domain': 1644293277,
              'nofollow_pages_to_subdomain': 1644293277,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 67627,
              'nofollow_root_domains_to_page': 9800973,
              'nofollow_root_domains_to_root_domain': 4959747,
              'nofollow_root_domains_to_subdomain': 4959747,
              'page': 'wordpress.com/?ref=footer_blog',
              'page_authority': 100,
              'pages_crawled_from_root_domain': 1731019,
              'pages_from_page': 0,
              'pages_from_root_domain': 1080338,
              'pages_to_page': 456293004,
              'pages_to_root_domain': 2817137385,
              'pages_to_subdomain': 2817137385,
              'redirect_pages_to_page': 125,
              'redirect_pages_to_root_domain': 25449067,
              'redirect_pages_to_subdomain': 25449067,
              'root_domain': 'wordpress.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 204262,
              'root_domains_to_page': 9878742,
              'root_domains_to_root_domain': 12653294,
              'root_domains_to_subdomain': 12653294,
              'spam_score': 1,
              'subdomain': 'wordpress.com',
              'title': ''},
             {'deleted_pages_to_page': 3904778,
              'deleted_pages_to_root_domain': 23942663640,
              'deleted_pages_to_subdomain': 21555752652,
              'deleted_root_domains_to_page': 11671,
              'deleted_root_domains_to_root_domain': 3688228,
              'deleted_root_domains_to_subdomain': 3516235,
              'domain_authority': 96,
              'external_indirect_pages_to_root_domain': 5042652519,
              'external_nofollow_pages_to_page': 4449343,
              'external_nofollow_pages_to_root_domain': 12375460748,
              'external_nofollow_pages_to_subdomain': 11393036086,
              'external_pages_to_page': 59602588,
              'external_pages_to_root_domain': 91362310623,
              'external_pages_to_subdomain': 83283626903,
              'external_redirect_pages_to_page': 12625,
              'external_redirect_pages_to_root_domain': 445730476,
              'external_redirect_pages_to_subdomain': 432323198,
              'http_code': 5,
              'indirect_root_domains_to_page': 1632,
              'indirect_root_domains_to_root_domain': 701121,
              'last_crawled': '2023-01-16',
              'link_propensity': 1.76710455e-05,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 2,
              'nofollow_pages_to_page': 4449343,
              'nofollow_pages_to_root_domain': 12375623717,
              'nofollow_pages_to_subdomain': 11393036179,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 0,
              'nofollow_root_domains_to_page': 28624,
              'nofollow_root_domains_to_root_domain': 3696150,
              'nofollow_root_domains_to_subdomain': 3622349,
              'page': 'www.facebook.com/home.php',
              'page_authority': 100,
              'pages_crawled_from_root_domain': 1810872,
              'pages_from_page': 0,
              'pages_from_root_domain': 5289,
              'pages_to_page': 59602589,
              'pages_to_root_domain': 91368257043,
              'pages_to_subdomain': 83288001442,
              'redirect_pages_to_page': 12626,
              'redirect_pages_to_root_domain': 447189164,
              'redirect_pages_to_subdomain': 433411292,
              'root_domain': 'facebook.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 32,
              'root_domains_to_page': 239697,
              'root_domains_to_root_domain': 59416650,
              'root_domains_to_subdomain': 50993087,
              'spam_score': 1,
              'subdomain': 'www.facebook.com',
              'title': ''},
             {'deleted_pages_to_page': 3440567,
              'deleted_pages_to_root_domain': 3440700,
              'deleted_pages_to_subdomain': 3440700,
              'deleted_root_domains_to_page': 60839,
              'deleted_root_domains_to_root_domain': 60840,
              'deleted_root_domains_to_subdomain': 60840,
              'domain_authority': 1,
              'external_indirect_pages_to_root_domain': 7,
              'external_nofollow_pages_to_page': 288,
              'external_nofollow_pages_to_root_domain': 1499,
              'external_nofollow_pages_to_subdomain': 1499,
              'external_pages_to_page': 140954613,
              'external_pages_to_root_domain': 140959216,
              'external_pages_to_subdomain': 140959213,
              'external_redirect_pages_to_page': 70,
              'external_redirect_pages_to_root_domain': 70,
              'external_redirect_pages_to_subdomain': 70,
              'http_code': 200,
              'indirect_root_domains_to_page': 0,
              'indirect_root_domains_to_root_domain': 0,
              'last_crawled': '2018-02-05',
              'link_propensity': 0.3998428881,
              'nofollow_pages_from_page': 12,
              'nofollow_pages_from_root_domain': 805,
              'nofollow_pages_to_page': 288,
              'nofollow_pages_to_root_domain': 10799,
              'nofollow_pages_to_subdomain': 10799,
              'nofollow_root_domains_from_page': 2,
              'nofollow_root_domains_from_root_domain': 7,
              'nofollow_root_domains_to_page': 30,
              'nofollow_root_domains_to_root_domain': 30,
              'nofollow_root_domains_to_subdomain': 30,
              'page': 'music.skyrock.com/',
              'page_authority': 100,
              'pages_crawled_from_root_domain': 2546,
              'pages_from_page': 61,
              'pages_from_root_domain': 3382,
              'pages_to_page': 140956009,
              'pages_to_root_domain': 141008586,
              'pages_to_subdomain': 141008583,
              'redirect_pages_to_page': 70,
              'redirect_pages_to_root_domain': 70,
              'redirect_pages_to_subdomain': 70,
              'root_domain': 'music.skyrock.com',
              'root_domains_from_page': 19,
              'root_domains_from_root_domain': 1018,
              'root_domains_to_page': 10609865,
              'root_domains_to_root_domain': 10609868,
              'root_domains_to_subdomain': 10609868,
              'spam_score': 9,
              'subdomain': 'music.skyrock.com',
              'title': 'Blog de Music - DES NEWS, DES CLIPS, DES INTERVIEWS - '
                       'Skyrock.com'},
             {'deleted_pages_to_page': 64159924,
              'deleted_pages_to_root_domain': 17641375891,
              'deleted_pages_to_subdomain': 336246205,
              'deleted_root_domains_to_page': 63574,
              'deleted_root_domains_to_root_domain': 1728606,
              'deleted_root_domains_to_subdomain': 234073,
              'domain_authority': 100,
              'external_indirect_pages_to_root_domain': 19281720347,
              'external_nofollow_pages_to_page': 34635431,
              'external_nofollow_pages_to_root_domain': 7885369442,
              'external_nofollow_pages_to_subdomain': 184067821,
              'external_pages_to_page': 285612569,
              'external_pages_to_root_domain': 55013651418,
              'external_pages_to_subdomain': 1492976347,
              'external_redirect_pages_to_page': 593282,
              'external_redirect_pages_to_root_domain': 250423075,
              'external_redirect_pages_to_subdomain': 5678006,
              'http_code': 302,
              'indirect_root_domains_to_page': 1072,
              'indirect_root_domains_to_root_domain': 231256,
              'last_crawled': '2023-04-01',
              'link_propensity': 0.006248265505,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 991472,
              'nofollow_pages_to_page': 34635436,
              'nofollow_pages_to_root_domain': 7948674425,
              'nofollow_pages_to_subdomain': 184068512,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 182393,
              'nofollow_root_domains_to_page': 126656,
              'nofollow_root_domains_to_root_domain': 2322389,
              'nofollow_root_domains_to_subdomain': 304381,
              'page': 'youtube.com/',
              'page_authority': 100,
              'pages_crawled_from_root_domain': 41258009,
              'pages_from_page': 0,
              'pages_from_root_domain': 11109186,
              'pages_to_page': 285612606,
              'pages_to_root_domain': 55255620288,
              'pages_to_subdomain': 1493073570,
              'redirect_pages_to_page': 593282,
              'redirect_pages_to_root_domain': 263224806,
              'redirect_pages_to_subdomain': 5678383,
              'root_domain': 'youtube.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 257791,
              'root_domains_to_page': 598403,
              'root_domains_to_root_domain': 23134271,
              'root_domains_to_subdomain': 1927717,
              'spam_score': 4,
              'subdomain': 'youtube.com',
              'title': ''}]}

4. Global Top Root Domains (global_top_root_domains)
This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)

{'next_token': 'BcLbRwBmrXHK',
 'results': [{'domain_authority': 100,
              'link_propensity': 0.006248265505,
              'root_domain': 'youtube.com',
              'root_domains_to_root_domain': 23134271,
              'spam_score': 4,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}},
             {'domain_authority': 100,
              'link_propensity': 0.008422264829,
              'root_domain': 'www.google.com',
              'root_domains_to_root_domain': 14723695,
              'spam_score': 14,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}},
             {'domain_authority': 100,
              'link_propensity': 0.0001607139566,
              'root_domain': 'www.blogger.com',
              'root_domains_to_root_domain': 30580427,
              'spam_score': -1,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}},
             {'domain_authority': 99,
              'link_propensity': 0.04834850505,
              'root_domain': 'linkedin.com',
              'root_domains_to_root_domain': 12339087,
              'spam_score': 1,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}},
             {'domain_authority': 99,
              'link_propensity': 0.006264935713,
              'root_domain': 'microsoft.com',
              'root_domains_to_root_domain': 5344181,
              'spam_score': 11,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}}]}

5. Index Metadata (index_metadata)
This endpoint returns the top 500 pages in the entire index with the highest Page Authority values, sorted by Page Authority. (Visit the Top 500 Sites list to explore the top root domains on the web, sorted by Domain Authority.)

{'index_id': 'NE+lX5bFh06baS9ojUwVbw==',
 'spam_score_update_days': ['2019-02-08',
                            '2020-03-28',
                            '2020-08-03',
                            '2020-11-13',
                            '2021-02-24',
                            '2021-05-19',
                            '2021-08-16',
                            '2021-11-02',
                            '2022-02-01',
                            '2022-05-10',
                            '2022-11-16']}

6. Link Intersect (link_intersect)
Use this endpoint to get sources that link to at least one of a list of positive targets and don't link to any of a list of negative targets.

{'next_token': 'AcmY2oCXQbbg',
 'results': [{'domain_authority': 100,
              'matching_target_indexes': [0],
              'page': 'www.google.com/amp/www.latimes.com/local/lanow/la-me-ln-aliso-viejo-shooting-20171012-story,amp.html',
              'spam_score': 14,
              'title': ''}]}

7. Link Status (link_status)
Use this endpoint to get information about links from many sources to a single target.

{'exists': [False, False]}

8. Linking Root Domains (linking_root_domains)
Use this endpoint to get linking root domains to a target.

{'next_token': 'IokQVg4s9ak8iRBWDiz1qTyguYswnj035qBkmE3DU+JTtwAVhsjH7R6XUA==',
 'results': [{'domain_authority': 99,
              'link_propensity': 0.006264935713,
              'root_domain': 'microsoft.com',
              'root_domains_to_root_domain': 5344181,
              'spam_score': 11,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 2,
                            'redirect_pages': 0}},
             {'domain_authority': 98,
              'link_propensity': 0.02977741137,
              'root_domain': 'wordpress.org',
              'root_domains_to_root_domain': 12250296,
              'spam_score': 2,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 2,
                            'pages': 2,
                            'redirect_pages': 0}},
             {'domain_authority': 96,
              'link_propensity': 0.09679271281,
              'root_domain': 'github.com',
              'root_domains_to_root_domain': 2948013,
              'spam_score': 2,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 12,
                            'pages': 12,
                            'redirect_pages': 0}},
             {'domain_authority': 96,
              'link_propensity': 0.004641198553,
              'root_domain': 'amazon.com',
              'root_domains_to_root_domain': 5023132,
              'spam_score': 28,
              'to_target': {'deleted_pages': 0,
                            'nofollow_pages': 0,
                            'pages': 2,
                            'redirect_pages': 0}},
             {'domain_authority': 95,
              'link_propensity': 0.005770479795,
              'root_domain': 'shopify.com',
              'root_domains_to_root_domain': 2948087,
              'spam_score': 1,
              'to_target': {'deleted_pages': 3,
                            'nofollow_pages': 0,
                            'pages': 0,
                            'redirect_pages': 0}}]}

9. Links (links)
Use this endpoint to get links to a target.

{'next_token': 'AVvpJ4gPPvOY',
 'results': [{'anchor_text': 'moz blog',
              'date_disappeared': '',
              'date_first_seen': '2020-06-29',
              'date_last_seen': '2023-01-14',
              'nofollow': True,
              'redirect': False,
              'rel_canonical': False,
              'source': {'deleted_pages_to_page': 570,
                         'deleted_pages_to_root_domain': 1251501128,
                         'deleted_pages_to_subdomain': 1182759912,
                         'deleted_root_domains_to_page': 34,
                         'deleted_root_domains_to_root_domain': 322790,
                         'deleted_root_domains_to_subdomain': 314554,
                         'domain_authority': 96,
                         'external_indirect_pages_to_root_domain': 863103308,
                         'external_nofollow_pages_to_page': 1407,
                         'external_nofollow_pages_to_root_domain': 667480081,
                         'external_nofollow_pages_to_subdomain': 650421076,
                         'external_pages_to_page': 3710,
                         'external_pages_to_root_domain': 5309615021,
                         'external_pages_to_subdomain': 5086141938,
                         'external_redirect_pages_to_page': 14,
                         'external_redirect_pages_to_root_domain': 143685025,
                         'external_redirect_pages_to_subdomain': 142061138,
                         'http_code': 200,
                         'indirect_root_domains_to_page': 2,
                         'indirect_root_domains_to_root_domain': 180014,
                         'last_crawled': '2023-01-14',
                         'link_propensity': 0.09679271281,
                         'nofollow_pages_from_page': 199,
                         'nofollow_pages_from_root_domain': 7541042,
                         'nofollow_pages_to_page': 1407,
                         'nofollow_pages_to_root_domain': 678014273,
                         'nofollow_pages_to_subdomain': 660443683,
                         'nofollow_root_domains_from_page': 93,
                         'nofollow_root_domains_from_root_domain': 564314,
                         'nofollow_root_domains_to_page': 58,
                         'nofollow_root_domains_to_root_domain': 186407,
                         'nofollow_root_domains_to_subdomain': 171632,
                         'page': 'github.com/mezod/awesome-indie',
                         'page_authority': 68,
                         'pages_crawled_from_root_domain': 7254823,
                         'pages_from_page': 202,
                         'pages_from_root_domain': 8613796,
                         'pages_to_page': 3746,
                         'pages_to_root_domain': 5628821927,
                         'pages_to_subdomain': 5352019489,
                         'redirect_pages_to_page': 14,
                         'redirect_pages_to_root_domain': 145613441,
                         'redirect_pages_to_subdomain': 142856036,
                         'root_domain': 'github.com',
                         'root_domains_from_page': 96,
                         'root_domains_from_root_domain': 702214,
                         'root_domains_to_page': 231,
                         'root_domains_to_root_domain': 2948013,
                         'root_domains_to_subdomain': 2857538,
                         'spam_score': 2,
                         'subdomain': 'github.com',
                         'title': 'GitHub - mezod/awesome-indie: Resources for '
                                  'independent developers to make money'},
              'target': {'deleted_pages_to_page': 169073,
                         'deleted_pages_to_root_domain': 19022927,
                         'deleted_pages_to_subdomain': 18554702,
                         'deleted_root_domains_to_page': 1457,
                         'deleted_root_domains_to_root_domain': 27522,
                         'deleted_root_domains_to_subdomain': 27273,
                         'domain_authority': 91,
                         'external_indirect_pages_to_root_domain': 45290099,
                         'external_nofollow_pages_to_page': 7388,
                         'external_nofollow_pages_to_root_domain': 17425478,
                         'external_nofollow_pages_to_subdomain': 17269297,
                         'external_pages_to_page': 553261,
                         'external_pages_to_root_domain': 69376449,
                         'external_pages_to_subdomain': 68746190,
                         'external_redirect_pages_to_page': 265,
                         'external_redirect_pages_to_root_domain': 41112725,
                         'external_redirect_pages_to_subdomain': 41109338,
                         'http_code': 200,
                         'indirect_root_domains_to_page': 2219,
                         'indirect_root_domains_to_root_domain': 28779,
                         'last_crawled': '2023-04-02',
                         'link_propensity': 0.008849279955,
                         'nofollow_pages_from_page': 0,
                         'nofollow_pages_from_root_domain': 209067,
                         'nofollow_pages_to_page': 7388,
                         'nofollow_pages_to_root_domain': 17442464,
                         'nofollow_pages_to_subdomain': 17285191,
                         'nofollow_root_domains_from_page': 0,
                         'nofollow_root_domains_from_root_domain': 55943,
                         'nofollow_root_domains_to_page': 1727,
                         'nofollow_root_domains_to_root_domain': 37789,
                         'nofollow_root_domains_to_subdomain': 37690,
                         'page': 'moz.com/blog',
                         'page_authority': 69,
                         'pages_crawled_from_root_domain': 7872618,
                         'pages_from_page': 7,
                         'pages_from_root_domain': 343751,
                         'pages_to_page': 906052,
                         'pages_to_root_domain': 98442581,
                         'pages_to_subdomain': 97352802,
                         'redirect_pages_to_page': 746,
                         'redirect_pages_to_root_domain': 47575576,
                         'redirect_pages_to_subdomain': 47570092,
                         'root_domain': 'moz.com',
                         'root_domains_from_page': 5,
                         'root_domains_from_root_domain': 69667,
                         'root_domains_to_page': 9712,
                         'root_domains_to_root_domain': 179884,
                         'root_domains_to_subdomain': 178649,
                         'spam_score': 1,
                         'subdomain': 'moz.com',
                         'title': 'The Moz Blog [SEO] - Moz'},
              'via_redirect': False,
              'via_rel_canonical': False}]}

10. Top Pages (top_pages)
This endpoint returns top pages on a target domain.

{'next_token': 'BXULGXd3IggK',
 'results': [{'deleted_pages_to_page': 1963527,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 6527,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 9684724,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 14981546,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 3632556,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 200,
              'indirect_root_domains_to_page': 10580,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-01',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 9684724,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 8749,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/',
              'page_authority': 74,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 7,
              'pages_from_root_domain': 343751,
              'pages_to_page': 15343034,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 3633007,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 5,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 41190,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': 'Moz - SEO Software for Smarter Marketing'},
             {'deleted_pages_to_page': 185579,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 2440,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 11211,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 424268,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 348,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 200,
              'indirect_root_domains_to_page': 1389,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-03',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 11211,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 2487,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/beginners-guide-to-seo',
              'page_authority': 72,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 7,
              'pages_from_root_domain': 343751,
              'pages_to_page': 786960,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 365,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 5,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 15276,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': "Beginner\'s Guide to SEO [plus FREE quick start "
                       'checklist] - Moz'},
             {'deleted_pages_to_page': 7159,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 1382,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 8605,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 34152,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 70,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 200,
              'indirect_root_domains_to_page': 782,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-03',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 8754,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 1380,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/google-algorithm-change',
              'page_authority': 70,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 420,
              'pages_from_root_domain': 343751,
              'pages_to_page': 35181,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 73,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 60,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 8881,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': 'Moz - Google Algorithm Update History'},
             {'deleted_pages_to_page': 33133,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 1192,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 31500,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 70673,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 77,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 301,
              'indirect_root_domains_to_page': 315,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-02',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 31628,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 1689,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/researchtools/ose/',
              'page_authority': 70,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 0,
              'pages_from_root_domain': 343751,
              'pages_to_page': 344305,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 78,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 8086,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': ''},
             {'deleted_pages_to_page': 169073,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 1457,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 7388,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 553261,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 265,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 200,
              'indirect_root_domains_to_page': 2219,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-02',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 7388,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 1727,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/blog',
              'page_authority': 69,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 7,
              'pages_from_root_domain': 343751,
              'pages_to_page': 906052,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 746,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 5,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 9712,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': 'The Moz Blog [SEO] - Moz'}]}

11. URL Metrics (url_metrics)
Use this endpoint to get metrics about one or more urls.

{'results': [{'deleted_pages_to_page': 1963527,
              'deleted_pages_to_root_domain': 19022927,
              'deleted_pages_to_subdomain': 18554702,
              'deleted_root_domains_to_page': 6527,
              'deleted_root_domains_to_root_domain': 27522,
              'deleted_root_domains_to_subdomain': 27273,
              'domain_authority': 91,
              'external_indirect_pages_to_root_domain': 45290099,
              'external_nofollow_pages_to_page': 9684724,
              'external_nofollow_pages_to_root_domain': 17425478,
              'external_nofollow_pages_to_subdomain': 17269297,
              'external_pages_to_page': 14981546,
              'external_pages_to_root_domain': 69376449,
              'external_pages_to_subdomain': 68746190,
              'external_redirect_pages_to_page': 3632556,
              'external_redirect_pages_to_root_domain': 41112725,
              'external_redirect_pages_to_subdomain': 41109338,
              'http_code': 200,
              'indirect_root_domains_to_page': 10580,
              'indirect_root_domains_to_root_domain': 28779,
              'last_crawled': '2023-04-01',
              'link_propensity': 0.008849279955,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 209067,
              'nofollow_pages_to_page': 9684724,
              'nofollow_pages_to_root_domain': 17442464,
              'nofollow_pages_to_subdomain': 17285191,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 55943,
              'nofollow_root_domains_to_page': 8749,
              'nofollow_root_domains_to_root_domain': 37789,
              'nofollow_root_domains_to_subdomain': 37690,
              'page': 'moz.com/',
              'page_authority': 74,
              'pages_crawled_from_root_domain': 7872618,
              'pages_from_page': 7,
              'pages_from_root_domain': 343751,
              'pages_to_page': 15343034,
              'pages_to_root_domain': 98442581,
              'pages_to_subdomain': 97352802,
              'redirect_pages_to_page': 3633007,
              'redirect_pages_to_root_domain': 47575576,
              'redirect_pages_to_subdomain': 47570092,
              'root_domain': 'moz.com',
              'root_domains_from_page': 5,
              'root_domains_from_root_domain': 69667,
              'root_domains_to_page': 41190,
              'root_domains_to_root_domain': 179884,
              'root_domains_to_subdomain': 178649,
              'spam_score': 1,
              'subdomain': 'moz.com',
              'title': 'Moz - SEO Software for Smarter Marketing'},
             {'deleted_pages_to_page': 249094,
              'deleted_pages_to_root_domain': 224212706,
              'deleted_pages_to_subdomain': 898844,
              'deleted_root_domains_to_page': 3696,
              'deleted_root_domains_to_root_domain': 177001,
              'deleted_root_domains_to_subdomain': 9251,
              'domain_authority': 95,
              'external_indirect_pages_to_root_domain': 156562794,
              'external_nofollow_pages_to_page': 163849,
              'external_nofollow_pages_to_root_domain': 72093550,
              'external_nofollow_pages_to_subdomain': 294697,
              'external_pages_to_page': 1165187,
              'external_pages_to_root_domain': 514661963,
              'external_pages_to_subdomain': 2310818,
              'external_redirect_pages_to_page': 3049,
              'external_redirect_pages_to_root_domain': 4827448,
              'external_redirect_pages_to_subdomain': 8140,
              'http_code': 301,
              'indirect_root_domains_to_page': 1439,
              'indirect_root_domains_to_root_domain': 30315,
              'last_crawled': '2023-03-31',
              'link_propensity': 0.02704063244,
              'nofollow_pages_from_page': 0,
              'nofollow_pages_from_root_domain': 97163,
              'nofollow_pages_to_page': 163881,
              'nofollow_pages_to_root_domain': 72644206,
              'nofollow_pages_to_subdomain': 294765,
              'nofollow_root_domains_from_page': 0,
              'nofollow_root_domains_from_root_domain': 22711,
              'nofollow_root_domains_to_page': 5647,
              'nofollow_root_domains_to_root_domain': 178651,
              'nofollow_root_domains_to_subdomain': 11590,
              'page': 'nytimes.com/',
              'page_authority': 82,
              'pages_crawled_from_root_domain': 13567138,
              'pages_from_page': 0,
              'pages_from_root_domain': 3152122,
              'pages_to_page': 1170498,
              'pages_to_root_domain': 763781494,
              'pages_to_subdomain': 2489707,
              'redirect_pages_to_page': 3053,
              'redirect_pages_to_root_domain': 9268395,
              'redirect_pages_to_subdomain': 14273,
              'root_domain': 'nytimes.com',
              'root_domains_from_page': 0,
              'root_domains_from_root_domain': 366864,
              'root_domains_to_page': 25307,
              'root_domains_to_root_domain': 2200598,
              'root_domains_to_subdomain': 62699,
              'spam_score': 1,
              'subdomain': 'nytimes.com',
              'title': ''}]}

12. Usage Data (usage_data)
This endpoint Returns the number of rows consumed so far in the current billing period. The count returned might not reflect rows consumed in the last hour. The count returned reflects rows consumed by requests to both the v1 (Moz Links API) and v2 Links APIs.

{'rows_consumed': 254}