OpenGraph.io

Unlock Valuable Insights with Unfurling: Extract Open Graph Tags and More

Unleash the power of our Unfurling API to effortlessly extract Open Graph tags from any URL. Our robust API enables you to retrieve valuable metadata, such as title, description, images, and more, providing rich insights for your applications.

$ curl -X GET "https://opengraph.io/api/1.1/site/url_encoded_link?app_id=xxxxxx"
{
    "hybridGraph": {
        "title": "Google",
        "description": "Search the world's information...",
        "image": "http://google.com/images/srpr/logo9w.png",
        ...
    },
    "openGraph": {
        // ...
    },
    "htmlInferred": {
        // ...
    }
}

Why choose OpenGraph.io

Support More Sites

Support More Sites

We update our scraping algorithms daily so you don't have to worry about it. Don't spend countless development hours supporting every last site out there!

Not Just Open Graph

Not Just Open Graph

Many sites still don't provide the proper Open Graph tags in their markup but that doesn't matter! Our system will fallback and make very smart guesses based on page content.

Scrape those Products

Scrape those Products

We parse html from URLs you provide for products being offered and provide them back in a common format to make displaying it in your product a breeze. When available, our API provides back prices, descriptions, and images.

Advanced Proxy Pool

Advanced Proxy Pool

We manage pools of millions of proxies across dozens of ISPs and intelligently route your request to avoid being blocked to get your the information you need without the hassle!

How simple is it?

Discover the simplicity of OpengraphIO and experience how effortless it is to harness its power.

Check Out Our Awesome Documentation
Ruby Code
C# Code
PHP Code
NodeJs Code
jQuery Code
Python Code
Go Code

require 'opengraph-io'
opengraph = OpenGraphIO.new({app_id: '!!!!YOUR_APP_ID!!!'})
ogData = opengraph.get_site_info('https://github.com')
siteDescription = ogData["hybridGraph"]["description"]
print siteDescription

using System;
using System.Net;
using System.IO;
using System.Json;

namespace CSharpDemo
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var url = "http://cnet.com";
            var urlEncoded = Uri.EscapeDataString(url);

            var requestUrl = "https://opengraph.io/api/1.1/site/" + urlEncoded;

            // Make sure to get your API key! No need for a CC
            requestUrl += "?app_id=XXXXXXXXXXXXXXXXXXXXXXXX";

            var request = WebRequest.Create(requestUrl);
            request.ContentType = "application/json;";

            string text;

            var response = (HttpWebResponse)request.GetResponse();

            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                text = sr.ReadToEnd();

                dynamic x = JsonConvert.DeserializeObject(text);

                Console.WriteLine("Title		" + x.hybridGraph.title);
                Console.WriteLine("Description	" + x.hybridGraph.description);
                Console.WriteLine("Image		" + x.hybridGraph.image);
            }
        }
    }
}

$siteUrl = 'http://cnet.com';
$requestUrl = 'https://opengraph.io/api/1.1/site/' . urlencode($siteUrl);

// Make sure you include your free app_id here!  No CC required
$requestUrl = $requestUrl . '?app_id=XXXXXXXXXXXXXXXXXXXXXXXX';

$siteInformationJSON = file_get_contents ($requestUrl);
$siteInformation = json_decode($siteInformationJSON, true);

print 'Title		' . $siteInformation['hybridGraph']['title'] . '\n';
print 'Description	' . $siteInformation['hybridGraph']['description'] . '\n';
print 'Logo URL	' . $siteInformation['hybridGraph']['image'] . '\n';

var opengraph = require('opengraph-io')({appId: 'xxxxxx'}); // <-- Enter your app_id!
var express = require('express');
var app = express();

app.get('/site/info', function (req, res) {
  var siteUrl = req.query['url'];

  opengraph.getSiteInfo(siteUrl, function(err, siteInfo){
    console.log('hey err', err);
    console.log('hey result', siteInfo);
    res.json(siteInfo);
  });
});

app.listen(3000, function() {
  console.log('Example app listening on port 3000!');
  console.log('Test this proxy with the following url:', 'http://localhost:3000/site/info?url=https%3A%2F%2Fnytimes.com');
});

var url = 'http://cnet.com';
var urlEncoded = encodeURIComponent(url);
var apiKey = 'xxxxxxxxxx';

// The entire request is just a simple get request with optional query parameters
var requestUrl = 'https://opengraph.io/api/1.1/site/' + urlEncoded + '?app_id=' + apiKey;

$('#loadOpenGraphData').click(function(){
  $.getJSON(requestUrl, function(json) {
    console.log('hey result', json);

    // Throw the object in the console to see what it looks like!
    console.log('json', json);

    // Update the HTML elements!
    $('#title').text(json.hybridGraph.title);
    $('#description').text(json.hybridGraph.description);
    $('#icon').attr('src', json.hybridGraph.image);
  });
});

import requests

# Replace with your actual app_id
app_id = 'xxxxxx'
target_url = 'https://github.com'

# Make the API request
api_url = f'https://opengraph.io/api/1.1/site/{requests.utils.quote(target_url, safe="")}'
response = requests.get(api_url, params={'app_id': app_id})

if response.status_code == 200:
    data = response.json()
    hybrid = data.get('hybridGraph', {})
    
    print(f"Title: {hybrid.get('title')}")
    print(f"Description: {hybrid.get('description')}")
    print(f"Image: {hybrid.get('image')}")
else:
    print(f"Error: {response.status_code}")

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    appID := "xxxxxx" // Replace with your app_id
    targetURL := "https://github.com"

    apiURL := fmt.Sprintf(
        "https://opengraph.io/api/1.1/site/%s?app_id=%s",
        url.QueryEscape(targetURL),
        appID,
    )

    resp, err := http.Get(apiURL)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)

    var result map[string]interface{}
    json.Unmarshal(body, &result)

    if hybrid, ok := result["hybridGraph"].(map[string]interface{}); ok {
        fmt.Printf("Title: %v\n", hybrid["title"])
        fmt.Printf("Description: %v\n", hybrid["description"])
        fmt.Printf("Image: %v\n", hybrid["image"])
    }
}
Our Clients

Trusted by Thousands

Over 1B Site Previews!

Pricing

as Simple as our API

Free Plan

$0/month

Perfect for testing and small projects

100 Credits

1 Concurrent Request

No credit card required

20 Monthly Image Generations

20 Monthly AI Title/Description Generations

Quicker request times

Priority Support

Premium Proxy

Superior Proxy

Multiple Users

DEVELOPER PLAN

$25/month

For growing businesses and applications

50,000 Credits

3 Users

Quicker request times

$1 / thousand Credits after 50k

5 Concurrent Requests

Email Support

2100 Monthly Image Generations

1000 Monthly AI Title/Description Generations

PRODUCTION PLAN

$100/month

For large-scale applications and businesses

250,000 Credits

Unlimited Users

Quicker request times

1 Dedicated Worker

$0.80 / thousand Credits after 250k

25 Concurrent Requests

Email Support

10,000 Monthly Image Generations

4000 Monthly AI Title/Description Generations

ENTERPRISE PLAN

$250/month

For large-scale applications and businesses

1,000,000 Credits

Unlimited Users

Quicker request times

2 Dedicated Workers

$0.50 / thousand Credits after 1 million

100 concurrent requests

Priority Support

Unlimited Monthly Image Generations

10,000 Monthly AI Title/Description Generations

Need more credits? Contact us for more information regarding custom plans.

How Credits are Counted

When explicitly using some of our advanced features, a single API request may consume more than 1 credit for your billing cycle.

  • A standard request is always 1 credit.
  • Any cache hit, is always 1 credit.
  • Requests explicitly specify use of a proxy, full_render, or screenshot will be more than 1 credit.

The "Credits Used" table details the number of credits used by each feature.

Credits Used

Request TypeCredits UsedDescription
request1A request refers to a single API call to our system. Each time you use the API to retrieve data from a website, it counts as one credit.
full_render10A full_render request involves rendering the target web page in a headless browser, providing access to the entire HTML content of the page. This option costs 10 credits and is ideal for scenarios that require extensive data extraction from dynamic websites.
use_proxy10The use_proxy option routes your API request through one of our proxy servers, effectively concealing your IP address. This feature costs 10 credits and is invaluable for bypassing IP blocks on websites and ensuring seamless data scraping.
use_premium20The use_premium option is suggested for particularly difficult sites to scrape.
use_superior30The use_superior option is tailored for highly challenging scraping scenarios. By leveraging our superior proxy feature, you can overcome stringent bot detection mechanisms on the toughest websites and access critical data.

FAQ

Do you charge for failed requests?

We try not to charge when a request fails outright (e.g. 500 error / DNS timeout / etc). Things get a bit more fuzzy if we are talking about not getting back good data from our request, as determining the criteria for "no results" can be challenging, and the request is utilizing resources on our end, so credits may still be consumed.

We try not to charge when a request fails outright (e.g. 500 error / DNS timeout / etc). Things get a bit more fuzzy if we are talking about not getting back good data from our request, as determining the criteria for "no results" can be challenging, and the request is utilizing resources on our end, so credits may still be consumed.

What's the difference between HybridGraph and OpenGraph in results?

Many websites like Twitter block bots to prevent link unfurling activity, the list below breaks down the difference between openGraph and hybridGraph:

  • hybridGraph: Mix between HTML Inferred and OpenGraph Data + our own implementation to talk to websites.
  • openGraph: Only values provided from the website
  • htmlInferred: Values yielded from the content of the website

Why is your free plan so limited in the number of credits?

Unfortunately, we are constantly trying to battle abuse of our free service, and this is the result. People will jump through a lot of hoops to save $20 a month.

If you end up using the product for anything more than development, we would recommend switching to the paid plan. If you end up being dissatisfied with the service, or just find it not to be a fit, reach out to us and let us know… we will be happy to help you out.

Is there any validation and filtering going on at your end for sanitising the data before it comes back to us?

We do not perform any sanitizing of data that comes back from sites we process.

What are the steps to delete user data and account on OpenGraph.io, and how can users contact the support team to request the deletion of their data?

As part of our commitment to user privacy, we provide clear instructions on how users can request their data to be deleted. If you wish to delete your account, you can do so by going to your profile page and selecting the ‘delete account’ option. Upon deletion, all of your data will be permanently removed from our systems. Alternatively, if you prefer, you can contact our support team at support@opengraph.io and request that your data be deleted. We will process your request promptly and with the utmost care to ensure that your data is completely removed from our servers.

Still have Questions? 🙋

Can't find the answer you're looking for? Please chat to our friendly team. We usually respond within 24 hours.

Contact Us