Packages

Community-maintained rate limits and concurrency settings for popular APIs

Current section

Files

Jump to
ezconfig src ezconfig.erl
Raw

src/ezconfig.erl

-module(ezconfig).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/ezconfig.gleam").
-export([get_config/1, get_rps/1, get_max_concurrent/1, list_domains/0, has_config/1]).
-export_type([api_config/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type api_config() :: {api_config, integer(), integer(), binary()}.
-file("src/ezconfig.gleam", 31).
?DOC(
" Community-maintained API configurations\n"
" Update this dict and publish a new version to add/modify APIs\n"
).
-spec api_configs() -> gleam@dict:dict(binary(), api_config()).
api_configs() ->
maps:from_list(
[{<<"api.openai.com"/utf8>>,
{api_config,
60,
10,
<<"Tier 1: 60 req/min = 1 req/sec, but bursts allowed"/utf8>>}},
{<<"api.anthropic.com"/utf8>>,
{api_config, 50, 5, <<"Claude API rate limits"/utf8>>}},
{<<"api.stripe.com"/utf8>>,
{api_config,
100,
20,
<<"Stripe has high rate limits, can handle concurrent requests well"/utf8>>}},
{<<"api.github.com"/utf8>>,
{api_config,
10,
3,
<<"GitHub API: 5000 req/hour = ~1.4 req/sec, be conservative"/utf8>>}},
{<<"api.twitter.com"/utf8>>,
{api_config,
15,
5,
<<"Twitter API v2 rate limits vary by endpoint"/utf8>>}},
{<<"graph.facebook.com"/utf8>>,
{api_config,
200,
10,
<<"Facebook Graph API has high limits"/utf8>>}},
{<<"www.googleapis.com"/utf8>>,
{api_config,
10,
5,
<<"Google APIs vary widely, this is conservative default"/utf8>>}},
{<<"slack.com"/utf8>>,
{api_config,
1,
1,
<<"Slack webhooks: 1 req/sec tier limit"/utf8>>}},
{<<"discord.com"/utf8>>,
{api_config,
50,
10,
<<"Discord API has generous rate limits"/utf8>>}},
{<<"api.sendgrid.com"/utf8>>,
{api_config, 10, 5, <<"SendGrid email API"/utf8>>}},
{<<"api.twilio.com"/utf8>>,
{api_config, 20, 5, <<"Twilio messaging API"/utf8>>}},
{<<"api.hubspot.com"/utf8>>,
{api_config,
10,
3,
<<"HubSpot CRM API: 100 req/10sec = 10 req/sec"/utf8>>}},
{<<"api.notion.com"/utf8>>,
{api_config, 3, 2, <<"Notion API: 3 req/sec rate limit"/utf8>>}},
{<<"api.airtable.com"/utf8>>,
{api_config,
5,
2,
<<"Airtable API: 5 req/sec rate limit"/utf8>>}},
{<<"shopify.com"/utf8>>,
{api_config,
2,
2,
<<"Shopify REST API: 2 req/sec (burst 40)"/utf8>>}}]
).
-file("src/ezconfig.gleam", 105).
?DOC(" Get configuration for a specific API domain\n").
-spec get_config(binary()) -> gleam@option:option(api_config()).
get_config(Domain) ->
_pipe = gleam_stdlib:map_get(api_configs(), Domain),
gleam@option:from_result(_pipe).
-file("src/ezconfig.gleam", 110).
?DOC(" Get RPS for a domain, or None if not configured\n").
-spec get_rps(binary()) -> gleam@option:option(integer()).
get_rps(Domain) ->
case get_config(Domain) of
{some, Config} ->
{some, erlang:element(2, Config)};
none ->
none
end.
-file("src/ezconfig.gleam", 118).
?DOC(" Get max_concurrent for a domain, or None if not configured\n").
-spec get_max_concurrent(binary()) -> gleam@option:option(integer()).
get_max_concurrent(Domain) ->
case get_config(Domain) of
{some, Config} ->
{some, erlang:element(3, Config)};
none ->
none
end.
-file("src/ezconfig.gleam", 126).
?DOC(" Get all configured domains\n").
-spec list_domains() -> list(binary()).
list_domains() ->
maps:keys(api_configs()).
-file("src/ezconfig.gleam", 131).
?DOC(" Check if a domain has a configuration\n").
-spec has_config(binary()) -> boolean().
has_config(Domain) ->
case get_config(Domain) of
{some, _} ->
true;
none ->
false
end.