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": {
// ...
}
}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
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
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
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!
Discover the simplicity of OpengraphIO and experience how effortless it is to harness its power.
Check Out Our Awesome Documentation
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"])
}
}
Over 1B Site Previews!

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 |
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 |
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 |
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.
When explicitly using some of our advanced features, a single API request may consume more than 1 credit for your billing cycle.
The "Credits Used" table details the number of credits used by each feature.
| Request Type | Credits Used | Description |
|---|---|---|
| request | 1 | A 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_render | 10 | A 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_proxy | 10 | The 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_premium | 20 | The use_premium option is suggested for particularly difficult sites to scrape. |
| use_superior | 30 | The 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. |
Many websites like Twitter block bots to prevent link unfurling activity, the list below breaks down the difference between openGraph and hybridGraph:
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.
We do not perform any sanitizing of data that comes back from sites we process.
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.
Can't find the answer you're looking for? Please chat to our friendly team. We usually respond within 24 hours.
Contact Us