> ## Documentation Index
> Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Regions

> See information about Upsun regions, including their environmental impact and IP addresses.

export const MetaRegionGreenList = () => {
  const [regions, setRegions] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [isDarkMode, setIsDarkMode] = useState(false);
  const STORAGE_KEY = 'upsun_regions_cache';
  const CACHE_TTL = 1 * 60 * 60 * 1000;
  const API_URL = 'https://meta.upsun.com/regions';
  useEffect(() => {
    const controller = new AbortController();
    setLoading(true);
    setError(null);
    const fetchData = async () => {
      if (typeof localStorage !== 'undefined') {
        try {
          const cached = localStorage.getItem(STORAGE_KEY);
          if (cached) {
            const {data, timestamp} = JSON.parse(cached);
            if (Date.now() - timestamp < CACHE_TTL) return data;
            localStorage.removeItem(STORAGE_KEY);
          }
        } catch (error_) {
          console.error('Failed to load from cache:', error_);
        }
      }
      const response = await fetch(API_URL, {
        signal: controller.signal
      });
      if (!response.ok) throw new Error(`API request failed: ${response.statusText}`);
      const data = await response.json();
      if (typeof localStorage !== 'undefined') {
        try {
          localStorage.setItem(STORAGE_KEY, JSON.stringify({
            data,
            timestamp: Date.now()
          }));
        } catch (error_) {
          console.error('Failed to cache data:', error_);
        }
      }
      return data;
    };
    fetchData().then(data => {
      if (!data || typeof data !== 'object' || Array.isArray(data)) {
        setRegions([]);
        setLoading(false);
        return;
      }
      const availableRegions = Object.values(data).filter(r => r.available === true);
      setRegions(availableRegions);
      setLoading(false);
    }).catch(error_ => {
      if (error_?.name === 'AbortError') return;
      console.error('RegionLocation error:', error_);
      setError(error_.message);
      setLoading(false);
    });
    return () => {
      controller.abort();
    };
  }, []);
  useEffect(() => {
    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    const onThemeChange = event => setIsDarkMode(event.matches);
    setIsDarkMode(mediaQuery.matches);
    mediaQuery.addEventListener('change', onThemeChange);
    return () => {
      mediaQuery.removeEventListener('change', onThemeChange);
    };
  }, []);
  const filtered = regions.filter(r => {
    if (r.environmental_impact?.carbon_intensity <= 100) return true;
    return false;
  });
  if (loading) return <p>Loading regions...</p>;
  if (error) return <p>Error: {error}</p>;
  if (!regions || regions.length === 0) return <p>No regions found.</p>;
  return <ul>
      {filtered.filter(r => r.environmental_impact?.green).map(region => <li key={region.id || region.name || region.label}>
          {region.datacenter?.location || region.label} (<code>{region.name || 'Unknown provider'}</code>)
        </li>)}
    </ul>;
};

export const MetaRegionLocationTable = () => {
  const GreenLeafIcon = ({label}) => <svg viewBox="0 0 24 24" width="16" height="16" aria-label={label} role="img" style={{
    fill: 'var(--color-success, #2e7d32)'
  }}>
      <title>{label}</title>
      <path d="M4.3 19.7A1 1 0 0 0 5 20a1 1 0 0 0 .7-.3l1.8-1.8c.9.4 2.2.8 3.6.8 1.6 0 3.3-.5 4.9-2 3.4-3.4 4-11.3 4-11.6a1 1 0 0 0-.3-.8 1 1 0 0 0-.8-.3c-.3 0-8.4.8-11.6 4C5.3 10 5 12.4 5.4 14.4l6-3.3-7.2 7.2a1 1 0 0 0 .1 1.4Z" />
    </svg>;
  const SortIcon = ({direction}) => <svg viewBox="0 0 12 12" width="12" height="12" style={{
    fill: 'currentColor',
    opacity: direction ? 1 : 0.3
  }}>
      {direction === 'asc' ? <path d="M6 2L10 8H2L6 2Z" /> : direction === 'desc' ? <path d="M6 10L2 4H10L6 10Z" /> : <><path d="M6 2L10 6H2L6 2Z" opacity="0.4" /><path d="M6 10L2 6H10L6 10Z" opacity="0.4" /></>}
    </svg>;
  const [regions, setRegions] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [isDarkMode, setIsDarkMode] = useState(false);
  const [sortCol, setSortCol] = useState('name');
  const [sortDir, setSortDir] = useState('asc');
  const [filters, setFilters] = useState({
    provider: '',
    zone: '',
    green: ''
  });
  const [openDropdown, setOpenDropdown] = useState(null);
  const FilterDropdown = ({label, value, options, filterKey}) => {
    const isOpen = openDropdown === filterKey;
    const ref = useRef(null);
    useEffect(() => {
      if (!isOpen) return;
      const handleClick = e => {
        if (ref.current && !ref.current.contains(e.target)) setOpenDropdown(null);
      };
      document.addEventListener('mousedown', handleClick);
      return () => document.removeEventListener('mousedown', handleClick);
    }, [isOpen]);
    return <div ref={ref} style={{
      position: 'relative'
    }}>
        <button className="region-filter" onClick={() => setOpenDropdown(isOpen ? null : filterKey)}>
          {value || label}
        </button>
        {isOpen && <div className="region-dropdown">
            <button className={'region-dropdown-item' + (!value ? ' active' : '')} onClick={() => {
      setFilters({
        ...filters,
        [filterKey]: ''
      });
      setOpenDropdown(null);
    }}>
              {label}
            </button>
            {options.map(opt => <button key={opt.value} className={'region-dropdown-item' + (value === opt.value ? ' active' : '')} onClick={() => {
      setFilters({
        ...filters,
        [filterKey]: opt.value
      });
      setOpenDropdown(null);
    }}>
                {opt.label}
              </button>)}
          </div>}
      </div>;
  };
  const STORAGE_KEY = 'upsun_regions_cache';
  const CACHE_TTL = 1 * 60 * 60 * 1000;
  const API_URL = 'https://meta.upsun.com/regions';
  useEffect(() => {
    const controller = new AbortController();
    setLoading(true);
    setError(null);
    const fetchData = async () => {
      if (typeof localStorage !== 'undefined') {
        try {
          const cached = localStorage.getItem(STORAGE_KEY);
          if (cached) {
            const {data, timestamp} = JSON.parse(cached);
            if (Date.now() - timestamp < CACHE_TTL) return data;
            localStorage.removeItem(STORAGE_KEY);
          }
        } catch (error_) {
          console.error('Failed to load from cache:', error_);
        }
      }
      const response = await fetch(API_URL, {
        signal: controller.signal
      });
      if (!response.ok) throw new Error(`API request failed: ${response.statusText}`);
      const data = await response.json();
      if (typeof localStorage !== 'undefined') {
        try {
          localStorage.setItem(STORAGE_KEY, JSON.stringify({
            data,
            timestamp: Date.now()
          }));
        } catch (error_) {
          console.error('Failed to cache data:', error_);
        }
      }
      return data;
    };
    fetchData().then(data => {
      if (!data || typeof data !== 'object' || Array.isArray(data)) {
        setRegions([]);
        setLoading(false);
        return;
      }
      const availableRegions = Object.values(data).filter(r => r.available === true);
      setRegions(availableRegions);
      setLoading(false);
    }).catch(error_ => {
      if (error_?.name === 'AbortError') return;
      console.error('RegionLocation error:', error_);
      setError(error_.message);
      setLoading(false);
    });
    return () => {
      controller.abort();
    };
  }, []);
  useEffect(() => {
    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    const onThemeChange = event => setIsDarkMode(event.matches);
    setIsDarkMode(mediaQuery.matches);
    mediaQuery.addEventListener('change', onThemeChange);
    return () => {
      mediaQuery.removeEventListener('change', onThemeChange);
    };
  }, []);
  const handleSort = col => {
    if (sortCol === col) {
      setSortDir(sortDir === 'asc' ? 'desc' : 'asc');
    } else {
      setSortCol(col);
      setSortDir('asc');
    }
  };
  const getValue = (region, col) => {
    switch (col) {
      case 'name':
        return region.name || region.label || '';
      case 'provider':
        return region.provider?.name || region.provider || '';
      case 'zone':
        return region.zone || '';
      case 'timezone':
        return region.timezone || '';
      case 'green':
        return region.environmental_impact?.green ? 1 : 0;
      default:
        return '';
    }
  };
  const providers = [...new Set(regions.map(r => r.provider?.name || r.provider || ''))].sort();
  const zones = [...new Set(regions.map(r => r.zone || ''))].sort();
  const filtered = regions.filter(r => {
    if (filters.provider && (r.provider?.name || r.provider || '') !== filters.provider) return false;
    if (filters.zone && (r.zone || '') !== filters.zone) return false;
    if (filters.green === 'yes' && !r.environmental_impact?.green) return false;
    if (filters.green === 'no' && r.environmental_impact?.green) return false;
    return true;
  });
  const sorted = [...filtered].sort((a, b) => {
    const aVal = getValue(a, sortCol);
    const bVal = getValue(b, sortCol);
    const cmp = typeof aVal === 'number' ? aVal - bVal : String(aVal).localeCompare(String(bVal));
    return sortDir === 'asc' ? cmp : -cmp;
  });
  const hasActiveFilters = filters.provider || filters.zone || filters.green;
  if (loading) return <p>Loading regions...</p>;
  if (error) return <p>Error: {error}</p>;
  if (!regions || regions.length === 0) return <p>No regions found.</p>;
  return <div>
      <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '20px',
    marginBottom: '12px',
    alignItems: 'center'
  }}>
        <FilterDropdown label="All Providers" value={filters.provider} filterKey="provider" options={providers.map(p => ({
    value: p,
    label: p
  }))} />
        <FilterDropdown label="All Zones" value={filters.zone} filterKey="zone" options={zones.map(z => ({
    value: z,
    label: z
  }))} />
        <FilterDropdown label="All (Green)" value={filters.green === 'yes' ? 'Green only' : filters.green === 'no' ? 'Non-green only' : ''} filterKey="green" options={[{
    value: 'yes',
    label: 'Green only'
  }, {
    value: 'no',
    label: 'Non-green only'
  }]} />
        {hasActiveFilters && <button onClick={() => setFilters({
    provider: '',
    zone: '',
    green: ''
  })} className="region-clear-btn">
            Clear filters
          </button>}
        <span style={{
    fontSize: '12px',
    color: 'var(--color-text-subtle, #6b7a90)',
    marginLeft: 'auto'
  }}>
          {sorted.length} of {regions.length} regions
        </span>
      </div>
      <table>
        <thead>
          <tr>
            {[{
    key: 'name',
    label: 'Name'
  }, {
    key: 'provider',
    label: 'Provider',
    width: '80px'
  }, {
    key: 'zone',
    label: 'Geographic Zone'
  }, {
    key: 'timezone',
    label: 'Timezone'
  }, {
    key: 'green',
    label: 'Green',
    width: '60px'
  }].map(col => <th key={col.key} onClick={() => handleSort(col.key)} className="region-sort-th" style={col.width ? {
    width: col.width,
    minWidth: col.width,
    paddingLeft: 0
  } : undefined}>
                <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '4px'
  }}>
                  {col.label}
                  <SortIcon direction={sortCol === col.key ? sortDir : null} />
                </span>
              </th>)}
          </tr>
        </thead>
        <tbody>
          {sorted.map(region => <tr key={region.id || region.name || region.label} className="region-table-row" onClick={() => {
    const targetId = `region-${(region.label || region.id || '').replace(/[^a-zA-Z0-9-]/g, '-').toLowerCase()}`;
    const el = document.getElementById(targetId);
    if (el) el.scrollIntoView({
      behavior: 'smooth',
      block: 'center'
    });
  }}>
              <td>
                <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '0.4rem'
  }}>
                  {region.name || region.label || '-'}
                </span>
              </td>
              <td style={{
    width: '80px',
    minWidth: '80px'
  }}>
                <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '0.4rem'
  }}>
                  {region.provider?.logo ? <img src={`data:image/svg+xml;base64,${region.provider.logo}`} alt={region.provider?.name ? `${region.provider.name} logo` : 'Provider logo'} title={region.provider?.name || region.provider || 'Provider'} style={{
    margin: 0,
    padding: 0,
    display: 'block',
    pointerEvents: 'none'
  }} height="20" loading="lazy" /> : <span>{region.provider?.name || region.provider || '-'}</span>}
                </span>
              </td>
              <td>{region.zone}</td>
              <td>{region.timezone}</td>
              <td style={{
    width: '60px',
    minWidth: '60px'
  }}>
                <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '0.4rem'
  }}>
                  {region.environmental_impact?.green && <GreenLeafIcon label={`~${region.environmental_impact?.carbon_intensity ?? '-'} gCO2eq/kWh`} />}
                </span>
              </td>
            </tr>)}
        </tbody>
      </table>
    </div>;
};

export const MetaRegionIpGrid = ({zone}) => {
  const GreenLeafIcon = ({label}) => <svg viewBox="0 0 24 24" width="16" height="16" aria-label={label} role="img" style={{
    fill: 'var(--color-success, #2e7d32)'
  }}>
      <title>{label}</title>
      <path d="M4.3 19.7A1 1 0 0 0 5 20a1 1 0 0 0 .7-.3l1.8-1.8c.9.4 2.2.8 3.6.8 1.6 0 3.3-.5 4.9-2 3.4-3.4 4-11.3 4-11.6a1 1 0 0 0-.3-.8 1 1 0 0 0-.8-.3c-.3 0-8.4.8-11.6 4C5.3 10 5 12.4 5.4 14.4l6-3.3-7.2 7.2a1 1 0 0 0 .1 1.4Z" />
    </svg>;
  const [regions, setRegions] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [isDarkMode, setIsDarkMode] = useState(false);
  const STORAGE_KEY = 'upsun_regions_cache';
  const CACHE_TTL = 5 * 60 * 1000;
  const API_URL = 'https://meta.upsun.com/regions';
  useEffect(() => {
    setLoading(true);
    setError(null);
    const fetchData = async () => {
      let cachedData = null;
      let cachedEtag = null;
      if (typeof localStorage !== 'undefined') {
        try {
          const cached = localStorage.getItem(STORAGE_KEY);
          if (cached) {
            const parsed = JSON.parse(cached);
            cachedData = parsed?.data || null;
            cachedEtag = parsed?.etag || null;
            if (cachedData && Date.now() - parsed.timestamp < CACHE_TTL) return cachedData;
          }
        } catch (error_) {
          console.error('Failed to load from cache:', error_);
        }
      }
      const requestHeaders = cachedEtag ? {
        'If-None-Match': cachedEtag
      } : {};
      const response = await fetch(API_URL, {
        headers: requestHeaders
      });
      if (response.status === 304 && cachedData) {
        if (typeof localStorage !== 'undefined') {
          try {
            const etag = response.headers.get('etag') || cachedEtag;
            localStorage.setItem(STORAGE_KEY, JSON.stringify({
              data: cachedData,
              etag,
              timestamp: Date.now()
            }));
          } catch (error_) {
            console.error('Failed to refresh cache metadata:', error_);
          }
        }
        return cachedData;
      }
      if (!response.ok) throw new Error(`API request failed: ${response.statusText}`);
      const data = await response.json();
      const etag = response.headers.get('etag');
      if (typeof localStorage !== 'undefined') {
        try {
          localStorage.setItem(STORAGE_KEY, JSON.stringify({
            data,
            etag,
            timestamp: Date.now()
          }));
        } catch (error_) {
          console.error('Failed to cache data:', error_);
        }
      }
      return data;
    };
    fetchData().then(data => {
      if (!data || typeof data !== 'object' || Array.isArray(data)) {
        setRegions([]);
        setLoading(false);
        return;
      }
      let filteredRegions = Object.values(data);
      if (zone) {
        const zoneLower = zone.toLowerCase();
        filteredRegions = filteredRegions.filter(r => {
          if (r.id?.toLowerCase() === zoneLower) return true;
          if (r.zone?.toLowerCase() === zoneLower) return true;
          if (zoneLower === 'us' || zoneLower === 'united states') return r.label?.toLowerCase().includes('united states');
          if (zoneLower === 'canada') return r.label?.toLowerCase().includes('canada');
          if (zoneLower === 'australia') return r.label?.toLowerCase().includes('australia');
          if (zoneLower.length > 2 && r.label?.toLowerCase().includes(zoneLower)) return true;
          return false;
        });
      }
      const availableRegions = filteredRegions.sort((a, b) => a.id.localeCompare(b.id));
      setRegions(availableRegions);
      setLoading(false);
    }).catch(error_ => {
      console.error('MetaRegionIpGrid error:', error_);
      setError(error_.message);
      setLoading(false);
    });
  }, [zone]);
  useEffect(() => {
    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    const onThemeChange = event => setIsDarkMode(event.matches);
    setIsDarkMode(mediaQuery.matches);
    mediaQuery.addEventListener('change', onThemeChange);
    return () => {
      mediaQuery.removeEventListener('change', onThemeChange);
    };
  }, []);
  if (loading) return <p>Loading regions...</p>;
  if (error) return <p>Error: {error}</p>;
  if (!regions || regions.length === 0) return <p>No regions available{zone ? ` for zone: ${zone}` : ''}.</p>;
  return <div style={{
    display: 'grid',
    gap: '12px'
  }}>
      {regions.map(r => <div key={r.id || r.label} id={`region-${(r.label || r.id || '').replace(/[^a-zA-Z0-9-]/g, '-').toLowerCase()}`} style={{
    border: '1px solid var(--border, #e2e8f0)',
    borderRadius: '8px',
    padding: '16px 20px',
    scrollMarginTop: '80px'
  }}>
          <div style={{
    display: 'flex',
    alignItems: 'center',
    gap: '12px',
    marginBottom: '12px'
  }}>
            <span style={{
    fontSize: '16px',
    fontWeight: 600
  }}>{r.name}</span>
            <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    marginLeft: 'auto',
    fontSize: '11px',
    fontWeight: 600,
    padding: '2px 8px',
    borderRadius: '4px',
    backgroundColor: 'var(--color-bg-alt, #f0f1f2)',
    color: 'var(--color-text-subtle, #6b7a90)'
  }}>
              {r.provider?.logo ? <img src={`data:image/svg+xml;base64,${r.provider.logo}`} alt={r.provider?.name ? `${r.provider.name} logo` : 'Provider logo'} style={{
    margin: 0,
    padding: 0,
    display: 'block',
    pointerEvents: 'none'
  }} height="24" loading="lazy" /> : null}
              {}
            </span>
          </div>
          <div style={{
    display: 'flex',
    alignItems: 'center',
    fontSize: '13px',
    fontFamily: 'var(--mono, monospace)',
    color: 'var(--color-text-muted, #2b3134)',
    marginBottom: '12px',
    gap: '0.6rem'
  }}>
            <span>{r.label}</span>
            <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '0.4rem',
    marginLeft: 'auto'
  }}>
              {r.environmental_impact?.green && <GreenLeafIcon label={`~${r.environmental_impact?.carbon_intensity ?? '-'} gCO2eq/kWh`} />} {`~${r.environmental_impact?.carbon_intensity ?? '-'} gCO2eq/kWh`}
            </span>
          </div>
          <div style={{
    display: 'grid',
    gridTemplateColumns: '1fr 1fr',
    gap: '16px',
    fontSize: '13px'
  }}>
            <div>
              <div style={{
    fontWeight: 600,
    marginBottom: '4px',
    fontSize: '12px',
    color: 'var(--color-text-subtle, #6b7a90)',
    textTransform: 'uppercase',
    letterSpacing: '0.05em'
  }}>Outbound IPs</div>
              <div style={{
    fontFamily: 'var(--mono, monospace)',
    lineHeight: 1.8
  }}>
                {r.outbound_ips?.map(ip => <div key={ip}>{ip}</div>)}
              </div>
            </div>
            <div>
              <div style={{
    fontWeight: 600,
    marginBottom: '4px',
    fontSize: '12px',
    color: 'var(--color-text-subtle, #6b7a90)',
    textTransform: 'uppercase',
    letterSpacing: '0.05em'
  }}>Inbound IPs</div>
              <div style={{
    fontFamily: 'var(--mono, monospace)',
    marginBottom: '4px',
    fontSize: '12px',
    wordBreak: 'break-all'
  }}>
                {r.inbound_location || `gw.${r.label}`}
              </div>
              <div style={{
    fontFamily: 'var(--mono, monospace)',
    lineHeight: 1.8
  }}>
                {r.inbound_ips?.map(ip => <div key={ip}>{ip}</div>)}
              </div>
            </div>
          </div>
        </div>)}
    </div>;
};

Upsun offers several regions for hosting project data.
You can choose a region based on criteria such as its closeness to your users and its environmental impact.

## Environmental impact

Whenever you create a project with us, we provide information about the [carbon intensity level](https://upsun.com/greener-hosting/) of the region you are choosing.
This number indicates if the area is "greener", meaning if the local electric grid relies on high-carbon energy sources or not.
We consider a region as "greener" when the carbon intensity number is below 100 CO2e/kWh.
When choosing a region with a lower carbon intensity number, you are choosing greener sources of energy behind the data center electricity consumption, like renewables or nuclear power.
And we offer a 3% discount for this sustainable choice ([estimate your discount](#greener-region-discount)).

This carbon intensity data is sourced from the annual averages provided by the [IEA](https://www.iea.org/) and [ElectricityMaps](https://www.electricitymaps.com/).
If you want to see real-time emissions generated by each power grid, we recommend checking out [ElectricityMaps](https://app.electricitymap.org/map) live data.

Summary of data being used in Upsun's Region Picker when creating a new Project:

| Source                                                                                                                                                                                                                                                                                                    | Last update of this page |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| We usually consider a region "greener" when it has a carbon density \<100 CO2e/kWh. Carbon intensity data sourced from IEA 2024, ElectricityMaps 2025. While ElectricityMaps give us more granularity for certain regions, we tend to favor IEA databases, as they are the most recognized on the market. | 8 April 2026             |

Information on carbon intensity is also available in the Upsun API.
For example, to get a list of the regions and their carbon intensities, run the following command:

```bash theme={null}
upsun api:curl regions | jq -r '.regions[] | select(.available != false) | "\(.label): \(.environmental_impact.carbon_intensity)"'
```

See all available information in the [API documentation](https://api.platform.sh/docs/#tag/Regions).

### Carbon Emissions dashboard

The [carbon emissions dashboard](https://upsun.com/blog/carbon-emissions-dashboard/) provides an overview of the yearly carbon footprint associated with your cloud resource usage.
Leveraging real usage data from the cloud bills provided by AWS, GCP and Azure, we partnered with the third-party climate experts Greenly to develop our own methodology to estimate your cloud emissions.
Users can view total emissions and project specific emissions (in kg CO2e) for the past year.

#### Access the dashboard

This dashboard is accessible via the Emissions tab within the Billing section in Console.

#### How is this calculated?

We collect detailed billing data from our cloud service providers (including associated costs and quantities) and this information is represented as line items.

Greenly, our climate expert partner for this project, calculates the energy use and embodied emissions for each line item. This is done through data gathering and modeling that estimates energy consumption, power usage effectiveness (PUE), and carbon intensity for the cloud providers. Using cost allocation models, your project’s share of emissions is then estimated.

We have been working closely with Greenly to build upon the model, tailoring it to better reflect our specific data and technical requirements to ensure your emissions data is credible, compliant and supports your progress toward real, measurable sustainability targets.

<Warning>
  Only AWS, GCP and Azure data are available in this dashboard.  Other providers are not covered by this analysis.
</Warning>

#### What affects emissions?

* **Where you run:** Data center regions vary greatly in grid-carbon intensity. Selecting a cleaner region is the most impactful way to reduce footprint.

* **What you provision:** Emissions rise in proportion to the resources you allocate.

<Tip>
  Optimizing code or app performance reduces emissions only if it leads to lower resource allocation.
</Tip>

### Greener Region Discount

You can get a 3% discount on your resource usage if you host your project in one of Upsun's eco-friendly regions:

<MetaRegionGreenList />

The 3% discount covers application CPU, application memory, service CPU, service memory, and build resources.
It **doesn’t** apply to the project fee or other billing aspects.
It can be combined with other offers or discounts.

See [more information on the greener region discount](https://upsun.com/blog/announcing-greener-region-discount/).

## Region availability

The regions listed here may be different from those available to you when you create a new project.
Each organization can have its own rules for what regions to allow.
When adding a new project, you only see regions allowed by your organization.

## Region location

<MetaRegionLocationTable />

<Info>
  As an alternative, you can also browse the full region list at [https://meta.upsun.com/regions](https://meta.upsun.com/regions).

  You can also use the following command with the Upsun CLI to find out where a given region is hosted:

  ```bash theme={null}
  upsun api:curl regions | jq '.regions[] | select(.available)  | .id + ": " + .provider.name + " - " + .zone + " - " + .timezone' | sort
  ```

  The returned list contains, for each available region, its name, provider, geographic zone and its timezone - as shown above.
</Info>

## Public IP addresses

The public IP addresses for regions are stable, but not guaranteed to never change.
Before any change, you are notified well in advance regarding affected projects.

They're useful for cases such as when you have a corporate firewall that blocks outgoing SSH connections.
In such cases, add the inbound IP addresses for your region to your allow list.

## Regions

### <img src="https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/1f1e6-1f1fa.svg" width="24" height="24" style={{display: 'inline', verticalAlign: 'middle', margin: '0 6px 2px 0'}} alt="Australia flag" /> Australia

<MetaRegionIpGrid zone="Australia" />

### <img src="https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/1f1e8-1f1e6.svg" width="24" height="24" style={{display: 'inline', verticalAlign: 'middle', margin: '0 6px 2px 0'}} alt="Canada flag" /> Canada

<MetaRegionIpGrid zone="Canada" />

### <img src="https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/1f1ea-1f1fa.svg" width="24" height="24" style={{display: 'inline', verticalAlign: 'middle', margin: '0 6px 2px 0'}} alt="Europe flag" /> Europe

<MetaRegionIpGrid zone="Europe" />

### <img src="https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/1f1fa-1f1f8.svg" width="24" height="24" style={{display: 'inline', verticalAlign: 'middle', margin: '0 6px 2px 0'}} alt="United States flag" /> United States

<MetaRegionIpGrid zone="US" />
