in Search Engine Optimization

Using ChatGPT’s Custom “GPTs” for SEO and Keyword Research

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.

chatgpt pricing page

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.

DataForSEO API Admin

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.

Explore in 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

Write a Comment

Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.