curl "https://api.alura.io/v1/research/keywords/88123/history" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/research/keywords/88123/history', {
headers: {
Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
},
});
console.log(await res.json());import json
import os
import urllib.request
request = urllib.request.Request(
"https://api.alura.io/v1/research/keywords/88123/history",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "research.history",
"resource": {
"object": "research.keyword",
"id": "88123"
},
"granularity": "month",
"history_through": "2026-09",
"data": [
{
"month": "2025-11",
"etsy_searches": 11000,
"google_searches": null
},
{
"month": "2025-12",
"etsy_searches": 12400,
"google_searches": null
},
{
"month": "2026-01",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-02",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-03",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-04",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-05",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-06",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-07",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-08",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-09",
"etsy_searches": null,
"google_searches": null
}
],
"as_of": "2026-10-12T04:00:00.000Z"
}{
"type": "https://docs.alura.io/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Invalid request",
"suggestion": "Fix the request as the detail says, then send it again.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"code": "unauthorized",
"detail": "Unauthorized",
"suggestion": "Send a valid API key as `Authorization: Bearer alura_sk_...`.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_exhausted",
"title": "API credits exhausted",
"status": 402,
"code": "credits_exhausted",
"detail": "API credits exhausted",
"suggestion": "Upgrade the plan or wait for the monthly reset.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/plan_required",
"title": "Plan required",
"status": 403,
"code": "plan_required",
"detail": "Plan required",
"suggestion": "Upgrade the workspace plan to use this operation.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Not found",
"suggestion": "Check the ID, or search for it first.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/method_not_allowed",
"title": "Method not allowed",
"status": 405,
"code": "method_not_allowed",
"detail": "Method not allowed",
"suggestion": "Use one of the methods in the Allow header.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/rate_limited",
"title": "Rate limited",
"status": 429,
"code": "rate_limited",
"detail": "Rate limited",
"suggestion": "Wait for Retry-After, then retry.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/internal_error",
"title": "Internal error",
"status": 500,
"code": "internal_error",
"detail": "Internal error",
"suggestion": "Retry; if it keeps failing, report the request_id.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_unavailable",
"title": "API credits unavailable",
"status": 503,
"code": "credits_unavailable",
"detail": "API credits unavailable",
"suggestion": "Retry shortly.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}Get a keyword's search history
A keyword’s monthly search volume (by the id the keyword lookup returned): Alura’s estimate of Etsy searches and Google’s figure, for every completed UTC month from the first one Alura has a figure for, in one response. A month without a figure is null. Needs the Growth plan or above (403 plan_required otherwise). An unknown ID is 404 not_found. Costs 1 API credit.
Cost: 1 API credit per call.
curl "https://api.alura.io/v1/research/keywords/88123/history" \
-H "Authorization: Bearer $ALURA_API_KEY"const res = await fetch('https://api.alura.io/v1/research/keywords/88123/history', {
headers: {
Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
},
});
console.log(await res.json());import json
import os
import urllib.request
request = urllib.request.Request(
"https://api.alura.io/v1/research/keywords/88123/history",
headers={
"Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
},
)
with urllib.request.urlopen(request) as response:
print(json.load(response)){
"object": "research.history",
"resource": {
"object": "research.keyword",
"id": "88123"
},
"granularity": "month",
"history_through": "2026-09",
"data": [
{
"month": "2025-11",
"etsy_searches": 11000,
"google_searches": null
},
{
"month": "2025-12",
"etsy_searches": 12400,
"google_searches": null
},
{
"month": "2026-01",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-02",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-03",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-04",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-05",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-06",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-07",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-08",
"etsy_searches": null,
"google_searches": null
},
{
"month": "2026-09",
"etsy_searches": null,
"google_searches": null
}
],
"as_of": "2026-10-12T04:00:00.000Z"
}{
"type": "https://docs.alura.io/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Invalid request",
"suggestion": "Fix the request as the detail says, then send it again.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"code": "unauthorized",
"detail": "Unauthorized",
"suggestion": "Send a valid API key as `Authorization: Bearer alura_sk_...`.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_exhausted",
"title": "API credits exhausted",
"status": 402,
"code": "credits_exhausted",
"detail": "API credits exhausted",
"suggestion": "Upgrade the plan or wait for the monthly reset.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/plan_required",
"title": "Plan required",
"status": 403,
"code": "plan_required",
"detail": "Plan required",
"suggestion": "Upgrade the workspace plan to use this operation.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Not found",
"suggestion": "Check the ID, or search for it first.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/method_not_allowed",
"title": "Method not allowed",
"status": 405,
"code": "method_not_allowed",
"detail": "Method not allowed",
"suggestion": "Use one of the methods in the Allow header.",
"retryable": false,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/rate_limited",
"title": "Rate limited",
"status": 429,
"code": "rate_limited",
"detail": "Rate limited",
"suggestion": "Wait for Retry-After, then retry.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/internal_error",
"title": "Internal error",
"status": 500,
"code": "internal_error",
"detail": "Internal error",
"suggestion": "Retry; if it keeps failing, report the request_id.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}{
"type": "https://docs.alura.io/errors/credits_unavailable",
"title": "API credits unavailable",
"status": 503,
"code": "credits_unavailable",
"detail": "API credits unavailable",
"suggestion": "Retry shortly.",
"retryable": true,
"request_id": "req_01JQ5W3H8M2N4P6R8T0V2X4Z6B"
}Authorizations
An API key: Authorization: Bearer alura_sk_....
Path Parameters
Alura's keyword ID, from the keyword lookup.
^[1-9][0-9]{0,18}$"88123"
Query Parameters
Comma-separated dotted paths to return; id, object and as_of always come back.
Response
OK
"research.history"Show child attributes
Show child attributes
"month"The last completed UTC month; data ends here.
^\d{4}-\d{2}$Every month from the first one Alura has a figure for through history_through, oldest first. A month without a figure is null: a gap, a month after the keyword was last calculated (as_of), and the month it was calculated in, which was not over yet.
Show child attributes
Show child attributes
When the keyword was last calculated.