If you’re generating Secured API Keys using the JavaScript client on your frontend,
it will result in a security breach since the user is able to modify the filters you’ve set by modifying the code from the browser.
You can define a number of restrictions (valid until, restrict indices, etc.).
If you want to rate-limit a secured API Key,
the API key you generate from the secured api key needs to be rate-limited.
You can do that via the dashboard or the API using the
Add API Key or Update API Key method
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXX$public_key=\Algolia\AlgoliaSearch\SearchClient::generateSecuredApiKey('YourSearchOnlyApiKey',['filters'=>'_tags:user_42']);
Copy
1
2
3
# generate a public API key for user 42. Here, records are tagged with:# - 'user_XXXX' if they are visible by user XXXXpublic_key=Algolia.generate_secured_api_key('YourSearchOnlyApiKey',{filters: '_tags:user_42'})
Copy
1
2
3
4
5
6
7
8
9
10
// Only works in Node// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXconstpublicKey=client.generateSecuredApiKey('YourSearchOnlyApiKey',{filters:'_tags:user_42'});
Copy
1
2
3
4
5
6
7
8
# generate a public API key for user 42. Here, records are tagged with:
# - 'user_XXXX' if they are visible by user XXXX
fromalgoliasearch.search_clientimportSearchClientpublic_key=SearchClient.generate_secured_api_key('YourSearchOnlyApiKey',{'filters':'_tags:user_42'})
Copy
1
2
3
4
5
6
7
8
9
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXSecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction{Query=newQuery{Filters="_tags:user_42"},};client.GenerateSecuredApiKeys("YourSearchOnlyApiKey",restriction);
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
// Sync & Async version// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXSecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction().setQuery(newQuery().setFilters("_tags:user_42"));StringpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",restriction);
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXvalpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",Query(filters=Some("_tags:user_42")))
// generate a public API key that is valid for 1 hour:$validUntil=time()+3600;$public_key=\Algolia\AlgoliaSearch\SearchClient::generateSecuredApiKey('YourSearchOnlyApiKey',['validUntil'=>$validUntil]);
Copy
1
2
3
# generate a public API key that is valid for 1 hour:valid_until=Time.now.to_i+3600public_key=Algolia.generate_secured_api_key('YourSearchOnlyApiKey',{validUntil: valid_until})
Copy
1
2
3
4
5
6
7
8
9
10
// Only works in Node// generate a public API key that is valid for 1 hour:constvalidUntil=Math.floor(Date.now()/1000)+3600;constpublicKey=client.generateSecuredApiKey('YourSearchOnlyApiKey',{validUntil});
Copy
1
2
3
4
5
6
7
8
9
10
importtimefromalgoliasearch.search_clientimportSearchClient# generate a public API key that is valid for 1 hour:
valid_until=int(time.time())+3600public_key=SearchClient.generate_secured_api_key('YourSearchOnlyApiKey',{'validUntil':valid_until})
// generate a public API key that is valid for 1 hour:intvalidUntil=(int)(System.currentTimeMillis()/1000+3600);SecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction().setQuery(newQuery().setValidUntil(validUntil));StringpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",restriction);
Copy
1
2
3
4
5
// Generate a public API key that is valid for 1 hourkey,err:=search.GenerateSecuredAPIKey("YourSearchOnlyApiKey",opt.Filters("_tags:user_42"),)
// generate a public API key that is restricted to 'index1' and 'index2':$public_key=\Algolia\AlgoliaSearch\SearchClient::generateSecuredApiKey('YourSearchOnlyApiKey',['restrictIndices'=>'index1,index2']);
Copy
1
2
# generate a public API key that is restricted to 'index1' and 'index2':public_key=Algolia.generate_secured_api_key('YourSearchOnlyApiKey',{restrictIndices: 'index1,index2'})
Copy
1
2
3
4
5
6
7
8
9
10
// Only works in Node// generate a public API key that is restricted to 'index1' and 'index2':constpublicKey=client.generateSecuredApiKey('YourSearchOnlyApiKey',{restrictIndices:'index1,index2'});
Copy
1
2
3
4
5
6
7
fromalgoliasearch.search_clientimportSearchClient# generate a public API key that is restricted to 'index1' and 'index2':
public_key=SearchClient.generate_secured_api_key('YourSearchOnlyApiKey',{'restrictIndices':'index1,index2'})
// generate a public API key that is restricted to "index1" and "index2":SecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction().setRestrictIndices(Arrays.asList("index1","index2"))StringpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",restriction);
Copy
1
2
3
4
5
6
// Generate a public API key that is restricted to `index1` and `index2`key,err:=search.GenerateSecuredAPIKey("YourSearchOnlyApiKey",opt.RestrictIndices("index1","index2"),)
Copy
1
2
3
4
5
// generate a public API key that is restricted to 'index1' and 'index2':valpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",Query(restrictIndices=Some(Seq("index1","index2")))
# generate a public API key that is restricted to '192.168.1.0/24':$public_key=\Algolia\AlgoliaSearch\SearchClient::generateSecuredApiKey('YourSearchOnlyApiKey',['restrictSources'=>'192.168.1.0/24']);
Copy
1
2
# generate a public API key that is restricted to '192.168.1.0/24':public_key=Algolia.generate_secured_api_key('YourSearchOnlyApiKey',{restrictSources: '192.168.1.0/24'})
Copy
1
2
3
4
5
6
7
8
// Only works in Node// generate a public API key that is restricted to '192.168.1.0/24':constpublicKey=client.generateSecuredApiKey('YourSearchOnlyApiKey',{restrictSources:'192.168.1.0/24'});
Copy
1
2
3
4
5
6
7
fromalgoliasearch.search_clientimportSearchClient# generate a public API key that is restricted to '192.168.1.0/24':
public_key=SearchClient.generate_secured_api_key('YourSearchOnlyApiKey',{'restrictSources':'192.168.1.0/24'})
// Generate a public API key that is restricted to `192.168.1.0/24`key,err:=search.GenerateSecuredAPIKey("YourSearchOnlyApiKey",opt.RestrictSources("192.168.1.0/24"),)
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXX$public_key=\Algolia\AlgoliaSearch\SearchClient::generateSecuredApiKey('YourSearchOnlyApiKey',['filters'=>'user_42','userToken'=>'user_42']);
Copy
1
2
3
# generate a public API key for user 42. Here, records are tagged with:# - 'user_XXXX' if they are visible by user XXXXpublic_key=Algolia.generate_secured_api_key('YourSearchOnlyApiKey',{filters: '_tags:user_42',userToken: 'user_42'})
Copy
1
2
3
4
5
6
7
8
9
10
11
// Only works in Node// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXconstpublicKey=client.generateSecuredApiKey('YourSearchOnlyApiKey',{filters:'_tags:user_42',userToken:'user_42'});
Copy
1
2
3
4
5
6
7
8
fromalgoliasearch.search_clientimportSearchClient# generate a public API key for user 42. Here, records are tagged with:
# - 'user_XXXX' if they are visible by user XXXX
public_key=SearchClient.generate_secured_api_key('YourSearchOnlyApiKey',{'filters':'_tags:user_42','userToken':'user_42'})
Copy
1
2
3
4
5
6
7
8
9
10
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXSecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction{Query=newQuery{Filters="_tags:user_42"},UserToken="42"};client.GenerateSecuredApiKeys("YourSearchOnlyApiKey",restriction);
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
// Sync & Async version// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXSecuredApiKeyRestrictionrestriction=newSecuredApiKeyRestriction().setQuery(newQuery().setFilters("_tags:user_42").setUserToken("42"));StringpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",restriction);
Copy
1
2
3
4
5
6
7
8
// Generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXkey,err:=search.GenerateSecuredAPIKey("YourSearchOnlyApiKey",opt.Filters("_tags:user_42"),opt.UserToken("user_42"),)
Copy
1
2
3
4
5
6
// generate a public API key for user 42. Here, records are tagged with:// - 'user_XXXX' if they are visible by user XXXXvalpublicKey=client.generateSecuredApiKey("YourSearchOnlyApiKey",Query(filters=Some("_tags:user_42")),userToken=Some("42"))
Every filter set in the API key will always be applied.
On top of that, filters can be applied
in the query parameters.
If you set filters in the key groups:admin; and groups:press OR groups:visitors
in the searchParameter parameter; this will be equivalent to
groups:admin AND (groups:press OR groups:visitors).
validUntil
type: integer
default: no expiration date
Optional
A Unix timestamp used to define the expiration date of the API key.
restrictIndices
type: list
default: all indices
Optional
List of index names that can be queried.
restrictSources
type: string
default: no restricted sources
Optional
IPv4 network allowed to use the generated key.
This is used for more protection against API key leaking and reuse.
Note that you can only provide a single source, but you can specify a range of IPs (e.g., 192.168.1.0/24).
userToken
type: string
default: users' IP address
Optional
Specify a unique user identifier.
This is often used with rate limits.
By default, rate limits will only use the IP.
This can be an issue when several of your end users are using the same IP.
To avoid that, you can set a userToken query parameter when generating the key.
This allows you to restrict a single user to performing a maximum number of API calls per hour,
even if they share their IP with another user.
In this section we document the JSON response returned by the API.
Each language will encapsulate this response inside objects specific to the language and/or the implementation.
So the actual type in your language might differ from what is documented.