Skip to main content
Valendata answers Apify’s REST API (v2) under https://api.valendata.com/apify. Code that uses apify-client, and HTTP calls from n8n or Make, keep working when you change two things:
  • the base URL, to https://api.valendata.com/apify;
  • the token, to a Valendata API key (vd_sk_...).
An actor is a Valendata skill: yours by its slug, or one of the popular Apify actors below, which take Apify’s input and return Apify’s field names. A run is a Valendata run, and its dataset is that run’s rows.

Python

apify-client adds /v2 to api_url itself.

JavaScript

n8n, Make and plain HTTP

Use an HTTP Request step. The most common call runs an actor and answers with its items in one request:
The token works as ?token= or as Authorization: Bearer vd_sk_.... Write the actor as username~name in a URL; a / there would split the path.

Run one of your own skills

Use the skill’s slug as the actor id. The run input is the skill’s inputs, by their names.
GET /apify/v2/acts lists the actors you can run: the ones below, then your skills.

Actors that run on Valendata

Fields an actor returns on Apify that the Valendata skill does not read, such as a place’s website or categoryName, are present and null. Nothing is guessed. Some inputs are not supported yet, and the run is refused with a 400 that says what to send instead:
  • Google Maps: one search term per run (start one run per term), and no Maps URLs or place ids as input.
  • Amazon: search URLs or search words, not product pages.
A website crawl without maxCrawlPages reads at most 100 pages. Any other actor answers 404 until it is on Valendata. Bring it over with POST /v1/import/apify, or create a skill that does the same.

Endpoints

All paths are under https://api.valendata.com/apify. Answers use Apify’s shapes: objects inside {"data": ...}, and errors as {"error": {"type", "message"}}. /v2/actors/... answers the same as /v2/acts/.... Items accept format (json, jsonl, csv, xlsx), offset, limit, desc, fields, omit, clean, skipEmpty, skipHidden, flatten, attachment, bom, delimiter and skipHeaderRow. Paging is in the X-Apify-Pagination-* headers. The run-sync calls wait up to 15 minutes. A run still going then answers 408; it keeps running, and you can read it later by its id. A run that failed answers 400 with the reason. Run statuses are Apify’s: READY, RUNNING, SUCCEEDED, FAILED, ABORTING, ABORTED. A run that returned some rows with a note counts as SUCCEEDED.

Cost

Each run costs what the skill or service behind it costs on Valendata, and usageTotalUsd is that amount in dollars (credits × $0.01). See credits. maxTotalChargeUsd caps a run: Valendata turns it into a row limit from what a row has cost on that skill’s recent runs. A cap below a run’s least price is refused with 402 before anything runs. A run is refused with 402 when your balance cannot pay to start it. memory, timeout and build are accepted and shown on the run, but they do not change how a skill runs.

Webhooks

Ad-hoc webhooks work as on Apify: pass webhooks (base64-encoded JSON) when you start a run. Valendata sends ACTOR.RUN.CREATED, ACTOR.RUN.SUCCEEDED, ACTOR.RUN.FAILED, ACTOR.RUN.ABORTED and ACTOR.RUN.TIMED_OUT, with Apify’s default body (userId, createdAt, eventType, eventData, resource) or your payloadTemplate. Each delivery is signed with X-Valendata-Signature, like every Valendata webhook.

Import an actor

POST /v1/import/apify takes the actor’s apify.com URL or id, and the input you use today:
  • If the actor already runs on Valendata, the answer has kind: "alias" and the equivalent calls, with your input translated. Nothing is created.
  • Otherwise a skill is created from the actor’s public description, with its output fields as the new skill’s columns. The answer has kind: "creation" and a status_url to poll, as with creating a skill, and it costs the same. Pass start_url when the input names no page.