
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Search Spain's official case-law database CENDOJ (poderjudicial.es) by keyword, ECLI or ROJ with court, jurisdiction, region and date filters. Get ECLI, ROJ, court, date, judge, appeal number, summary and PDF link, plus optional full text. No login needed.
Search CENDOJ, the official case-law database of Spain's judiciary (poderjudicial.es), and export every matching ruling with its ECLI, ROJ number, court, date, reporting judge, appeal number, summary and PDF link. Add the full text of each ruling, or only the key passages, in the same run. No login, no browser: 20 rulings usually arrive in 10–20 seconds.
ECLI:ES:TS:2019:102) or ROJ (STS 102/2019) and get that one ruling.| Field | What it does |
|---|---|
searchTerms | Words, "exact phrases" and operators (AND, OR, NOT, NEAR5, or the site's Y, O, NO, PROX5), or an ECLI / ROJ number alone on a line |
maxResults | Rulings per search term |
pdfUrls | CENDOJ PDF links (the pdfUrl field of earlier results) to turn into text |
jurisdictions, organoTypes, resolutionTypes | Jurisdiction, court or chamber, judgment / order / agreement |
dateFrom, dateTo | Ruling date range (YYYY-MM-DD; a year also works) |
locations, provinces, section, judge, language | Region, province, court section, reporting judge, language of the ruling |
sortOrder | Relevance, ruling date (newest or oldest first), recently added, or court |
includeFullText, paragraphs, paragraphTerms | Full text, or only the N key passages |
{
"searchTerms": ["despido improcedente", "\"gastos hipotecarios\" NOT penal"],
"maxResults": 50,
"jurisdictions": ["SOCIAL"],
"resolutionTypes": ["SENTENCIA"],
"locations": ["MADRID"],
"dateFrom": "2024-01-01",
"sortOrder": "IN_FECHARESOLUCION:decreasing"
}
Leave searchTerms empty and set filters to list the newest rulings that match the filters alone.
One row per ruling.
| Field | Description |
|---|---|
searchTerm | The search term, ECLI or ROJ the row came from |
title | Ruling title as CENDOJ shows it |
roj, ecli, reference | ROJ number, European Case Law Identifier, CENDOJ document reference |
organo, courtCode | Court, read from the ROJ number |
resolutionType | Sentencia, Auto or Auto aclaratorio |
resolutionDate, resolutionDateISO | Ruling date (YYYYMMDD and YYYY-MM-DD) |
resolutionNumber, appealNumber | Ruling number and appeal number |
municipality | Seat of the court |
ponente | Reporting judge |
jurisdiction | The jurisdiction, when exactly one was selected as a filter |
summary | CENDOJ's summary or the matching passage |
pdfUrl, documentUrl | Public PDF link of the ruling (same link in both fields) |
publishedDate, language, position, totalResults, scrapedAt | Publication date on CENDOJ, language, rank in the search, total matches, time of the run |
text, paragraphs, pageCount, organoFull, sede, sectionNumber, procedure, idCendoj | With full text: the ruling's text or key passages, page count, court and chamber, seat, section, procedure and CENDOJ id |
{
"searchTerm": "despido improcedente",
"title": "STSJ Madrid, a 02 de octubre de 2026 - ROJ: STSJ M 11817/2026",
"roj": "STSJ M 11817/2026",
"reference": "11892680",
"ecli": "ECLI:ES:TSJM:2026:11817",
"organo": "Tribunal Superior de Justicia",
"courtCode": "TSJ",
"resolutionType": "Sentencia",
"resolutionDate": "20261002",
"resolutionDateISO": "2026-10-02",
"resolutionNumber": "803/2026",
"municipality": "Madrid",
"ponente": "LAURA MARTÍN GÓMEZ",
"appealNumber": "449/2026",
"summary": "… debe reconocerse a aquélla la indicada indemnización de 20 días de salario por año de servicio con un máximo de doce mensualidades …",
"language": "es",
"jurisdiction": "Social",
"databasematch": "AN",
"pdfUrl": "https://www.poderjudicial.es/search/contenidos.action?action=contentpdf&databasematch=AN&reference=11892680&optimize=20261020&publicinterface=true&tab=AN",
"documentUrl": "https://www.poderjudicial.es/search/contenidos.action?action=contentpdf&databasematch=AN&reference=11892680&optimize=20261020&publicinterface=true&tab=AN",
"publishedDate": "2026-10-20",
"position": 2,
"totalResults": 49810,
"scrapedAt": "2026-10-21T00:24:21.878Z"
}
With full text, the row also carries fields like these:
{
"organoFull": "Tribunal Supremo. Sala de lo Civil",
"sede": "Madrid",
"sectionNumber": "991",
"procedure": "Civil",
"idCendoj": "28079119912019100003",
"pageCount": 14,
"textLength": 61317,
"text": "JURISPRUDENCIA\nRoj: STS 102/2019 - ECLI:ES:TS:2019:102\nId Cendoj: 28079119912019100003\nÓrgano: Tribunal Supremo. Sala de lo Civil …"
}
A run summary with the total matches per search term is saved as OUTPUT in the run's key-value store.
pdfUrls cost $0.90 per 1,000. A PDF that could not be read is listed free of charge.Is it legal? CENDOJ publishes these rulings for public consultation and anonymises the parties' personal data. Its legal notice reserves commercial reuse and building databases from its content to its own reuse procedure, so check that your use fits before you collect at scale. This actor only reads what the public search shows.
Do I need a login or a proxy? No login. Searches go through datacenter proxies by default. PDF downloads for full text go through Spanish residential proxies, because the site asks datacenter visitors for an image check before a download.
How many rulings can I get? As many as the search has. The site itself lists at most 200 rulings per query; above that the actor collects rulings newest first in date windows. If more than 200 rulings share a single day, the site only shows 200 of that day and the run notes it.
Why is a field empty? Not every ruling has every field: older rulings may lack a ruling number, and jurisdiction is only set when you filtered by exactly one jurisdiction (CENDOJ does not show it in the list; with full text, procedure gives it for each ruling).
How do I write a good search? Keep it to one or two exact phrases per line and use separate lines for variants. Very common words alone (el, de) are not searchable. An ECLI or ROJ must be alone on its line.
Can I schedule it or use the API? Yes. Save your input as a task, schedule it daily with "Recently added to CENDOJ" sorting, or start runs from the API and read the dataset as JSON, CSV or Excel.
textTruncated marks longer ones).error and not charged; the actor does not solve image checks.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchTermsarrayOptionalSearch terms, ECLI or ROJ numbers
What to search in CENDOJ's case law. Each line is one search. Words and "exact phrases" work, with the operators AND, OR, NOT and NEARn (or the site's Y, O, NO, PROXn), written in capitals. To fetch one known ruling, enter its ECLI (ECLI:ES:TS:2019:102) or ROJ (STS 102/2019) alone on a line. Leave empty and set filters to list the newest rulings that match the filters.
maxResultsintegerOptionaldefault 20Max rulings per search term
How many rulings to save for each search term. The site serves at most 200 per query; above 200 the actor collects the rest newest first in date windows.
pdfUrlsarrayOptionalRuling PDF links (full text)
CENDOJ PDF links (the pdfUrl field of earlier results) to download and turn into text. Use it for a second pass on the rulings you picked. You can leave the search terms empty when you use this field.
jurisdictionsarrayOptionalJurisdiction
Only rulings from these jurisdictions. Empty = all.
organoTypesarrayOptionalCourt
Only rulings from these courts or chambers. Empty = all courts.
resolutionTypesarrayOptionalType of ruling
Judgments (sentencias), orders (autos) or agreements (acuerdos). 'Auto' includes all its subtypes. Empty = all.
dateFromstringOptionalRuling date from
Only rulings dated on or after this day (YYYY-MM-DD; a year such as 2024 also works).
dateTostringOptionalRuling date to
Only rulings dated on or before this day (YYYY-MM-DD).
locationsarrayOptionalRegion (Comunidad Autónoma)
Only rulings from courts in these regions. Empty = all of Spain.
provincesarrayOptionalProvince
Only rulings from courts in these provinces, written as on the site, e.g. BARCELONA, VALENCIA, A CORUÑA.
sectionstringOptionalCourt section number
Section within the court, e.g. 1 for 'Sección 1ª' of a Provincial Court. Use it together with 'Court'. Empty = all sections.
admissionAutoSectionenumOptionalTarget section (Supreme Court admission orders)
Only for orders admitting a cassation appeal at the Supreme Court's 3rd chamber: the section the case was assigned to.
judgestringOptionalJudge (ponente)
Only rulings written by this judge, e.g. PEDRO JOSE VELA TORRES.
languageenumOptionalLanguage of the ruling
Only rulings written in this language.
sortOrderenumOptionaldefault "Relevance"Sort by
Order of the results. Relevance is the site's default.
includeFullTextbooleanOptionaldefault falseAdd the full text of each ruling
Download each ruling's PDF and add its text, page count, chamber, seat, section and procedure. Slower, and billed as an extra event per ruling with text.
paragraphsintegerOptionaldefault 0Key passages only
When text is extracted, return only this many paragraphs that mention your search words (preferring the legal reasoning) instead of the whole ruling. 0 = whole text.
paragraphTermsstringOptionalWords for key passages
Words used to pick the key passages. Empty = the search term's words. Useful with PDF links, which have no search term.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter exits are the default and work well for searches. PDF downloads for full text always go through Spanish residential exits, because the site asks datacenter visitors for an image check. Residential exits are pinned to Spain unless you choose a country.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| searchTerm | string | null | The search term, ECLI or ROJ this row came from |
| title | string | null | Ruling title as shown by CENDOJ |
| roj | string | null | ROJ number (Repositorio Oficial de Jurisprudencia) |
| reference | string | null | CENDOJ internal document reference |
| ecli | string | null | European Case Law Identifier |
| organo | string | null | Court, from the ROJ number |
| courtCode | string | null | |
| resolutionType | string | null | Sentencia, Auto or Auto aclaratorio |
| jurisdiction | string | null | Jurisdiction when exactly one was selected as a filter |
| resolutionDate | string | null | YYYYMMDD |
| resolutionDateISO | string | null | YYYY-MM-DD |
| resolutionNumber | string | null | |
| municipality | string | null | |
| ponente | string | null | Reporting judge |
| appealNumber | string | null | |
| summary | string | null | |
| language | string | null | |
| databasematch | string | null | |
| pdfUrl | string | null | |
| documentUrl | string | null | |
| publishedDate | string | null | |
| position | number | null | |
| totalResults | number | null | |
| scrapedAt | string | null | |
| text | string | null | |
| paragraphs | array | null | |
| pageCount | number | null | |
| textLength | number | null | |
| organoFull | string | null | |
| sede | string | null | |
| sectionNumber | string | null | |
| procedure | string | null | |
| idCendoj | string | null | |
| textError | string | null | |
| error | string | null | |
| paragraphsMatched | boolean | null | True when the key passages mention the search words |
| textTruncated | boolean | null | True when the text was cut at 2,000,000 characters |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Full text | Full text of one ruling extracted from its PDF (only with full text on). | $0.0009 |
| Ruling | One court ruling saved to the dataset. | $0.0009 |
| Actor start | Charged once when a run starts. | $0.07 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/cendoj-scraper').call({
"searchTerms": [
"gastos hipotecarios"
],
"maxResults": 20,
"pdfUrls": [],
"provinces": [],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/cendoj-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/cendoj-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Civil chamber judgments that mention 'cláusula abusiva', most relevant first.
Labour judgments from Madrid courts, newest first.
Fetch two known Supreme Court rulings by their identifiers.
Supreme Court civil rulings with the 3 passages that mention the search words.
Turn CENDOJ PDF links from an earlier run into text.
Rulings written in Catalan by courts in Barcelona province.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.