ChatGPT and generative AI has changed the way we do many things, and SEO is no exception.
With OpenAI’s recent announcement, individuals and businesses now have the opportunity to create their own custom versions of ChatGPT, known as “GPTs”, through a user-friendly GPT builder.
This customization allows for a more targeted application of AI, catering to specific needs and preferences, permitting the inclusion of PDFs and other knowledge stores to create a RAG-like experience.
And with the inclusion of “Actions” within these GPTs, we can augment the output of them to be even more useful for SEO purposes—including real data without the need for a custom langchain Python application, and avoiding hallucinated data in the output (previously a real flaw with using ChatGPT for SEO purposes).
Prerequisites for Creating GPTs
You must pay for ChatGPT Plus or have an Enterprise subscription, so it’s going to cost you a minimum of $20/month.
And for the purpose of this tutorial, we’re going to be using the DataForSEO Keywords API (affiliate link), which will add an additional cost.
How to Setup GPTs
Creating your own custom ChatGPTs with “GTPs” is fairly simple for a basic configuration.
First, login to ChatGPT and then click “Explore” in your sidebar.
Then choose “Create a GPT” from the menu.
Once you’re in the GPT creation interface, click on the Configure tab to get the ball rolling.
Give your custom GPT a Name. For example, I called my SearchVolume-GPT. You also may give it an optional description, such as “My own personal SEO helper”.
Then very important, you must provide a system instruction for your GPT.
For my Intructions for my GPT, I went with:
You are an experienced and helpful SEO professionals, skilled at keyword research, audience understanding, and SEO data analysis. You help others figure out what to write about using search volume data and your deep keyword research experience. Never generate more than 1000 keywords at a time using getLiveSearchVolume.
“search volume”, “sv”, “search per month”, “number of searches”, “monthly search volume”, “search popularity”, and similar terms all refer to to getLiveSearchVolume. Always find search volume when examining keywords.
Add a conversation starter or two
I chose “Can you help me with keyword research?“.
Note: And in case you found that naming convention confusion like I did, conversation starters are what the user would type into the chat box, rather than what the chat bot would open the conversation with.
For the last step before we get to the real fun bit, we must check which Capabilities we’d like to include.
I recommend Web Browsing and Code Interpreter as they can be useful for analysis once your GPT is up and running.
You may also upload documents under the Knowledge section, but for this example, it’s unnecessary.
Setting up an Action to Call a 3rd Party API
Under Actions, click the “Create new action” button.
Now head over to DataForSEO (affiliate link) and set up your account, grabbing your API login and API password from the API Dashboard.
To use with Actions, you must generate a base64 encoded version of your login.
If you use a Mac, fire up your Terminal and type the following in (replacing email and password from the API Dashboard of course):
echo -n "[email protected]:APIpassword" | base64
Under Authentication, click the cog on the right and choose “API Key” with Basic authentication.
Paste in your base64 encoded string under API Key and save.
Now for the tricky part. You must generate a schema according to the OAS spec. Feel free to do that old school by reading your API docs and the OAS spec, or leverage ChatGPT to make it a bit easier for yourself.
For the DataForSEO Keyword API, you can simply use the following schema:
openapi: 3.1.0 info: title: DataForSEO API version: "1.0" servers: - url: https://api.dataforseo.com paths: /v3/keywords_data/google_ads/search_volume/live: post: summary: "Get Live Search Volume for Keywords" operationId: "getLiveSearchVolume" requestBody: required: true content: application/json: schema: type: object properties: data: type: object # Change to object properties: keywords: type: array items: type: string search_partners: type: boolean responses: '200': description: Successful response security: - basicAuth: [] components: securitySchemes: basicAuth: type: http scheme: basic schemas: {}
Feel free to click the Test button and make sure it’s working, but do know this will consume API credits and incur a cost.
Hit the back arrow at the top left of the Actions config menu.
Lastly, save your custom GPT. I recommend making it only accessible to yourself, since the API credits will become costly if you make it public.
Simple Example of How to Use the Custom GPT for SEO
Now you can chat with your custom GPT as if it were regular ol’ ChatGPT by selecting it in your sidebar,
Ask it about search volume of the keywords and it will provide the data (remember, this will incur a cost).
You can even get fancy since you enabled the code interpreter and ask it things like “graph the keyword trends” and “can you predict the growth of the keyword trends for a year from now?” for some cool graphs.
And there you have it, using custom GPTs with Actions, you’ve instantly said goodbye to search volume hallucinations and have made ChatGPT more useful for keyword research and SEO.
If you are using GrepWords for search volume, then your authentication would look like this:
And the Schema would look like this:
openapi: 3.0.0 info: title: Grepwords API version: 1.0.0 servers: - url: https://data.grepwords.com paths: /v1/keywords/lookup: post: summary: Lookup keyword information operationId: lookupKeyword requestBody: required: true content: application/json: schema: type: object properties: term: type: string country: type: string language: type: string responses: "200": description: Successful response content: application/json: schema: type: object properties: null security: - api_key: [] components: schemas: KeywordLookupResponse: type: object properties: term: type: string country: type: string language: type: string
Had me up to the part about the schema. That part bewildered me.