Make your first request
Send your key in a header, POST a request to a source, and the records come back as JSON in the same response. No client library is needed.
Get a key
Create a key at https://api.urakimon.com/account. The secret starts with urakimon_ and is shown once, when the key is created. Store it in an environment variable named URAKIMON_API_KEY; every sample on this site reads it from there.
Note. The secret cannot be shown again after creation. If you lose it, rotate the key on the account page: you get a new secret and the old one stops working at once. See Authentication.
Send the first request
POST /records/amazon runs the request while the connection is open and returns up to 500 records in one response. The body below is the example request for Amazon from the Amazon page; every field you leave out falls back to the source default.
curl
curl -X POST https://api.urakimon.com/records/amazon \
-H "x-api-key: $URAKIMON_API_KEY" \
-H "content-type: application/json" \
-d '{"mode":"product","asins":["B0H1KXX5TL","B0F5HPCLGB","B0GG9BY46M"],"country":"US"}'Node
const res = await fetch("https://api.urakimon.com/records/amazon", {
method: "POST",
headers: {
"x-api-key": process.env.URAKIMON_API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"mode": "product",
"asins": [
"B0H1KXX5TL",
"B0F5HPCLGB",
"B0GG9BY46M"
],
"country": "US"
}),
});
const { ok, records, count, error } = await res.json();
if (!ok) throw new Error(error);
console.log(count, "records");Python
import os
import requests
res = requests.post(
"https://api.urakimon.com/records/amazon",
headers={"x-api-key": os.environ["URAKIMON_API_KEY"]},
json={
"mode": "product",
"asins": [
"B0H1KXX5TL",
"B0F5HPCLGB",
"B0GG9BY46M",
],
"country": "US",
},
)
res.raise_for_status()
records = res.json()["records"]
print(len(records), "records")What comes back
The response is one JSON object.
| Field | Meaning |
|---|---|
ok | true when the run finished and the records are complete |
records | the records, one object each |
count | how many objects are in records |
jobId | the job behind this run; read it again with GET /jobs/{id} |
stats | run counters: pushed, counts per event, failures |
error | why the run failed, or null |
ms | how long the run took, in milliseconds |
{ "source": "amazon", "type": "product", "event": "product-detail", "id": "B0GG9BY46M", "url": "https://www.amazon.com/dp/B0GG9BY46M", "collectedAt": "2026-09-20T20:57:01.663Z", "asin": "B0GG9BY46M", "country": "US", "title": "INFINMIND L511 Wireless Bluetooth Mouse, Multi-Device Programmable Mouse.", "brand": "INFINMIND", "rating": 4.7, "reviewsCount": 84}Example data: 12 of 43 fields shown. The Amazon page lists every field.
Every record carries the same six envelope fields, source, type, event, id, url and collectedAt, followed by the fields of that source. event is the name the record was billed under. A record we could not complete carries an error field and costs nothing; an item the source says does not exist comes back as a billed record with status: "not_found". Records and jobs explains the envelope.
If the request fails
A failed request returns { "ok": false, "error": "..." } and error says what to change. The three you are most likely to see first:
401invalid api key: the header is missing or the secret is wrong. Send it asx-api-key; a key in the query string is refused.413:maxItemsis above 500. Submit the same body toPOST /jobs/amazoninstead and read the records in pages.429: too many requests this minute. Wait the number of seconds in theRetry-Afterheader.
The full list is in Errors.
Next steps
- Records and jobs: when to wait for the response and when to submit a job.
- Jobs: runs above 500 records, paging and streaming.
- API reference: every route, field and status code.