diff -u b/config/schema/media_entity_instagram.schema.yml b/config/schema/media_entity_instagram.schema.yml
--- b/config/schema/media_entity_instagram.schema.yml
+++ b/config/schema/media_entity_instagram.schema.yml
@@ -13,17 +13,14 @@
     source_field:
       type: string
       label: 'Field with embed code/URL'
-    use_instagram_api:
-      type: boolean
-      label: 'Whether to use instagram api or not'
-    client_id:
-      type: string
-      label: 'Field with client id'
 
 field.formatter.settings.instagram_embed:
   type: mapping
   label: 'Instagram field display format settings'
   mapping:
+    width:
+      type: integer
+      label: 'Max-Width'
     hidecaption:
       type: boolean
       label: 'Caption hidden'
diff -u b/media_entity_instagram.services.yml b/media_entity_instagram.services.yml
--- b/media_entity_instagram.services.yml
+++ b/media_entity_instagram.services.yml
@@ -2,6 +2,8 @@
   media_entity_instagram.instagram_embed_fetcher:
     class: '\Drupal\media_entity_instagram\InstagramEmbedFetcher'
     arguments:
+      - '@http_client'
+      - '@logger.factory'
       - '@media_entity_instagram.cache.instagram_posts'
 
   media_entity_instagram.cache.instagram_posts:
diff -u b/src/InstagramEmbedFetcher.php b/src/InstagramEmbedFetcher.php
--- b/src/InstagramEmbedFetcher.php
+++ b/src/InstagramEmbedFetcher.php
@@ -5,6 +5,9 @@
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Component\Utility\UrlHelper;
+use Drupal\Core\Logger\LoggerChannelFactory;
+use Drupal\Core\Utility\Error;
+use GuzzleHttp\Client;
 use GuzzleHttp\Exception\RequestException;
 
 /**
@@ -15,6 +18,10 @@
  */
 class InstagramEmbedFetcher implements InstagramEmbedFetcherInterface {
 
+  const INSTAGRAM_URL = 'http://instagr.am/p/';
+
+  const INSTAGRAM_API = 'http://api.instagram.com/oembed';
+
   /**
    * The optional cache backend.
    *
@@ -23,49 +30,67 @@
   protected $cache;
 
   /**
-   * The current set of Instagram's oEmbed options.
+   * Guzzle client.
+   *
+   * @var Client
+   */
+  protected $httpClient;
+
+  /**
+   * Logger.
    *
-   * @var array
+   * @var LoggerChannelFactory
    */
-  protected $options = [];
+  protected $loggerFactory;
 
   /**
    * InstagramEmbedFetcher constructor.
    *
+   * @param Client $client
+   *   A HTTP Client.
+   * @param LoggerChannelFactory $loggerFactory
+   *   A logger factory.
    * @param \Drupal\Core\Cache\CacheBackendInterface|null $cache
    *   (optional) A cache bin for storing fetched instagram posts.
    */
-  public function __construct(CacheBackendInterface $cache = NULL) {
+  public function __construct(Client $client, LoggerChannelFactory $loggerFactory, CacheBackendInterface $cache = NULL) {
+    $this->httpClient = $client;
+    $this->loggerFactory = $loggerFactory;
     $this->cache = $cache;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function fetchInstagramEmbed($shortcode, $hidecaption = FALSE) {
-    // Tweets don't change much, so pull it out of the cache (if we have one)
-    // if this one has already been fetched.
-    if ($this->cache && $cached_instagram_post = $this->cache->get($shortcode . "_" . $hidecaption)) {
-      return $cached_instagram_post->data;
-    }
+  public function fetchInstagramEmbed($shortcode, $hidecaption = FALSE, $maxWidth = NULL) {
 
-    $client = \Drupal::httpClient();
     $options = [
-      'url' => 'http://instagr.am/p/' . $shortcode . '/',
+      'url' => self::INSTAGRAM_URL . $shortcode . '/',
       'hidecaption' => (int) $hidecaption,
       'omitscript' => 1,
     ];
-    $queryParameter = UrlHelper::buildQuery($options);
 
+    if ($maxWidth) {
+      $options['maxwidth'] = $maxWidth;
+    }
+
+    // Tweets don't change much, so pull it out of the cache (if we have one)
+    // if this one has already been fetched.
+    $cacheKey = md5(serialize($options));
+    if ($this->cache && $cached_instagram_post = $this->cache->get($cacheKey)) {
+      return $cached_instagram_post->data;
+    }
+
+    $queryParameter = UrlHelper::buildQuery($options);
 
     try {
-      $response = $client->request('GET', 'http://api.instagram.com/oembed?' . $queryParameter);
+      $response = $this->httpClient->request('GET', self::INSTAGRAM_API . '?' . $queryParameter);
       if ($response->getStatusCode() === 200) {
         $data = Json::decode($response->getBody()->getContents());
       }
     }
     catch (RequestException $e) {
-      watchdog_exception('media_entity_instagram', $e, "Could not retrieve Instagram post $shortcode.");
+      $this->loggerFactory->get('media_entity_instagram')->error("Could not retrieve Instagram post $shortcode.", Error::decodeException($e));
     }
 
     // If we got data from Instagram oEmbed request, return data.
@@ -75,7 +100,7 @@
       if ($this->cache) {
         // Instagram posts don't change often, so the response should expire
         // from the cache on its own in 90 days.
-        $this->cache->set($shortcode . "_" . $hidecaption, $data, time() + (86400 * 90));
+        $this->cache->set($cacheKey, $data, time() + (86400 * 90));
       }
 
       return $data;
diff -u b/src/InstagramEmbedFetcherInterface.php b/src/InstagramEmbedFetcherInterface.php
--- b/src/InstagramEmbedFetcherInterface.php
+++ b/src/InstagramEmbedFetcherInterface.php
@@ -15,9 +15,11 @@
    * @param bool $hidecaption
    *   Indicates if the caption should be hidden in the html.
+   * @param bool $maxWidth
+   *   Max width of the instagram widget.
    *
    * @return array
    *   The instagram oEmbed information.
    */
-  public function fetchInstagramEmbed($shortcode, $hidecaption);
+  public function fetchInstagramEmbed($shortcode, $hidecaption = FALSE, $maxWidth = NULL);
 
 }
diff -u b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
--- b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
@@ -79,7 +79,7 @@
 
       if (!empty($matches['shortcode'])) {
 
-        if ($instagram = $this->fetcher->fetchInstagramEmbed($matches['shortcode'], $settings['hidecaption'])) {
+        if ($instagram = $this->fetcher->fetchInstagramEmbed($matches['shortcode'], $settings['hidecaption'], $settings['width'])) {
           $element[$delta] = [
             '#theme' => 'media_entity_instagram_post',
             '#post' => (string) $instagram['html'],
@@ -104,6 +104,7 @@
    */
   public static function defaultSettings() {
     return array(
+      'width' => NULL,
       'hidecaption' => FALSE,
     ) + parent::defaultSettings();
   }
@@ -114,6 +115,14 @@
   public function settingsForm(array $form, FormStateInterface $form_state) {
     $elements = parent::settingsForm($form, $form_state);
 
+    $elements['width'] = array(
+      '#type' => 'number',
+      '#title' => $this->t('Width'),
+      '#default_value' => $this->getSetting('width'),
+      '#min' => 320,
+      '#description' => $this->t('Max width of instagram.'),
+    );
+
     $elements['hidecaption'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Caption hidden'),
@@ -129,9 +138,20 @@
    */
   public function settingsSummary() {
     $settings = $this->getSettings();
-    return [
-      $this->t('Caption: @hidecaption', ['@hidecaption' => $settings['hidecaption'] ? 'Hidden' : 'Visible']),
-    ];
+
+    $summary = [];
+
+    if ($this->getSetting('width')) {
+      $summary[] = $this->t('Width: @width px', [
+        '@width' => $this->getSetting('width'),
+      ]);
+    }
+
+    $summary[] = $this->t('Caption: @hidecaption', [
+      '@hidecaption' => $settings['hidecaption'] ? $this->t('Hidden') : $this->t('Visible'),
+    ]);
+
+    return $summary;
   }
 
 }
diff -u b/src/Plugin/MediaEntity/Type/Instagram.php b/src/Plugin/MediaEntity/Type/Instagram.php
--- b/src/Plugin/MediaEntity/Type/Instagram.php
+++ b/src/Plugin/MediaEntity/Type/Instagram.php
@@ -156,6 +156,10 @@
               return $local_uri;
             }
             else {
+
+              $directory = dirname($local_uri);
+              file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+
               $image_url = $this->getField($media, 'thumbnail');
 
               $response = $this->httpClient->get($image_url);
diff -u b/src/Tests/InstagramEmbedFormatterTest.php b/src/Tests/InstagramEmbedFormatterTest.php
--- b/src/Tests/InstagramEmbedFormatterTest.php
+++ b/src/Tests/InstagramEmbedFormatterTest.php
@@ -151,15 +151,17 @@
     // Create and save the media with an instagram media code.
     $this->drupalGet('media/add/' . $bundle->id());
 
-    // Random image from instagram.
-    $instagram = 'https://www.instagram.com/p/bNd86MSFv6/';  // example URL from https://www.instagram.com/developer/embedding/
+    // Example instagram from https://www.instagram.com/developer/embedding/
+    $instagram = 'https://www.instagram.com/p/bNd86MSFv6/';
 
     $edit = [
+      'name[0][value]' => 'My test instagram',
       'field_embed_code[0][value]' => $instagram,
     ];
     $this->drupalPostForm(NULL, $edit, t('Save and publish'));
 
     // Assert that the media has been successfully saved.
+    $this->assertText('My test instagram');
     $this->assertText('Embed code');
 
     // Assert that the formatter exists on this page and that it has absolute
only in patch2:
unchanged:
--- a/README.md
+++ b/README.md
@@ -11,38 +11,14 @@ entity within any other Drupal entity.
 This module provides Instagram integration for Media entity (i.e. media type provider
 plugin).
 
-### Without Instagram API
-If you need just to embembed instagrams you can use this module without using Instagram's API. That will give you access to the shortcode field available from the url/embed code.
-
+### Instagram API
+This module uses Instagrams oembed API to fetch the instagram html and all the metadata.
 You will need to:
 
 - Create a Media bundle with the type provider "Instagram".
 - On that bundle create a field for the Instagram url/source (this should be a plain text or link field).
 - Return to the bundle configuration and set "Field with source information" to use that field.
 
-**IMPORTANT:** beware that there is limit on the number of request that can be made for free. [Read more](http://instagram.com/developer/endpoints/)
-
-
-### With Instagram API
-If you need to get other fields, you will need to use Instagram's API. To get this working follow the steps below:
-
-- Download and enable [composer_manager](https://www.drupal.org/project/composer_manager). Also make sure you have [drush](https://github.com/drush-ops/drush) installed.
-- Run the following commands from within your Drupal root directory to download the [library](https://github.com/galen/PHP-Instagram-API) that will handle the communication:
-
-```
-  // Rebuild the composer.json file with updated dependencies.
-  $ drush composer-json-rebuild
-
-  // Install the required packages.
-  $ drush composer-manager install
-```
-- Create a instagram app on the instagram [developer site](http://instagram.com/developer/register/)
-- Enable read access for your instagram app
-- Grab your client ID from the instagram developer site
-- In your Instagram bundle configuration set "Whether to use Instagram api to fetch instagrams or not" to "Yes"" and paste in the "Client ID"
-
-**NOTE:** We are currently using a patched version of the library with the ability to get the media by shortcode. This is the pull request for it: https://github.com/galen/PHP-Instagram-API/pull/46/files
-
 ### Storing field values
 If you want to store the fields that are retrieved from Instagram you should create appropriate fields on the created media bundle (id) and map this to the fields provided by Instagram.php.
 
@@ -62,15 +38,12 @@ description: 'Instagram photo/video to be used with content.'
 type: instagram
 type_configuration:
   source_field: link
-  use_instagram_api: '1'
-  client_id: YOUR_CLIENT_ID
 field_map:
   id: instagram_id
   type: instagram_type
   thumbnail: instagram_thumbnail
   username: instagram_username
   caption: instagram_caption
-  tags: instagram_tags
 ```
 
 Project page: http://drupal.org/project/media_entity_instagram
