{"openapi":"3.1.0","info":{"title":"Skael API","version":"1.0.0","description":"Skael API is a German API for lead lists, email finding and company data: companies and decision-makers from the commercial register, Google Maps, job boards and imprints, with verified emails and an MCP server for Claude, ChatGPT and Cursor.\n\nProvider: David Lionel Wassilowsky (Skael), Schwanthalerstr. 184, 80339 München","termsOfService":"https://api.skael.de/agb","contact":{"name":"Skael API","email":"api@skael.de","url":"https://api.skael.de/ueber-uns"},"x-provider":{"name":"David Lionel Wassilowsky","trade_name":"Skael","address":"Schwanthalerstr. 184, 80339 München"}},"servers":[{"url":"https://api.skael.de"}],"externalDocs":{"description":"API Guide","url":"https://api.skael.de/docs/api-guide"},"security":[{"bearerAuth":[]}],"tags":[{"name":"Web & Companies"},{"name":"People Data"},{"name":"Discovery"},{"name":"Jobs"},{"name":"Registries"},{"name":"SkaelReach"},{"name":"Enrichments"},{"name":"Batches"},{"name":"Screenshot"},{"name":"Workflows"}],"paths":{"/api/batches/{id}":{"get":{"operationId":"get_api_batches_id","summary":"Fetch a batch","tags":["Batches"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"minimum":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":["integer","null"],"minimum":1,"maximum":500}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/local-scripts"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/batches/{id}/results.csv":{"get":{"operationId":"get_api_batches_id_results_csv","summary":"Download batch results as CSV","tags":["Batches"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/local-scripts"},"responses":{"2XX":{"description":"Successful response.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/custom-domains":{"get":{"operationId":"get_api_custom_domains","summary":"List custom domains","tags":["SkaelReach"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/api-guide"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post_api_custom_domains","summary":"Register a custom domain","tags":["SkaelReach"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/api-guide"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","maxLength":253}},"required":["domain"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/custom-domains/{id}":{"delete":{"operationId":"delete_api_custom_domains_id","summary":"Delete a custom domain","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/api-guide"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/custom-domains/{id}/verify":{"post":{"operationId":"post_api_custom_domains_id_verify","summary":"Verify a custom domain","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/api-guide"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/enrichments/ai_research_agent":{"post":{"operationId":"enrichment_ai_research_agent","summary":"AI Research Agent","description":"Multi-step AI research agent with Google Search and web scraping tools","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/ai-research-agent"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"system_prompt":{"type":"string","maxLength":10000,"description":"High-level instructions framing the research task for the agent.","examples":["You are a market research analyst evaluating SaaS companies."]},"user_prompt":{"type":"string","maxLength":50000,"description":"The concrete research question and any context specific to this run.","examples":["Find the headquarters city, employee count, and funding total for example.com."]},"schema":{"type":["array","object"],"description":"JSON Schema (object) describing the structured output the agent must return.","examples":[{"type":"object","properties":{"city":{"type":"string"},"employees":{"type":"integer"}}}],"properties":{"type":{"type":"string","enum":["object"],"description":"Root schema type. Must be \"object\".","examples":["object"]},"properties":{"type":["array","object"],"minItems":1,"minProperties":1,"description":"Map of top-level property names to their JSON Schema definitions. At least one property required.","items":{"properties":{"type":{"type":"string","enum":["string","boolean","number","integer","array"],"description":"Type for each property. Allowed: string, boolean, number, integer, array.","examples":["string"]}},"required":["type"]},"additionalProperties":{"properties":{"type":{"type":"string","enum":["string","boolean","number","integer","array"],"description":"Type for each property. Allowed: string, boolean, number, integer, array.","examples":["string"]}},"required":["type"]}},"required":{"type":["array","object"],"description":"Optional list of property names that must be present in the output.","examples":[["city"]]}},"required":["type","properties"]},"max_steps":{"type":"integer","minimum":1,"maximum":20,"description":"Upper bound on tool-calling steps. Defaults to 5, max 20.","examples":[5]},"model":{"type":"string","maxLength":100,"description":"OpenRouter model slug to run the agent with. Must support tool use and structured output in the same request, so Google (Gemini) models are rejected.","examples":["anthropic/claude-sonnet-4.6"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["system_prompt","user_prompt","schema"]},"examples":{"company_research":{"summary":"Run a structured research task against a company URL using the default model.","value":{"system_prompt":"You are a market research analyst evaluating SaaS companies.","user_prompt":"Find the headquarters city and approximate employee count for example.com.","schema":{"type":"object","properties":{"city":{"type":"string"},"employees":{"type":"integer"}},"required":["city"]},"max_steps":5}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"*":{"type":"object","description":"The output shape is dynamic — it exactly matches the JSON Schema you pass in `schema`. Each top-level property you declare appears as a key on the output with the type you requested."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per research run","credits":0,"notes":"Dynamic pricing: LLM token cost (model-dependent) + 1 credit per Google search + 1 credit per web scrape + 2 credits per proxy scrape. Minimum 1 credit. Reservation is estimated from the selected model and max_steps. A run that fails after the model has already been called is charged for the tokens it consumed, never more than the reservation."}]}},"/api/enrichments/app_scanner":{"post":{"operationId":"enrichment_app_scanner","summary":"App Scanner","description":"Detect web applications and login pages on domains","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/app-scanner"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Root domain (no protocol) to scan for app and login surfaces.","examples":["example.com"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["domain"]},"examples":{"app_found":{"summary":"A SaaS-like domain whose app/dashboard subdomain is detected.","value":{"domain":"example.com"}},"login_only":{"summary":"A site that exposes a login page but no obvious customer-facing app.","value":{"domain":"sso-only.example"}},"none":{"summary":"A pure marketing site with no detectable app or login surface.","value":{"domain":"brochure.example"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"has":{"type":"string","description":"Scan verdict: `app` (product/dashboard URL found), `login` (auth page found), or `none`.","examples":["app"]},"url":{"type":["string","null"],"description":"Best matching app/login URL when `has` is `app` or `login`; `null` when `none`.","examples":["https://app.example.com"]},"site_error":{"type":["string","null"],"description":"Populated when the root domain itself could not be scraped (before the scan ran).","examples":["Target site returned 503"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per scan","credits":1,"notes":null}]}},"/api/enrichments/arbeitsagentur_jobs":{"post":{"operationId":"enrichment_arbeitsagentur_jobs","summary":"Arbeitsagentur Jobs","description":"Search Germany's Federal Employment Agency job listings with German-specific filters","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/arbeitsagentur-jobs"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"was":{"type":["string","null"],"maxLength":200,"description":"Job title, keywords, or occupation (\"what\").","examples":["Softwareentwickler"]},"wo":{"type":["string","null"],"maxLength":200,"description":"Location filter (\"where\") — city, postal code or region.","examples":["Berlin"]},"berufsfeld":{"type":["string","null"],"maxLength":200,"description":"Occupational field / career area.","examples":["IT"]},"arbeitgeber":{"type":["string","null"],"maxLength":200,"description":"Employer name filter.","examples":["Bundesamt"]},"page":{"type":["integer","null"],"minimum":1,"description":"Page number (1-based).","examples":[1]},"size":{"type":["integer","null"],"minimum":1,"maximum":100,"description":"Results per page (1-100).","examples":[25]},"angebotsart":{"enum":["1","2","4","34",null],"description":"Offer type code (1 = job, 2 = self-employed, 4 = training, 34 = internship).","examples":[1]},"arbeitszeit":{"type":["string","null"],"description":"Working-time codes joined by `;` (`vz`, `tz`, `snw`, `ho`, `mj`).","examples":["vz;tz"]},"befristung":{"enum":["1","2",null],"description":"Contract type (1 = permanent, 2 = fixed-term).","examples":[1]},"veroeffentlichtseit":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Only show postings published within the last N days (0-100).","examples":[7]},"umkreis":{"enum":["10","25","50","100","150","200",null],"description":"Search radius in km (10, 25, 50, 100, 150, 200).","examples":[25]},"zeitarbeit":{"type":["boolean","null"],"description":"Include temporary work / staffing postings.","examples":[false]},"pav":{"type":["boolean","null"],"description":"Include placement-agency postings.","examples":[false]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"software_engineers_berlin":{"summary":"Search for software engineering postings in Berlin, 25 results per page.","value":{"was":"Softwareentwickler","wo":"Berlin","page":1,"size":25}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the Arbeitsagentur search returned a successful response.","examples":[true]},"data":{"type":"object","description":"Container for the search results and pagination metadata.","properties":{"maxErgebnisse":{"type":["string","null"],"description":"Total number of matching postings (as returned by Arbeitsagentur).","examples":["245"]},"page":{"type":["integer","null"],"description":"Current page number (1-based).","examples":[1]},"size":{"type":["integer","null"],"description":"Results per page that were requested.","examples":[25]},"stellenangebote":{"type":"array","description":"List of job postings on the current page.","items":{"type":"object","properties":{"beruf":{"type":["string","null"],"description":"Occupation / job role.","examples":["Wirtschaftsingenieur/in"]},"titel":{"type":["string","null"],"description":"Job posting title.","examples":["Firmware-Entwickler (m/w/d)"]},"refnr":{"type":["string","null"],"description":"Arbeitsagentur reference number for the posting.","examples":["13645-277024-S"]},"arbeitsort":{"type":["object","null"],"description":"Structured location object (city, postal code, coordinates)."},"arbeitgeber":{"type":["string","null"],"description":"Employer name.","examples":["Cs2 ITEC"]},"aktuelleVeroeffentlichungsdatum":{"type":["string","null"],"description":"Date the posting was most recently published (YYYY-MM-DD).","examples":["2026-04-15"]},"eintrittsdatum":{"type":["string","null"],"description":"Earliest start date for the role (YYYY-MM-DD).","examples":["2026-04-15"]},"externeUrl":{"type":["string","null"],"description":"External URL pointing to the full posting.","examples":["https://example-jobboard.de/job/13645-277024-S"]}}}},"facetten":{"type":["array","null"],"description":"Facet counts returned alongside the result set."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Arbeitsagentur jobs search request."}]}},"/api/enrichments/autocomplete_company":{"post":{"operationId":"enrichment_autocomplete_company","summary":"Autocomplete Company","description":"Typeahead search over mirrored German registry company names","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/autocomplete-company"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":3,"maxLength":255,"description":"Company-name prefix or substring matched against the German registry mirror. Must contain at least three searchable characters.","examples":["Mustermann"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"typeahead_company_name":{"summary":"Autocomplete a mirrored German company by legal name.","value":{"query":"Mustermann"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"results":{"type":"array","description":"Up to 20 mirror company suggestions.","items":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical German company ID.","examples":["DE-HRB-F1103-267645"]},"legal_name":{"type":["string","null"],"description":"Registered legal name.","examples":["Mustermann Beratung GmbH"]},"legal_form":{"type":["string","null"],"description":"Normalized legal form.","examples":["gmbh"]},"register":{"type":"object","description":"Register type, court code, court name, and register number."},"status":{"type":["string","null"],"description":"Current mirror status.","examples":["active"]},"state":{"type":["string","null"],"description":"Registered office state.","examples":["Berlin"]},"city":{"type":["string","null"],"description":"Registered office city.","examples":["Berlin"]},"postal_code":{"type":["string","null"],"description":"Registered office postal code.","examples":["10115"]}}}},"_registry_meta":{"type":"object","description":"Registry metadata. `search_scope` is `mirror` in v1."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Companies found","credits":1,"notes":"Charged when at least one mirror company matches the autocomplete query."},{"tier":"not_found","label":"No results","credits":0,"notes":"No charge when the mirror returns zero autocomplete suggestions."}]}},"/api/enrichments/extract_tax_identifiers":{"post":{"operationId":"enrichment_extract_tax_identifiers","summary":"Extract Tax Identifiers","description":"Extract German VAT and tax identifiers from a company website imprint","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/extract-tax-identifiers"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"website_url":{"type":"string","maxLength":2048,"description":"Public company website URL. The URL is validated with the shared SSRF-safe URL validator before any imprint lookup.","examples":["https://www.example.de"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["website_url"]},"examples":{"tax_identifiers_found":{"summary":"Extract German VAT and tax identifiers from a company imprint.","value":{"website_url":"https://www.example.de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"ust_id":{"type":["string","null"],"description":"Normalized German VAT ID matching `DE` plus 9 digits, or `null`.","examples":["DE123456789"]},"steuernummer":{"type":["string","null"],"description":"German tax number extracted from the imprint, or `null`.","examples":["12/345/67890"]},"identifiers":{"type":"object","description":"Object containing `ust_id` and `steuernummer` for easy downstream mapping."},"website":{"type":"string","description":"Normalized validated website URL.","examples":["https://www.example.de"]},"_registry_meta":{"type":"object","description":"Imprint source URL, safe URL metadata, and warnings."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Identifier found","credits":5,"notes":"Charged when at least one VAT ID or German tax number is returned."},{"tier":"none_found","label":"No identifiers","credits":0,"notes":"No charge when no tax identifiers are found or only invalid VAT formats are present."}]}},"/api/enrichments/find_cities":{"post":{"operationId":"enrichment_find_cities","summary":"Find Cities","description":"Get all cities for a country with population and region data","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/find-cities"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"country_code":{"type":"string","minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2 country code (2 characters).","examples":["DE"]},"min_population":{"type":"integer","minimum":0,"description":"Minimum population threshold to filter cities.","examples":[50000]},"max_population":{"type":"integer","minimum":0,"description":"Maximum population threshold (inclusive) to filter cities. Must not be below min_population.","examples":[19999]},"region":{"type":"string","maxLength":255,"description":"Administrative region / state to filter by. Accepts the English name or the native-language spelling of most European languages (e.g. `Bavaria`, `Bayern` or `Bavière` all match). Case-insensitive. Use the region finder below to list all valid names per country and language.","examples":["Bayern"]},"fields":{"type":["string","null"],"maxLength":500,"description":"Comma-separated list of fields to return. Defaults to name,population.","examples":["name,population,latitude,longitude"]},"limit":{"type":["integer","null"],"minimum":1,"description":"Maximum number of cities to return.","examples":[100]},"sort":{"type":["string","null"],"maxLength":50,"description":"Sort field, optionally prefixed with `-` for descending order.","examples":["-population"]},"page":{"type":["integer","null"],"minimum":1,"description":"Page number for paginated results (starts at 1).","examples":[1]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["country_code"]},"examples":{"large_german_cities":{"summary":"List the 5 largest cities in Germany sorted by descending population.","value":{"country_code":"DE","min_population":500000,"fields":"name,population,latitude,longitude","sort":"-population","limit":5}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"cities":{"type":"array","description":"List of matching city objects. Contents vary by the `fields` parameter.","items":{"type":"object","properties":{"name":{"type":"string","description":"City name in its native language.","examples":["Berlin"]},"ascii_name":{"type":["string","null"],"description":"ASCII-normalized city name (only when requested via `fields`).","examples":["Berlin"]},"region":{"type":["string","null"],"description":"Administrative region / state (only when requested via `fields`).","examples":["Berlin"]},"population":{"type":["integer","null"],"description":"Population count from Geonames.","examples":[3677472]},"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees (only when requested via `fields`).","examples":[52.52437]},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees (only when requested via `fields`).","examples":[13.41053]},"feature_code":{"type":["string","null"],"description":"Geonames feature code (only when requested via `fields`).","examples":["PPLC"]},"timezone":{"type":["string","null"],"description":"IANA timezone (only when requested via `fields`).","examples":["Europe/Berlin"]}}}},"total":{"type":"integer","description":"Total number of matching cities (ignores `limit`/`page`).","examples":[2069]},"country_code":{"type":"string","description":"Uppercased ISO 3166-1 alpha-2 country code that was queried.","examples":["DE"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per request","credits":10,"notes":null}]}},"/api/enrichments/find_email_linkedin":{"post":{"operationId":"enrichment_find_email_linkedin","summary":"Find Email","description":"Find email addresses from LinkedIn profile URLs","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/find-email-linkedin"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"linkedin_url":{"type":"string","format":"uri","maxLength":500,"description":"Full LinkedIn profile URL (must match linkedin.com/in/<slug>).","examples":["https://www.linkedin.com/in/jane-doe"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["linkedin_url"]},"examples":{"valid_email_found":{"summary":"A LinkedIn profile that returns a deliverable email and bonus profile data.","value":{"linkedin_url":"https://www.linkedin.com/in/jane-doe"}},"email_not_found":{"summary":"No email could be discovered for the LinkedIn profile (no charge).","value":{"linkedin_url":"https://www.linkedin.com/in/john-doe"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"email":{"type":["string","null"],"description":"Email address discovered for the LinkedIn profile. Null when no candidate was returned.","examples":["jane@example.com"]},"email_status":{"type":"string","description":"Deliverability classification: `valid`, `risky`, `not_found`, or `blacklisted`.","examples":["valid"]},"valid_email":{"type":["string","null"],"description":"Populated with the email when `email_status` is `valid`; otherwise `null`.","examples":["jane@example.com"]},"person_company_name":{"type":["string","null"],"description":"Company name inferred from the LinkedIn profile.","examples":["Example GmbH"]},"person_full_name":{"type":["string","null"],"description":"Full name from the LinkedIn profile.","examples":["Jane Doe"]},"person_job_title":{"type":["string","null"],"description":"Job title from the LinkedIn profile.","examples":["CEO"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"valid","label":"Valid email","credits":15,"notes":"Deliverable email confirmed."},{"tier":"risky","label":"Risky email","credits":5,"notes":"Candidate email returned with low deliverability confidence."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no email is discovered."},{"tier":"blacklisted","label":"Blacklisted","credits":0,"notes":"No charge for blacklisted or catch-all domains."},{"tier":"cached","label":"Cached repeat lookup","credits":0,"notes":"Free when the same LinkedIn URL is repeated within 30 days."}]}},"/api/enrichments/find_email_person":{"post":{"operationId":"enrichment_find_email_person","summary":"Find Email","description":"Find email addresses by name and company","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/find-email-person"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","maxLength":255,"description":"Company domain (no protocol). Required unless `company_name` is provided.","examples":["example.com"]},"company_name":{"type":"string","maxLength":255,"description":"Company display name. Required unless `domain` is provided.","examples":["Example GmbH"]},"full_name":{"type":"string","maxLength":255,"description":"Person's full name (at least first + last). Required unless both `first_name` and `last_name` are provided.","examples":["Jane Doe"]},"first_name":{"type":"string","maxLength":255,"description":"Person's first name. Required with `last_name` when `full_name` is omitted.","examples":["Jane"]},"last_name":{"type":"string","maxLength":255,"description":"Person's last name. Required with `first_name` when `full_name` is omitted.","examples":["Doe"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"valid_with_domain":{"summary":"Find an email using the person's name and the employer's domain.","value":{"domain":"example.com","first_name":"Jane","last_name":"Doe"}},"valid_with_company_name":{"summary":"Find an email using the person's full name and the employer's display name.","value":{"company_name":"Example GmbH","full_name":"Jane Doe"}},"not_found":{"summary":"No email could be discovered (no charge applied).","value":{"domain":"example.com","first_name":"Anna","last_name":"Müller"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"email":{"type":["string","null"],"description":"Email address discovered for the person. Null when no candidate was returned.","examples":["jane@example.com"]},"email_status":{"type":"string","description":"Deliverability classification: `valid`, `risky`, `not_found`, or `blacklisted`.","examples":["valid"]},"valid_email":{"type":["string","null"],"description":"Populated with the email when `email_status` is `valid`; otherwise `null`.","examples":["jane@example.com"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"valid","label":"Valid email","credits":15,"notes":"Deliverable email confirmed."},{"tier":"risky","label":"Risky email","credits":5,"notes":"Candidate email returned with low deliverability confidence."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no email is discovered."},{"tier":"blacklisted","label":"Blacklisted","credits":0,"notes":"No charge for blacklisted or catch-all domains."},{"tier":"cached","label":"Cached repeat lookup","credits":0,"notes":"Free when the same query is repeated within 30 days."}]}},"/api/enrichments/find_phone_linkedin":{"post":{"operationId":"enrichment_find_phone_linkedin","summary":"Find Phone","description":"Find phone numbers from LinkedIn profile URLs","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/find-phone-linkedin"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"linkedin_url":{"type":"string","format":"uri","maxLength":500,"description":"Full LinkedIn profile URL (must match linkedin.com/in/<slug>). HTTPS preferred.","examples":["https://www.linkedin.com/in/jane-doe"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["linkedin_url"]},"examples":{"phone_found":{"summary":"A LinkedIn profile that returns a phone number plus bonus job title and gender data.","value":{"linkedin_url":"https://www.linkedin.com/in/jane-doe"}},"phone_not_found":{"summary":"A LinkedIn profile where no phone number could be discovered (no charge applied).","value":{"linkedin_url":"https://www.linkedin.com/in/john-doe"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"phone":{"type":["string","null"],"description":"Phone number in international format. Null if no phone was found.","examples":["+4930123456789"]},"job_title":{"type":["string","null"],"description":"Current job title discovered alongside the phone. Bonus data, no extra charge.","examples":["CEO"]},"gender":{"type":["string","null"],"description":"Inferred gender (`male`, `female`, or `null`). Bonus data, no extra charge.","examples":["male"]},"email":{"type":["string","null"],"description":"Email address. Only present on cached responses where an email was previously discovered.","examples":["jane@example.com"]},"full_name":{"type":["string","null"],"description":"Full name. Only present on cached responses.","examples":["Jane Doe"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Phone found","credits":450,"notes":"Charged only when a phone number is returned."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no phone number is available."}]}},"/api/enrichments/find_phone_person":{"post":{"operationId":"enrichment_find_phone_person","summary":"Find Phone","description":"Find phone numbers by name and company","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/find-phone-person"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","maxLength":255,"description":"Person's first (given) name.","examples":["Jane"]},"last_name":{"type":"string","maxLength":255,"description":"Person's last (family) name.","examples":["Doe"]},"company_domain":{"type":"string","maxLength":255,"description":"Employer domain (no protocol). Required if `company` is not provided.","examples":["example.com"]},"company":{"type":"string","maxLength":255,"description":"Employer name. Required if `company_domain` is not provided.","examples":["Example GmbH"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["first_name","last_name"]},"examples":{"phone_found_with_domain":{"summary":"Find a phone number using the person's name and the employer's domain.","value":{"first_name":"Jane","last_name":"Doe","company_domain":"example.com"}},"phone_found_with_company":{"summary":"Find a phone number using the person's name and the employer's display name.","value":{"first_name":"John","last_name":"Smith","company":"Example GmbH"}},"phone_not_found":{"summary":"No phone number could be discovered for the given person/company pair.","value":{"first_name":"Anna","last_name":"Müller","company_domain":"example.com"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"phone":{"type":["string","null"],"description":"Phone number in international format. Null if no phone was found.","examples":["+4930123456789"]},"job_title":{"type":["string","null"],"description":"Current job title discovered alongside the phone. Bonus data, no extra charge.","examples":["CEO"]},"gender":{"type":["string","null"],"description":"Inferred gender (`male`, `female`, or `null`). Bonus data, no extra charge.","examples":["female"]},"email":{"type":["string","null"],"description":"Email address. Only present on cached responses where an email was previously discovered.","examples":["jane@example.com"]},"full_name":{"type":["string","null"],"description":"Full name. Only present on cached responses.","examples":["Jane Doe"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Phone found","credits":450,"notes":"Charged only when a phone number is returned."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no phone number is available."}]}},"/api/enrichments/get_company":{"post":{"operationId":"enrichment_get_company","summary":"Get Company","description":"Fetch German Handelsregister company data by company ID or exact register tuple","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`).","examples":["DE-HRB-F1103-267645"]},"register_type":{"type":"string","maxLength":16,"description":"Register type used with court_code and register_number when company_id is not supplied.","examples":["HRB"]},"court_code":{"type":"string","maxLength":16,"description":"OpenRegister court code, for example Berlin (Charlottenburg) = F1103.","examples":["F1103"]},"register_number":{"type":"string","maxLength":64,"description":"Register number at the selected court.","examples":["267645"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"company_by_id":{"summary":"Fetch a company by canonical German company ID.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical German company ID.","examples":["DE-HRB-F1103-267645"]},"legal_name":{"type":["string","null"],"description":"Current registered legal name.","examples":["Mustermann Beratung GmbH"]},"legal_form":{"type":["string","null"],"description":"Normalized legal form.","examples":["gmbh"]},"register":{"type":"object","description":"Register identity fields."},"address":{"type":["object","null"],"description":"Registered office address."},"capital":{"type":["object","null"],"description":"Registered capital amount and currency."},"people":{"type":"array","description":"Current representatives parsed from SI XML."},"status":{"type":"string","description":"Company status (`active`, `inactive`, `liquidation`, or `not_found`)."},"_registry_meta":{"type":"object","description":"Registry source, cache, and scrape metadata."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Company found","credits":10,"notes":"Charged when a company is returned from the mirror cache or Handelsregister."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no matching Handelsregister company exists."}]}},"/api/enrichments/get_company_documents":{"post":{"operationId":"enrichment_get_company_documents","summary":"Get Company Documents","description":"Download public Handelsregister company documents with short-lived signed URLs","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company-documents"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`). Call `get_company` first if the company is not in the mirror.","examples":["DE-HRB-F1103-267645"]},"document_category":{"type":"string","enum":["current_printout","chronological_printout","historical_printout","structured_information","shareholder_list","articles_of_association"],"description":"Document category to download: `current_printout`, `chronological_printout`, `historical_printout`, `structured_information`, `shareholder_list`, or `articles_of_association`.","examples":["current_printout"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id","document_category"]},"examples":{"current_printout":{"summary":"Return a signed URL for the current Handelsregister printout PDF.","value":{"company_id":"DE-HRB-F1103-267645","document_category":"current_printout"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company ID echoed from the request."},"document_category":{"type":"string","description":"Requested document category."},"document_id":{"type":["string","null"],"description":"Public document-cache row UUID when a document is available."},"format":{"type":"string","description":"`xml` for structured information, otherwise `pdf`."},"url":{"type":["string","null"],"description":"Fresh signed URL valid for 15 minutes. Not stored in the public cache table."},"expires_at":{"type":["string","null"],"description":"ISO 8601 expiration time for the signed URL."},"content_hash":{"type":["string","null"],"description":"SHA-256 hash of the cached document bytes."},"_registry_meta":{"type":"object","description":"Source, cache-hit flag, and availability status."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"url_returned","label":"Document URL returned","credits":10,"notes":"Charged when a fresh signed URL is returned from cache or a live Handelsregister download."},{"tier":"unavailable","label":"Unavailable","credits":0,"notes":"No charge when the company or requested document category is not available."}]}},"/api/enrichments/get_company_financials":{"post":{"operationId":"enrichment_get_company_financials","summary":"Get Company Financials","description":"Return multi-year Bundesanzeiger financials for a mirrored German company","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/bundesanzeiger/get-company-financials"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company id of the form `DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`.","examples":["DE-HRB-F1103-267645"]},"fiscal_years":{"type":["array","object"],"minItems":1,"minProperties":1,"maxItems":10,"maxProperties":10,"description":"Optional list of fiscal years to return. Defaults to the most recent five available financial publications.","examples":[[2024,2023,2022]],"items":{"type":"integer","minimum":1900,"maximum":2100,"description":"A fiscal year between 1900 and 2100. Duplicate years are de-duplicated before pricing and fetching.","examples":[2024]},"additionalProperties":{"type":"integer","minimum":1900,"maximum":2100,"description":"A fiscal year between 1900 and 2100. Duplicate years are de-duplicated before pricing and fetching.","examples":[2024]}},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"five_year_financials":{"summary":"Return the most recent five financial reports for a mirrored German company.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company id (input echoed back)."},"reports":{"type":"array","description":"Per-year financial reports, most recent fiscal year first.","items":{"type":"object","properties":{"fiscal_year":{"type":"integer","description":"Fiscal year covered by the report."},"publication_id":{"type":"string","description":"Signed publication id."},"extraction_method":{"type":"string","description":"`parser` or `ai`."},"ai_model":{"type":["string","null"],"description":"OpenRouter model when `extraction_method=ai`."},"financials":{"type":"object","description":"Parsed financial figures in integer cents plus `real_estate`."}}}},"merged":{"type":["object","null"],"description":"Most recent non-null financial fields merged across returned reports."},"_registry_meta":{"type":"object","description":"Cache ratio, scrape duration, CAPTCHA counts, AI count, requested and returned years."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default reservation","credits":60,"notes":"Reserved when fiscal_years is omitted: the default five-year window at 20 credits for the first year plus 10 credits per additional year."},{"tier":"1_year","label":"1 fiscal year","credits":20,"notes":"20 credits for the first requested or default fiscal year."},{"tier":"additional_year","label":"Additional fiscal year","credits":10,"notes":"Add 10 credits for each additional requested or default fiscal year, up to 10 years."},{"tier":"not_found","label":"No financials","credits":0,"notes":"No charge when no financial reports are available for the selected years."}]}},"/api/enrichments/get_company_historical_owners":{"post":{"operationId":"enrichment_get_company_historical_owners","summary":"Get Company Historical Owners","description":"Build an async owner-change timeline from historical Handelsregister shareholder lists","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company-historical-owners"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`). Call `get_company` first if the company is not in the mirror.","examples":["DE-HRB-F1103-267645"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"historical_owners":{"summary":"Return a diffed owner timeline from historical Handelsregister shareholder lists.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company ID echoed from the request."},"owners":{"type":"array","description":"Owners from the latest parsed historical snapshot."},"snapshots":{"type":"array","description":"Parsed shareholder-list snapshots in chronological order.","items":{"type":"object","properties":{"source_document_id":{"type":"string","description":"Source document UUID from the Handelsregister document cache."},"document_date":{"type":["string","null"],"description":"Parsed shareholder-list document date."},"owner_count":{"type":"integer","description":"Number of owners parsed from this snapshot."}}}},"history":{"type":"array","description":"Owner additions, removals, and changed share positions diffed between successive snapshots.","items":{"type":"object","properties":{"change_type":{"type":"string","description":"`added`, `removed`, or `changed`."},"effective_date":{"type":["string","null"],"description":"Document date of the later snapshot where the change appears."},"previous":{"type":["object","null"],"description":"Owner state in the previous snapshot, or null for additions."},"current":{"type":["object","null"],"description":"Owner state in the current snapshot, or null for removals."}}}},"_registry_meta":{"type":"object","description":"Enumeration status, cache ratio, parser, source document IDs, and warnings."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"history_completed","label":"Historical owners completed","credits":25,"notes":"Charged when at least two historical shareholder-list filings are parsed into a diffable ownership timeline."},{"tier":"historical_owners_unavailable","label":"Unavailable, unsupported, or not found","credits":0,"notes":"No charge when the company is unknown, historical filings cannot be enumerated, or legacy scans block parsing."}]}},"/api/enrichments/get_company_holdings":{"post":{"operationId":"enrichment_get_company_holdings","summary":"Get Company Holdings","description":"Find German companies whose latest owners snapshot lists the requested company as a legal owner","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company-holdings"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`).","examples":["DE-HRB-F1103-267645"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"holdings_found":{"summary":"Find companies owned by the requested company.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company ID echoed from the request."},"holdings":{"type":"array","description":"Companies whose latest owners snapshot lists the requested company as a legal-person owner.","items":{"type":"object","properties":{"company_id":{"type":"string","description":"Holding company ID."},"name":{"type":["string","null"],"description":"Holding company legal name from the mirror."},"ownership_share":{"type":"number","description":"Direct ownership share from the holding company snapshot as a fraction from 0.0 to 1.0."},"owner":{"type":"object","description":"Original legal-person owner record that links to the requested company."},"document_date":{"type":["string","null"],"description":"Date of the source owners snapshot."},"source_snapshot_id":{"type":"integer","description":"Platform mirror owners snapshot ID."}}}},"_registry_meta":{"type":"object","description":"Status, count, traversal metadata, and parser warnings from matching snapshots.","properties":{"traversal_depth":{"type":"integer","description":"Inverse ownership traversal depth. Holdings v1 inspects direct owners only, so this is 1 when the company exists and 0 when it does not."},"total_nodes_visited":{"type":"integer","description":"Number of distinct latest source company snapshots inspected after excluding the requested company."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"holdings_found","label":"Holdings found","credits":10,"notes":"Charged when at least one latest owners snapshot lists the requested company as a legal-person owner."},{"tier":"not_found","label":"No holdings","credits":0,"notes":"No charge when the company is unknown or no latest owner snapshot references it."}]}},"/api/enrichments/get_company_owners":{"post":{"operationId":"enrichment_get_company_owners","summary":"Get Company Owners","description":"Parse current GmbH owners from the latest Handelsregister shareholder list","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company-owners"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`). Call `get_company` first if the company is not in the mirror.","examples":["DE-HRB-F1103-267645"]},"realtime":{"type":"boolean","description":"When true, bypasses the document cache and downloads the latest shareholder list from Handelsregister.","examples":[true]},"best_available":{"type":"boolean","description":"Reserved for future AG/SE beneficial-owner inference. In v1 this returns a documented empty response with a warning.","examples":[false]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"current_gmbh_owners":{"summary":"Return current GmbH owners from the latest Handelsregister shareholder list.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company ID echoed from the request."},"owners":{"type":"array","description":"Current owners parsed from the latest Gesellschafterliste.","items":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Stable owner identifier. Linked companies use company_id; natural persons use a deterministic UUID."},"type":{"type":"string","description":"`natural_person` or `legal_person`."},"name":{"type":"string","description":"Owner display name."},"relation_type":{"type":"string","description":"Current relation type, currently `shareholder`."},"natural_person":{"type":["object","null"],"description":"Natural-person owner details when type is natural_person.","properties":{"full_name":{"type":["string","null"],"description":"Natural person full name."},"first_name":{"type":["string","null"],"description":"Natural person first name when parseable."},"last_name":{"type":["string","null"],"description":"Natural person last name when parseable."},"date_of_birth":{"type":["string","null"],"description":"Natural person birth date when present in the shareholder list."},"city":{"type":["string","null"],"description":"Natural person city."},"country":{"type":"string","description":"Natural person country code."}}},"legal_person":{"type":["object","null"],"description":"Legal-person owner details when type is legal_person.","properties":{"name":{"type":["string","null"],"description":"Legal person name."},"city":{"type":["string","null"],"description":"Legal person city."},"country":{"type":["string","null"],"description":"Legal person country code."}}},"nominal_share":{"type":"number","description":"Nominal share amount in EUR."},"percentage_share":{"type":"number","description":"Ownership percentage as a fraction between 0.0 and 1.0."},"start":{"type":["string","null"],"description":"ISO date parsed from change notes when available."},"end":{"type":["string","null"],"description":"Optional ISO end date parsed from change notes when available."}}}},"sources":{"type":"array","description":"Source documents used for the owners data. Signed URLs are generated fresh at response time and are not persisted.","items":{"type":"object","properties":{"document_url":{"type":["string","null"],"description":"Fresh signed source document URL, or null when unavailable or not being presented."}}}},"best_available":{"type":"boolean","description":"True when the response uses best-available AG/SE fallback ownership data. V1 only returns a documented unsupported empty result."},"_registry_meta":{"type":"object","description":"Cache status, parser name, warnings, and percentage sum."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"owners_found","label":"Current owners found","credits":10,"notes":"Charged when the latest cached or freshly downloaded shareholder list is parsed successfully."},{"tier":"owners_found_realtime","label":"Realtime current owners","credits":20,"notes":"10 base credits plus 10 realtime credits when cache is bypassed."},{"tier":"unavailable","label":"Unavailable or unsupported","credits":0,"notes":"No charge for unknown companies, missing documents, unsupported legacy scans, or v1 best_available AG/SE inference."}]}},"/api/enrichments/get_company_ubo":{"post":{"operationId":"enrichment_get_company_ubo","summary":"Get Company UBO","description":"Compute natural-person beneficial owners from cached German company ownership snapshots","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/get-company-ubo"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company ID (`DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`).","examples":["DE-HRB-F1103-267645"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"computed_ubo":{"summary":"Compute natural-person beneficial owners from cached owners snapshots.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical company ID echoed from the request."},"computed_ubo":{"type":"boolean","description":"Always true: this is a computed graph result, not a legal Transparenzregister extract."},"ubos":{"type":"array","description":"Natural persons with effective ownership or control of at least 25%.","items":{"type":"object","properties":{"id":{"type":"string","description":"Natural-person owner ID from the owners snapshot, or a deterministic fallback."},"name":{"type":"string","description":"Natural person display name."},"effective_ownership":{"type":"number","description":"Compounded ownership fraction across all paths."},"effective_control":{"type":"number","description":"Compounded control fraction across all paths. Defaults to ownership when no separate control share is present."},"paths":{"type":"array","description":"Ownership paths used to compute the effective share."}}}},"_registry_meta":{"type":"object","description":"Status, traversal metadata, graph limits, cycle details, and warnings.","properties":{"traversal_depth":{"type":"integer","description":"Deepest ownership path inspected while resolving computed UBOs."},"total_nodes_visited":{"type":"integer","description":"Number of unique company nodes visited while resolving computed UBOs."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"ubo_found","label":"Computed UBO found","credits":25,"notes":"Charged when at least one natural person reaches 25% effective ownership or control."},{"tier":"not_found","label":"No computed UBO","credits":0,"notes":"No charge when the company is unknown or no natural person reaches the UBO threshold."}]}},"/api/enrichments/get_publication":{"post":{"operationId":"enrichment_get_publication","summary":"Get Publication","description":"Fetch and parse a Bundesanzeiger publication by signed publication ID","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/bundesanzeiger/get-publication"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"publication_id":{"type":"string","maxLength":4096,"description":"Opaque HMAC-signed identifier issued by `list_company_publications`. Tampered tokens are rejected with a 422.","examples":["regpub_v1_eyJzb3VyY2UiOiJidW5kZXNhbnplaWdlciJ9_…"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["publication_id"]},"examples":{"parsed_full_sheet":{"summary":"A regular §266 Abs. 2 Jahresabschluss with explicit Grundstücke und Bauten line.","value":{"publication_id":"regpub_v1_eyJzb3VyY2UiOiJidW5kZXNhbnplaWdlciJ9_…"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"publication_id":{"type":"string","description":"Opaque publication id (input echoed back)."},"source":{"type":"string","description":"Provider that produced the publication (currently always `bundesanzeiger`)."},"company_id":{"type":["string","null"],"description":"Canonical company id this publication is attached to in the mirror."},"type":{"type":"string","description":"Filing type (`jahresabschluss`, `konzernabschluss`, …)."},"published_at":{"type":["string","null"],"description":"ISO 8601 publication date."},"fiscal_period":{"type":"object","description":"Fiscal-period bounds: `{from, to}` (each ISO 8601 or null)."},"title":{"type":"string","description":"Original Bundesanzeiger filing title."},"financials":{"type":"object","description":"Parsed financial figures in integer cents, plus a nested `real_estate` block.","properties":{"umsatzerloese":{"type":["integer","null"],"description":"Revenue in cents."},"bilanzsumme":{"type":["integer","null"],"description":"Balance sheet total in cents."},"sachanlagen":{"type":["integer","null"],"description":"Tangible fixed assets in cents."},"eigenkapital":{"type":["integer","null"],"description":"Equity in cents."},"liquide_mittel":{"type":["integer","null"],"description":"Cash and cash equivalents in cents."},"mitarbeiter":{"type":["integer","null"],"description":"Employee headcount."},"real_estate":{"type":"object","description":"Real-estate sub-block: `{has_real_estate, grundstuecke_und_bauten}`. Both fields are `null` on compressed sheets where the answer is not provable.","properties":{"has_real_estate":{"type":["boolean","null"],"description":"`true` when an explicit Grundstücke und Bauten line was found; `false` when a §266 Abs. 2 Sachanlagen breakdown proves its absence; `null` when unknown (compressed sheet)."},"grundstuecke_und_bauten":{"type":["integer","null"],"description":"Grundstücke und Bauten value in cents (matches `has_real_estate`)."}}}}},"_registry_meta":{"type":"object","description":"Metadata: source, cache_hit, freshness_days, scrape_duration_ms, extraction_method, ai_model, captcha_solver, proxy_used.","properties":{"extraction_method":{"type":"string","description":"`parser` for deterministic parser output or `ai` for OpenRouter fallback output."},"ai_model":{"type":["string","null"],"description":"OpenRouter model used when `extraction_method=ai`; omitted for parser output."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Maximum reservation","credits":50,"notes":"Reserved up front when no flat override exists; unused credits are refunded when deterministic parsing or unavailable results cost less."},{"tier":"parsed","label":"Parser-extracted financials","credits":10,"notes":"Charged when the deterministic parser extracted figures from a §266 Abs. 2 / Abs. 3 sheet (live or cache)."},{"tier":"ai_extracted","label":"AI-extracted financials","credits":50,"notes":"Charged when a compressed or unstructured filing required the OpenRouter fallback."},{"tier":"unavailable","label":"Unavailable","credits":0,"notes":"No charge when the publication id cannot be resolved, fetched, or parsed."}]}},"/api/enrichments/google_ai_mode":{"post":{"operationId":"enrichment_google_ai_mode","summary":"Google AI Mode","description":"Ask Google AI Mode a question and get its answer with cited sources and follow-ups, via Scrappa","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/google-ai-mode"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":2000,"description":"The question for Google AI Mode. Full questions work better than keywords.","examples":["wer ist Geschäftsführer der Stadtwerke Bielefeld"]},"hl":{"type":["string","null"],"maxLength":5,"description":"Answer language code. Set it to the language of the query.","examples":["de"]},"gl":{"type":["string","null"],"maxLength":5,"description":"Two-letter country code Google answers for.","examples":["de"]},"google_domain":{"type":["string","null"],"maxLength":50,"description":"Google domain to ask (defaults to google.com).","examples":["google.de"]},"follow_up_token":{"type":["string","null"],"maxLength":10000,"description":"The `follow_up_token` of a previous answer. Send it with a new `query` to ask a follow-up question in the same conversation.","examples":[null]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"managing_director":{"summary":"Ask Google AI Mode who runs a company.","value":{"query":"wer ist Geschäftsführer der Stadtwerke Bielefeld","hl":"de","gl":"de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when Google returned an AI answer with text. `false` runs are not charged.","examples":[true]},"query":{"type":"string","description":"The query as sent.","examples":["wer ist Geschäftsführer der Stadtwerke Bielefeld"]},"text":{"type":["string","null"],"description":"The whole answer as plain text, one line per block. `null` when `found` is `false`.","examples":["Die Geschäftsführer der Stadtwerke Bielefeld sind Rainer Müller und Martin Uekmann."]},"text_blocks":{"type":"array","description":"The answer in Google's order. `type` is `paragraph` or `heading`.","items":{"type":"object","properties":{"snippet":{"type":"string","description":"Text of the block.","examples":["Die Geschäftsführer der Stadtwerke Bielefeld sind Rainer Müller und Martin Uekmann."]},"list":{"type":"array","description":"Bullet items of the block. Often empty even when the block announces a list: then check `references.*.snippet`."},"reference_indexes":{"type":"array","description":"Indexes into `references` that back this block.","examples":[[0,1]]}}}},"references":{"type":"array","description":"Sources Google cites. Some `link`s carry only the host (e.g. `https://www.jb.de`); the page path is then in a sibling reference.","items":{"type":"object","properties":{"index":{"type":["integer","null"],"description":"Index used by `text_blocks.*.reference_indexes`.","examples":[0]},"title":{"type":["string","null"],"description":"Title of the source.","examples":["Firmenkurzporträt - Junge Die Bäckerei."]},"link":{"type":"string","description":"URL of the source.","examples":["https://www.jb.de"]},"source":{"type":["string","null"],"description":"Site name or host.","examples":["Junge Die Bäckerei."]},"snippet":{"type":["string","null"],"description":"Quoted text from the source.","examples":["Geschäftsführer Sebastian Klier. Junge Die Bäckerei. Konditorei Junge GmbH. Hafenstraße 25 23568 Lübeck."]}}}},"follow_up_token":{"type":["string","null"],"description":"Send it back as input `follow_up_token` with a new `query` to continue the conversation."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"AI Mode answer returned","credits":3,"notes":"Charged only when Google AI Mode answers with text."},{"tier":"not_found","label":"No answer","credits":0,"notes":"No charge when AI Mode returns no answer text."}]}},"/api/enrichments/google_ai_overview":{"post":{"operationId":"enrichment_google_ai_overview","summary":"Google AI Overview","description":"Get Google's AI Overview answer for a question, with cited sources, via Scrappa","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/google-ai-overview"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"The question or search query, as you would type it into Google.","examples":["wer ist Geschäftsführer der Stadtwerke Bielefeld"]},"hl":{"type":["string","null"],"maxLength":5,"description":"Answer language code. Set it to the language of the query.","examples":["de"]},"gl":{"type":["string","null"],"maxLength":5,"description":"Two-letter country code Google answers for.","examples":["de"]},"google_domain":{"type":["string","null"],"maxLength":50,"description":"Google domain to ask (defaults to google.com).","examples":["google.de"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"managing_director":{"summary":"Ask Google who runs a company.","value":{"query":"wer ist Geschäftsführer der Stadtwerke Bielefeld","hl":"de","gl":"de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when Google returned an AI answer with text. `false` runs are not charged.","examples":[true]},"query":{"type":"string","description":"The query as sent.","examples":["wer ist Geschäftsführer der Stadtwerke Bielefeld"]},"text":{"type":["string","null"],"description":"The whole answer as plain text, one line per block. `null` when `found` is `false`.","examples":["Die Geschäftsführer der Stadtwerke Bielefeld sind Rainer Müller und Martin Uekmann."]},"text_blocks":{"type":"array","description":"The answer in Google's order. `type` is `paragraph` or `heading`.","items":{"type":"object","properties":{"snippet":{"type":"string","description":"Text of the block.","examples":["Die Geschäftsführer der Stadtwerke Bielefeld sind Rainer Müller und Martin Uekmann."]},"list":{"type":"array","description":"Bullet items of the block. Often empty even when the block announces a list: then check `references.*.snippet`."},"reference_indexes":{"type":"array","description":"Indexes into `references` that back this block.","examples":[[0,1]]}}}},"references":{"type":"array","description":"Sources Google cites. Some `link`s carry only the host (e.g. `https://www.jb.de`); the page path is then in a sibling reference.","items":{"type":"object","properties":{"index":{"type":["integer","null"],"description":"Index used by `text_blocks.*.reference_indexes`.","examples":[0]},"title":{"type":["string","null"],"description":"Title of the source.","examples":["Firmenkurzporträt - Junge Die Bäckerei."]},"link":{"type":"string","description":"URL of the source.","examples":["https://www.jb.de"]},"source":{"type":["string","null"],"description":"Site name or host.","examples":["Junge Die Bäckerei."]},"snippet":{"type":["string","null"],"description":"Quoted text from the source.","examples":["Geschäftsführer Sebastian Klier. Junge Die Bäckerei. Konditorei Junge GmbH. Hafenstraße 25 23568 Lübeck."]}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"AI Overview returned","credits":2,"notes":"Charged only when Google shows an AI Overview with text for the query."},{"tier":"not_found","label":"No AI Overview","credits":0,"notes":"No charge when Google shows no AI Overview for the query."}]}},"/api/enrichments/google_jobs":{"post":{"operationId":"enrichment_google_jobs","summary":"Google Jobs (experimental)","description":"Unreliable - best-effort only. Prefer platform-specific endpoints (LinkedIn, Indeed, Stepstone, Kununu, Arbeitsagentur) when available.","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/google-jobs"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":["string","null"],"maxLength":500,"description":"Free-text job query. Required unless `next_page_token` is provided.","examples":["frontend engineer Berlin"]},"next_page_token":{"type":["string","null"],"description":"Pagination token from a previous response. Required unless `q` is provided.","examples":["eyJ0eXAi..."]},"uule":{"type":["string","null"],"maxLength":500,"description":"Encoded UULE parameter for geographic targeting.","examples":["w+CAIQICIGQmVybGlu"]},"lrad":{"enum":["5","10","25","50","100",null],"description":"Search radius in km (allowed: 5, 10, 25, 50, 100).","examples":[25]},"uds":{"type":["string","null"],"maxLength":1000,"description":"Google Jobs filter-state string copied from the Google UI.","examples":["ADvngMj..."]},"date_posted":{"type":["string","null"],"enum":["today","3days","week","month","1","3","7","14",null],"description":"Date-posted filter (`today`, `3days`, `week`, `month`, or 1/3/7/14 days).","examples":["week"]},"job_type":{"type":["string","null"],"enum":["full_time","part_time","contract","internship","remote",null],"description":"Employment type filter.","examples":["full_time"]},"hl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Interface language (2 letters).","examples":["en"]},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Country code for geographic biasing (2 letters).","examples":["de"]},"google_domain":{"type":["string","null"],"maxLength":50,"description":"Google domain (defaults to google.com).","examples":["google.de"]},"page":{"type":["string","null"],"description":"Pagination cursor (string) for subsequent pages.","examples":["1"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"frontend_jobs_berlin":{"summary":"Search Google Jobs for frontend engineering postings in Berlin from the last week.","value":{"q":"frontend engineer Berlin","date_posted":"week","job_type":"full_time","hl":"en","gl":"de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"jobs":{"type":"array","description":"List of Google Jobs postings returned for the query.","items":{"type":"object","properties":{"title":{"type":["string","null"],"description":"Job title.","examples":["Senior Software Engineer"]},"company_name":{"type":["string","null"],"description":"Employer name.","examples":["Example GmbH"]},"location":{"type":["string","null"],"description":"Formatted location string.","examples":["Berlin, Germany"]},"description":{"type":["string","null"],"description":"Full job description (HTML or plain text)."},"via":{"type":["string","null"],"description":"Source job board that Google surfaced the posting from.","examples":["LinkedIn"]},"extensions":{"type":["array","null"],"description":"Tag-style extras Google attaches (posted date, schedule, salary, …).","examples":[["3 days ago","Full-time"]]}}}},"next_page_token":{"type":["string","null"],"description":"Cursor for fetching the next page. Pass back as `next_page_token`.","examples":["CAEQAg=="]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Google Jobs search request."}]}},"/api/enrichments/google_search":{"post":{"operationId":"enrichment_google_search","summary":"Google Search","description":"Search Google and get structured results via Scrappa","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/google-search"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"Search query string.","examples":["site:example.com careers"]},"gl":{"type":["string","null"],"maxLength":5,"description":"Two-letter country code that biases results geographically.","examples":["de"]},"hl":{"type":["string","null"],"maxLength":5,"description":"Interface / results language code.","examples":["en"]},"google_domain":{"type":["string","null"],"maxLength":50,"description":"Google domain to run the search against (defaults to google.com).","examples":["google.de"]},"num_results":{"type":"integer","minimum":1,"maximum":10,"description":"Number of organic results to return (1–10).","examples":[10]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"careers_search":{"summary":"Find career pages with a site-restricted query.","value":{"query":"site:example.com careers","gl":"de","hl":"en","num_results":10}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"organic_results":{"type":"array","description":"Ordered list of organic (non-ad) Google results.","items":{"type":"object","properties":{"position":{"type":["integer","null"],"description":"Ranked position of the result (1-based).","examples":[1]},"title":{"type":["string","null"],"description":"Result title as displayed by Google.","examples":["Example Company — Careers"]},"link":{"type":["string","null"],"description":"Destination URL.","examples":["https://www.example.com/careers"]},"displayed_link":{"type":["string","null"],"description":"Display URL shown in the SERP (may be truncated).","examples":["www.example.com › careers"]},"snippet":{"type":["string","null"],"description":"Snippet text Google surfaces for the result.","examples":["Join our team to build…"]}}}},"total_results":{"type":"integer","description":"Google's reported total results for the query. `0` when unavailable.","examples":[125000]},"related_searches":{"type":"array","description":"Related search suggestions surfaced alongside the organic results.","examples":[["example careers berlin"]]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Google search request, up to 10 organic results."}]}},"/api/enrichments/icp_checker":{"post":{"operationId":"enrichment_icp_checker","summary":"ICP Checker","description":"Classify websites against your Ideal Customer Profile using AI","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/icp-checker"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"description":"URL of the company site to analyze against the ICP prompt.","examples":["https://example.com"]},"prompt":{"type":"string","maxLength":10000,"description":"Natural-language description of the ideal customer profile to evaluate.","examples":["B2B SaaS companies selling to mid-market marketing teams in Europe."]},"with_reason":{"type":"boolean","description":"false: only the decision (icp, confidence), reason and evidence stay null. true: the same decision plus reason and evidence quoted from the page, for +1 credit. Without it, your organization's setting applies: organizations that used the ICP checker before 22.10.2026 get the reason, new ones the decision only.","examples":[true]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["url","prompt"]},"examples":{"icp_match":{"summary":"Site matches the provided ICP prompt with high confidence, with reason and evidence.","value":{"url":"https://example.com","prompt":"B2B SaaS companies selling to mid-market marketing teams in Europe.","with_reason":true}},"icp_decision_only":{"summary":"The cheaper stage: only the decision, reason and evidence stay null.","value":{"url":"https://example.com","prompt":"B2B SaaS companies selling to mid-market marketing teams in Europe.","with_reason":false}},"icp_mismatch":{"summary":"Site does not match the ICP prompt.","value":{"url":"https://bakery.example.com","prompt":"B2B SaaS companies selling to mid-market marketing teams in Europe."}},"site_unreachable":{"summary":"Site could not be scraped (network error or blocked).","value":{"url":"https://offline.example.com","prompt":"B2B SaaS companies."}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"icp":{"type":"boolean","description":"Whether the analyzed site matches the provided ICP prompt.","examples":[true]},"confidence":{"type":"number","description":"Confidence score from 0.0 to 1.0 that the classification is correct.","examples":[0.87]},"reason":{"type":["string","null"],"description":"Short explanation of the classification, written for exactly the decision in icp. Null with with_reason=false; on an unreadable site it says why.","examples":["Site describes a B2B SaaS product targeting marketing teams."]},"evidence":{"type":["string","null"],"description":"The passage of the page the classification rests on, quoted by the model; empty when the page holds none, null with with_reason=false.","examples":["Wir sind eine PR-Agentur mit Fokus auf Pressearbeit."]},"evidence_verbatim":{"type":["boolean","null"],"description":"Whether every piece of the quote stands on the page (ignoring case, spacing and punctuation); null with with_reason=false.","examples":[true]},"reason_hint":{"type":["string","null"],"description":"Present only with with_reason=false: how to get reason and evidence.","examples":["set with_reason=true to get reason and evidence (+1 credit)"]},"site_error":{"type":["string","null"],"description":"Populated when the site could not be scraped at all (network error, blocked).","examples":["Target site returned 503"]},"network_mentions":{"type":["array","null"],"description":"Verbatim phrases from the page that state a membership in a firm network or group, present only when the page has one.","examples":[["Ein Unternehmen der ETL-Gruppe"]]},"location_count":{"type":["integer","null"],"description":"How many locations the page names (\"an 10 Standorten\"), present only when it names at least two.","examples":[10]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"complex_but_success","label":"Analyzed via proxy, with reason","credits":4,"notes":"with_reason=true: decision plus reason and evidence. Charged when a proxy or headless browser was required to scrape the site."},{"tier":"success","label":"Analyzed directly, with reason","credits":2,"notes":"with_reason=true: decision plus reason and evidence, direct fetch."},{"tier":"complex_but_success_without_reason","label":"Analyzed via proxy, decision only","credits":3,"notes":"with_reason=false: decision and confidence, reason and evidence stay null. Charged when a proxy or headless browser was required."},{"tier":"success_without_reason","label":"Analyzed directly, decision only","credits":1,"notes":"with_reason=false: decision and confidence, reason and evidence stay null, direct fetch."},{"tier":"blocked","label":"Blocked / no data","credits":0,"notes":"No charge when the site could not be analyzed."}]}},"/api/enrichments/imprint_extractor":{"post":{"operationId":"enrichment_imprint_extractor","summary":"Imprint Extractor","description":"Extract structured company data from German Impressum pages","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/imprint-extractor"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","maxLength":255,"description":"Root domain whose imprint / legal notice page should be extracted.","examples":["example.com"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["domain"]},"examples":{"imprint_extracted":{"summary":"Imprint data successfully extracted from a German company website.","value":{"domain":"example.com"}},"imprint_not_found":{"summary":"No imprint page could be discovered on the domain (no charge).","value":{"domain":"no-imprint.example.com"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"firmenname":{"type":"string","description":"Company name including legal form (GmbH, AG, UG, …). Empty string when not found.","examples":["Example GmbH"]},"adresse":{"type":"string","description":"Postal address (street, postcode, city) as a single string. Empty when not found.","examples":["Musterstraße 1, 12345 Musterstadt"]},"land":{"type":"string","description":"ISO 3166-1 alpha-2 country of the registered seat, and ONLY when the page states it — a spelled-out country name, the VAT id prefix (DE/ATU/CHE) or the register wording (Firmenbuch, Handelsregisteramt des Kantons, Amtsgericht). Never inferred from the language, the TLD, the dialling code or the postcode, because those are the guesses that produce a wrong country. Empty when unproven.","examples":["DE"]},"telefon":{"type":"string","description":"Cleaned phone number. Empty when not found.","examples":["+49 30 123456789"]},"email":{"type":"string","description":"Email address listed on the imprint. Empty when not found.","examples":["kontakt@example.com"]},"rechtlicher_verantwortlicher":{"type":"string","description":"V.i.S.d.P. — person legally responsible for the content. Empty when not found.","examples":["Max Mustermann"]},"geschaeftsfuehrer":{"type":"array","description":"Managing directors / `Geschäftsführer` names. Empty array when not found.","examples":[["Max Mustermann","Erika Musterfrau"]]},"ust_id":{"type":"string","description":"German VAT identification number (`USt-IdNr.`), for example `DE123456789`. Empty when not found.","examples":["DE123456789"]},"steuernummer":{"type":"string","description":"German tax number exactly as listed in the imprint. Empty when not found.","examples":["12/345/67890"]},"handelsregister_number":{"type":"string","description":"Commercial register number such as `HRB 123456` or `HRA 350654`. Empty when not found.","examples":["HRB 123456"]},"handelsregister_court":{"type":"string","description":"Register court listed in the imprint. Empty when not found.","examples":["Amtsgericht Berlin-Charlottenburg"]},"website":{"type":"string","description":"Canonical website URL from the imprint or fetched page origin. Empty when not found.","examples":["https://www.example.com"]},"social":{"type":"object","description":"Social profile URLs discovered on the page. Keys are `linkedin`, `twitter`, `facebook`, `instagram`, `youtube`, and `tiktok`; missing values are `null`.","examples":[{"linkedin":"https://www.linkedin.com/company/example","twitter":null,"facebook":null,"instagram":null,"youtube":null,"tiktok":null}]},"impressum_url":{"type":["string","null"],"description":"URL of the imprint page that was parsed. `null` when no page could be discovered.","examples":["https://www.example.com/impressum"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"complex_but_found","label":"Extracted via proxy","credits":10,"notes":"Charged when a proxy, headless browser, or Google search fallback was required."},{"tier":"found","label":"Extracted directly","credits":5,"notes":"Standard pricing for direct imprint fetches."},{"tier":"none_found","label":"Not found","credits":0,"notes":"No charge when no imprint data could be extracted."}]}},"/api/enrichments/indeed_jobs":{"post":{"operationId":"enrichment_indeed_jobs","summary":"Indeed Jobs","description":"Search Indeed job listings with structured company data","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/indeed-jobs"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"Search query (job title, keywords, company).","examples":["backend engineer"]},"location":{"type":["string","null"],"maxLength":200,"description":"City, region, or postal code to search within.","examples":["Berlin"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Two-letter country code for the Indeed domain.","examples":["de"]},"radius":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Search radius (0-100) interpreted with `radius_unit`.","examples":[25]},"radius_unit":{"type":["string","null"],"enum":["MILES","KILOMETERS",null],"description":"Radius unit (`MILES` or `KILOMETERS`).","examples":["KILOMETERS"]},"job_type":{"type":["string","null"],"enum":["full_time","part_time","contract","internship","remote",null],"description":"Employment type filter.","examples":["full_time"]},"sort":{"type":["string","null"],"enum":["relevance","date",null],"description":"Sort order (`relevance` or `date`).","examples":["date"]},"limit":{"type":["integer","null"],"minimum":1,"maximum":100,"description":"Results per page (1-100).","examples":[25]},"cursor":{"type":["string","null"],"description":"Pagination cursor returned by the previous response.","examples":["eyJ0b2tlbiI6..."]},"hl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Interface language code (2 letters).","examples":["en"]},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Country code for geographic biasing (2 letters).","examples":["de"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"backend_engineers_berlin":{"summary":"Search Indeed for backend engineering postings in Berlin sorted by date.","value":{"query":"backend engineer","location":"Berlin","country":"de","job_type":"full_time","sort":"date","limit":25}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"success":{"type":["boolean","null"],"description":"Whether the upstream request succeeded.","examples":[true]},"data":{"type":"object","properties":{"jobs":{"type":["array","null"],"description":"List of Indeed job postings.","items":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Indeed job id.","examples":["6331ca504f67d3ff"]},"title":{"type":["string","null"],"description":"Job title.","examples":["Software Engineer Java/Kotlin (x/f/m)"]},"company":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Employer name.","examples":["Doctolib"]}}},"location":{"type":"object","properties":{"formatted":{"type":["string","null"],"description":"Formatted location string.","examples":["Berlin"]}}},"salary":{"type":["string","null"],"description":"Salary range or null."},"description_html":{"type":["string","null"],"description":"Job description as HTML."},"date_published":{"type":["string","null"],"description":"Date the posting was published (ISO).","examples":["2026-04-20"]},"apply_url":{"type":["string","null"],"description":"URL candidates apply at."}}}},"pagination":{"type":"object","properties":{"next_cursor":{"type":["string","null"],"description":"Cursor for the next page. Pass back as `cursor`."},"has_more":{"type":["boolean","null"],"description":"Whether additional pages are available.","examples":[true]}}},"metadata":{"type":"object","properties":{"total_results":{"type":["integer","null"],"description":"Upstream total result count.","examples":[245]}}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Indeed jobs search request."}]}},"/api/enrichments/instagram_find_leads":{"post":{"operationId":"enrichment_instagram_find_leads","summary":"Instagram Find Leads","description":"Find Instagram accounts with a public email or phone by hashtags, keywords or example accounts","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-find-leads"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":["array","object","null"],"maxItems":10,"maxProperties":10,"description":"Keywords used as account searches (up to 10). Each keyword is additionally tried as a hashtag when it fits one.","examples":[["hochzeitsfotograf"]],"items":{"type":"string","minLength":2,"maxLength":60,"description":"One keyword, 2 to 60 characters.","examples":["hochzeitsfotograf"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":60,"description":"One keyword, 2 to 60 characters.","examples":["hochzeitsfotograf"]}},"hashtags":{"type":["array","object","null"],"maxItems":10,"maxProperties":10,"description":"Hashtags without # (up to 10). The authors actively posting under them are checked as leads.","examples":[["hochzeitsfotografie"]],"items":{"type":"string","maxLength":100,"description":"One hashtag, with or without #.","examples":["hochzeitsfotografie"]},"additionalProperties":{"type":"string","maxLength":100,"description":"One hashtag, with or without #.","examples":["hochzeitsfotografie"]}},"seed_usernames":{"type":["array","object","null"],"maxItems":20,"maxProperties":20,"description":"Example accounts of the ideal lead (up to 20). Their similar accounts and the accounts they follow are searched; the seeds themselves are never delivered.","examples":[["studio.lichtblick"]],"items":{"type":"string","maxLength":200,"description":"One handle, with or without @, or a profile URL.","examples":["studio.lichtblick"]},"additionalProperties":{"type":"string","maxLength":200,"description":"One handle, with or without @, or a profile URL.","examples":["studio.lichtblick"]}},"min_followers":{"type":["integer","null"],"minimum":0,"description":"Minimum follower count a lead must have, default 0.","examples":[1000]},"max_followers":{"type":["integer","null"],"minimum":1,"description":"Maximum follower count a lead may have; omit for no ceiling.","examples":[50000]},"country":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Two-letter country code. The country of a lead comes from its public phone number, else from the country ending of its website; an account without either does not match.","examples":["DE"]},"language":{"type":["string","null"],"enum":["de","en","fr","it","nl","es","pl","cs","da","sv","pt","tr",null],"description":"Language a lead must speak, detected from bio, display name and category. Bios too short to detect a language do not match. Allowed values: de, en, fr, it, nl, es, pl, cs, da, sv, pt, tr.","examples":["de"]},"contact":{"enum":["email_or_phone","email","phone",null],"description":"`email_or_phone` (default) delivers leads with a public email or phone, `email` only leads with a public email, `phone` only leads with a public phone.","examples":["email_or_phone"]},"max_leads":{"type":["integer","null"],"minimum":1,"maximum":500,"description":"Leads to collect at most, 1 to 500, default 50. The reservation is max_leads × the lead price; only delivered leads are billed.","examples":[20]},"max_credits":{"type":["integer","null"],"minimum":50,"description":"Upper bound for the reservation in credits, minimum 50. The run stops once the budgeted leads are delivered; only delivered leads are billed.","examples":[1000]},"exclude_usernames":{"type":["array","object","null"],"maxItems":1000,"maxProperties":1000,"description":"Handles never delivered as leads (up to 1000); seed accounts are excluded automatically.","examples":[["konkurrent.beispiel"]],"items":{"type":"string","maxLength":200,"description":"One handle, with or without @, or a profile URL.","examples":["konkurrent.beispiel"]},"additionalProperties":{"type":"string","maxLength":200,"description":"One handle, with or without @, or a profile URL.","examples":["konkurrent.beispiel"]}},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"find_leads":{"summary":"German wedding photographers with a public contact, collected from a hashtag.","value":{"hashtags":["hochzeitsfotografie"],"country":"DE","min_followers":1000,"max_followers":50000,"max_leads":20}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"count":{"type":"integer","description":"Leads in this response; what the call is billed for.","examples":[1]},"leads":{"type":"array","description":"The collected leads in the shape of `instagram_profile`.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick Fotografie"]},"biography":{"type":["string","null"],"description":"Bio text of the account."},"external_url":{"type":["string","null"],"description":"Website shown on the profile, else the first bio link.","examples":["https://www.studio-lichtblick.example/?utm_source=ig"]},"external_domain":{"type":["string","null"],"description":"Domain of `external_url`; `null` for link-hub and social hosts.","examples":["studio-lichtblick.example"]},"bio_links":{"type":"array","description":"Unique external links of the profile, at most 10."},"public_email":{"type":["string","null"],"description":"Business contact email the account shows publicly.","examples":["kontakt@studio-lichtblick.example"]},"public_phone":{"type":["string","null"],"description":"Business contact phone in E.164 when the account shows a valid number.","examples":["+493023125012"]},"account_type":{"type":["string","null"],"description":"`personal`, `business` or `creator`.","examples":["business"]},"is_business":{"type":"boolean","description":"`true` when the account is flagged as a business account."},"category":{"type":["string","null"],"description":"Category the account declares.","examples":["Fotograf"]},"city":{"type":["string","null"],"description":"City of the business address.","examples":["Berlin, Germany"]},"zip":{"type":["string","null"],"description":"Postal code of the business address.","examples":["10115"]},"street":{"type":["string","null"],"description":"Street of the business address.","examples":["Invalidenstraße 1"]},"country_code":{"type":["string","null"],"description":"Two-letter country code derived from the public phone or the external domain.","examples":["DE"]},"country_source":{"type":["string","null"],"description":"Where `country_code` came from: `phone` or `domain`.","examples":["phone"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers.","examples":[8421]},"following_count":{"type":["integer","null"],"description":"Number of accounts followed.","examples":[612]},"media_count":{"type":["integer","null"],"description":"Number of posts.","examples":[734]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]},"fetched_at":{"type":"string","description":"When the profile was fetched (ISO 8601)."},"source":{"type":"object","description":"Where the lead was found.","properties":{"type":{"type":"string","description":"`seed_similar`, `seed_following`, `hashtag`, `search` or `lead_similar`.","examples":["hashtag"]},"value":{"type":"string","description":"The hashtag, keyword, seed handle or account id the lead came through.","examples":["hochzeitsfotografie"]}}}}}},"stopped_reason":{"type":"string","description":"Why the run stopped: `target_reached`, `sources_exhausted`, `request_budget`, `time_limit`, `rate_limited` or `upstream_unavailable`.","examples":["sources_exhausted"]},"stats":{"type":"object","description":"Run statistics: `candidates_seen`, `profiles_checked`, `profiles_from_cache`, `pages_fetched` and `filtered_out` per reason.","properties":{"candidates_seen":{"type":"integer","description":"Unique accounts a source listed.","examples":[2]},"profiles_checked":{"type":"integer","description":"Candidates whose profile was read (cache or fetch).","examples":[2]},"profiles_from_cache":{"type":"integer","description":"Profiles served from the shared profile cache.","examples":[0]},"pages_fetched":{"type":"integer","description":"List pages read across all sources.","examples":[2]},"filtered_out":{"type":"object","description":"Rejected candidates per reason: `excluded`, `private`, `followers`, `country`, `language`, `contact`."}}},"_meta":{"type":"object","properties":{"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[4]},"request_budget":{"type":"integer","description":"The upstream request budget of this run (max_leads × 25, between 60 and 5000).","examples":[500]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default reservation","credits":2500,"notes":"Reserved for the default of 50 leads; only leads actually delivered are charged."},{"tier":"lead","label":"Per lead delivered","credits":50,"notes":"Per lead with a public email or phone."},{"tier":"not_found","label":"Nothing found","credits":0,"notes":"No charge for accounts without contact data or when nothing matches."}]}},"/api/enrichments/instagram_followers":{"post":{"operationId":"enrichment_instagram_followers","summary":"Instagram Followers","description":"List the followers of an Instagram account, one page per call","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-followers"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":["string","null"],"maxLength":200,"description":"Instagram handle, with or without a leading @, or a profile URL.","examples":["natgeo"]},"user_id":{"type":["string","null"],"description":"Numeric Instagram account id. Ignored when `username` is given.","examples":["787132"]},"cursor":{"type":["string","null"],"maxLength":4000,"description":"Paging position from `next_cursor` of the previous page. Omit for the first page.","examples":["QVFBb2xUenZrOXh4ZmtQdk1yRjl2a0l2N1E4anY4YjQ"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"followers_page":{"summary":"First page of followers of a public account.","value":{"username":"atelier.nord.beispiel"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"pk":{"type":"string","description":"Numeric account id the page was fetched for.","examples":["50000000001"]},"username":{"type":["string","null"],"description":"Handle of the account; `null` when only `user_id` was given and no profile is cached.","examples":["atelier.nord.beispiel"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/instagram_following":{"post":{"operationId":"enrichment_instagram_following","summary":"Instagram Following","description":"List the accounts an Instagram account follows, one page per call","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-following"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":["string","null"],"maxLength":200,"description":"Instagram handle, with or without a leading @, or a profile URL.","examples":["natgeo"]},"user_id":{"type":["string","null"],"description":"Numeric Instagram account id. Ignored when `username` is given.","examples":["787132"]},"cursor":{"type":["string","null"],"maxLength":4000,"description":"Paging position from `next_cursor` of the previous page. Omit for the first page.","examples":["QVFBb2xUenZrOXh4ZmtQdk1yRjl2a0l2N1E4anY4YjQ"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"following_page":{"summary":"First page of the accounts a public account follows.","value":{"username":"atelier.nord.beispiel"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"pk":{"type":"string","description":"Numeric account id the page was fetched for.","examples":["50000000001"]},"username":{"type":["string","null"],"description":"Handle of the account; `null` when only `user_id` was given and no profile is cached.","examples":["atelier.nord.beispiel"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/instagram_hashtag_authors":{"post":{"operationId":"enrichment_instagram_hashtag_authors","summary":"Instagram Hashtag Authors","description":"List the active authors of a hashtag, top or recent posts, one page per call","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-hashtag-authors"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hashtag":{"type":"string","maxLength":100,"description":"Hashtag without the leading #.","examples":["hochzeitsfotografie"]},"sort":{"type":["string","null"],"enum":["top","recent",null],"description":"`top` (default) reads the authors of the top posts, `recent` the authors of the newest posts.","examples":["top"]},"cursor":{"type":["string","null"],"maxLength":4000,"description":"Paging position from `next_cursor` of the previous page. Omit for the first page.","examples":["c3R1Yi1oYXNodGFnLTI"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["hashtag"]},"examples":{"hashtag_authors":{"summary":"Authors of the top posts of a hashtag.","value":{"hashtag":"hochzeitsfotografie"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"hashtag":{"type":"string","description":"The normalized hashtag.","examples":["hochzeitsfotografie"]},"sort":{"type":"string","description":"`top` or `recent`.","examples":["top"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/instagram_location_authors":{"post":{"operationId":"enrichment_instagram_location_authors","summary":"Instagram Location Authors","description":"List the active authors of a place, top or recent posts, one page per call","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-location-authors"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"location_id":{"type":["string","null"],"description":"Numeric Instagram location id. Ignored when `place` is given.","examples":["213385402"]},"place":{"type":["string","null"],"minLength":2,"maxLength":150,"description":"Place name resolved to the first matching Instagram location.","examples":["Berlin"]},"sort":{"type":["string","null"],"enum":["top","recent",null],"description":"`top` (default) reads the authors of the top posts, `recent` the authors of the newest posts.","examples":["top"]},"cursor":{"type":["string","null"],"maxLength":4000,"description":"Paging position from `next_cursor` of the previous page. Omit for the first page.","examples":["c3R1Yi1vcnQtMg"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"location_authors":{"summary":"Authors of the top posts of a place.","value":{"place":"Berlin"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"location_id":{"type":"string","description":"Numeric location id the page was fetched for.","examples":["213385402"]},"location_name":{"type":["string","null"],"description":"Name of the resolved place; `null` when `location_id` was given directly.","examples":["Berlin, Germany"]},"sort":{"type":"string","description":"`top` or `recent`.","examples":["top"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/instagram_profile":{"post":{"operationId":"enrichment_instagram_profile","summary":"Instagram Profile","description":"Get followers, bio, website, public email and phone of an Instagram account by handle","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-profile"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":["string","null"],"maxLength":200,"description":"Instagram handle, with or without a leading @, or a profile URL.","examples":["natgeo"]},"user_id":{"type":["string","null"],"description":"Numeric Instagram account id. Ignored when `username` is given.","examples":["787132"]},"max_age_days":{"type":["integer","null"],"minimum":0,"maximum":30,"description":"Maximum age in days of a cached profile (0–30, default 30). `0` always fetches fresh and is charged the live price.","examples":[30]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"profile_found":{"summary":"A business account with public contact fields.","value":{"username":"studio.lichtblick"}},"profile_not_found":{"summary":"No account exists for the handle. Completes with `found: false` and is not charged.","value":{"username":"nobody.here"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when a profile exists for the handle or id. `false` runs are not charged.","examples":[true]},"profile":{"type":["object","null"],"description":"The normalized profile. `null` when `found` is `false`.","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick Fotografie"]},"biography":{"type":["string","null"],"description":"Bio text of the account."},"external_url":{"type":["string","null"],"description":"Website shown on the profile, else the first bio link.","examples":["https://www.studio-lichtblick.example/?utm_source=ig"]},"external_domain":{"type":["string","null"],"description":"Domain of `external_url`; `null` for link-hub and social hosts.","examples":["studio-lichtblick.example"]},"bio_links":{"type":"array","description":"Unique external links of the profile, at most 10."},"public_email":{"type":["string","null"],"description":"Business contact email the account shows publicly.","examples":["kontakt@studio-lichtblick.example"]},"public_phone":{"type":["string","null"],"description":"Business contact phone in E.164 when the account shows a valid number.","examples":["+493023125012"]},"account_type":{"type":["string","null"],"description":"`personal`, `business` or `creator`.","examples":["business"]},"is_business":{"type":"boolean","description":"`true` when the account is flagged as a business account."},"category":{"type":["string","null"],"description":"Category the account declares.","examples":["Fotograf"]},"city":{"type":["string","null"],"description":"City of the business address.","examples":["Berlin, Germany"]},"zip":{"type":["string","null"],"description":"Postal code of the business address.","examples":["10115"]},"street":{"type":["string","null"],"description":"Street of the business address.","examples":["Invalidenstraße 1"]},"country_code":{"type":["string","null"],"description":"Two-letter country code derived from the public phone or the external domain.","examples":["DE"]},"country_source":{"type":["string","null"],"description":"Where `country_code` came from: `phone` or `domain`.","examples":["phone"]},"is_private":{"type":"boolean","description":"`true` when the account is private; only basic fields are returned then."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers.","examples":[8421]},"following_count":{"type":["integer","null"],"description":"Number of accounts followed.","examples":[612]},"media_count":{"type":["integer","null"],"description":"Number of posts.","examples":[734]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]},"fetched_at":{"type":"string","description":"When the profile was fetched (ISO 8601)."}}},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the profile came from the cache instead of a fresh lookup."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"live","label":"Live lookup","credits":2,"notes":"Charged when the profile is fetched fresh."},{"tier":"cached","label":"Cached profile","credits":1,"notes":"Charged when the profile is served from the cache, at most 30 days old."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when the account does not exist or cannot be read."}]}},"/api/enrichments/instagram_search_accounts":{"post":{"operationId":"enrichment_instagram_search_accounts","summary":"Instagram Account Search","description":"Search Instagram accounts by keyword, one page per call","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-search-accounts"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":100,"description":"Free-text search over Instagram account names and handles.","examples":["hochzeitsfotograf berlin"]},"cursor":{"type":["string","null"],"maxLength":4000,"description":"Paging position from `next_cursor` of the previous page. Omit for the first page.","examples":["c3R1Yi1zdWNoZS0y"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"search_page":{"summary":"First page of accounts matching a keyword.","value":{"query":"hochzeitsfotograf berlin"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"query":{"type":"string","description":"The trimmed search text.","examples":["hochzeitsfotograf berlin"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/instagram_similar":{"post":{"operationId":"enrichment_instagram_similar","summary":"Instagram Similar Accounts","description":"List accounts similar to an Instagram account","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/instagram-similar"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":["string","null"],"maxLength":200,"description":"Instagram handle, with or without a leading @, or a profile URL.","examples":["natgeo"]},"user_id":{"type":["string","null"],"description":"Numeric Instagram account id. Ignored when `username` is given.","examples":["787132"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"similar_accounts":{"summary":"Accounts similar to a good lead.","value":{"username":"atelier.nord.beispiel"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the subject exists and a page was fetched. `false` runs are not charged.","examples":[true]},"restricted":{"type":"boolean","description":"`true` when the list cannot be read, for example a private account. Empty and not charged.","examples":[false]},"subject":{"type":"object","description":"The resolved subject of the page.","properties":{"pk":{"type":"string","description":"Numeric account id the suggestions were fetched for.","examples":["50000000001"]},"username":{"type":["string","null"],"description":"Handle of the account; `null` when only `user_id` was given and no profile is cached.","examples":["atelier.nord.beispiel"]}}},"count":{"type":"integer","description":"Number of accounts on this page.","examples":[23]},"users":{"type":"array","description":"The accounts of this page as short profiles.","items":{"type":"object","properties":{"pk":{"type":"string","description":"Numeric Instagram account id as a string.","examples":["4815162342"]},"username":{"type":"string","description":"Lowercased Instagram handle.","examples":["studio.lichtblick"]},"full_name":{"type":["string","null"],"description":"Display name of the account.","examples":["Studio Lichtblick"]},"is_private":{"type":"boolean","description":"`true` when the account is private."},"is_verified":{"type":"boolean","description":"`true` when the account carries the verification badge."},"follower_count":{"type":["integer","null"],"description":"Number of followers; `null` when the list does not carry it.","examples":[8421]},"profile_url":{"type":"string","description":"Canonical profile URL.","examples":["https://www.instagram.com/studio.lichtblick/"]}}}},"next_cursor":{"type":["string","null"],"description":"Repeat back as `cursor` for the next page. `null` means the end of the list."},"_meta":{"type":"object","properties":{"cache_hit":{"type":"boolean","description":"`true` when the page came from the page cache instead of a fresh fetch."},"upstream_requests":{"type":"integer","description":"Internal number of data service requests; has no influence on the price.","examples":[1]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"page","label":"Page fetched","credits":2,"notes":"Charged for each page fetched fresh."},{"tier":"cached","label":"Cached page","credits":1,"notes":"Charged when the page is served from the cache, at most 24 hours old."},{"tier":"empty","label":"Empty page","credits":0,"notes":"No charge when the page has no accounts or the subject does not exist."}]}},"/api/enrichments/kununu_jobs":{"post":{"operationId":"enrichment_kununu_jobs","summary":"Kununu Jobs","description":"Search Kununu jobs (DE/AT/CH) with rich filters including workplace, career level, industry, and benefits","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/kununu-jobs"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":["string","null"],"maxLength":500,"description":"Free-text job query.","examples":["Frontend Developer"]},"country":{"type":["string","null"],"enum":["de","at","ch",null],"description":"Kununu country code (`de`, `at`, `ch`).","examples":["de"]},"page":{"type":["integer","null"],"minimum":1,"description":"Page number (1-based).","examples":[1]},"location":{"type":["string","null"],"maxLength":200,"description":"Location filter (city or region). Required if `radius` is set.","examples":["München"]},"radius":{"type":["integer","null"],"enum":[10,20,30,50,100,200,null],"description":"Search radius in km (10, 20, 30, 50, 100, 200). Requires `location`.","examples":[30]},"sort":{"type":["string","null"],"enum":["newest","kununuScore",null],"description":"Sort order (`newest` or `kununuScore`).","examples":["newest"]},"workplace":{"type":["array","object","null"],"description":"List of workplace types (FULL_REMOTE, PARTLY_REMOTE, NON_REMOTE).","examples":[["FULL_REMOTE","PARTLY_REMOTE"]],"items":{"type":"string","enum":["FULL_REMOTE","PARTLY_REMOTE","NON_REMOTE"],"description":"Each workplace entry — one of FULL_REMOTE, PARTLY_REMOTE, NON_REMOTE.","examples":["FULL_REMOTE"]},"additionalProperties":{"type":"string","enum":["FULL_REMOTE","PARTLY_REMOTE","NON_REMOTE"],"description":"Each workplace entry — one of FULL_REMOTE, PARTLY_REMOTE, NON_REMOTE.","examples":["FULL_REMOTE"]}},"employment_types":{"type":["array","object","null"],"description":"List of employment types (FULL_TIME, PART_TIME, INTERN, TEMPORARY, CONTRACTOR, SEASONAL, VOLUNTARY).","examples":[["FULL_TIME","PART_TIME"]],"items":{"type":"string","enum":["FULL_TIME","PART_TIME","INTERN","TEMPORARY","CONTRACTOR","SEASONAL","VOLUNTARY"],"description":"Each employment type entry.","examples":["FULL_TIME"]},"additionalProperties":{"type":"string","enum":["FULL_TIME","PART_TIME","INTERN","TEMPORARY","CONTRACTOR","SEASONAL","VOLUNTARY"],"description":"Each employment type entry.","examples":["FULL_TIME"]}},"career_level":{"type":["array","object","null"],"description":"List of career level codes (1-6, 99 for unspecified).","examples":[[2,3]],"items":{"type":"integer","enum":[1,2,3,4,5,6,99],"description":"Individual career level code (1-6, 99).","examples":[2]},"additionalProperties":{"type":"integer","enum":[1,2,3,4,5,6,99],"description":"Individual career level code (1-6, 99).","examples":[2]}},"kununu_score":{"type":["array","object","null"],"description":"List of rating bucket filters (`4-5`, `3-4`, `2-3`, `1-2`).","examples":[["4-5"]],"items":{"type":"string","enum":["4-5","3-4","2-3","1-2"],"description":"Individual rating bucket.","examples":["4-5"]},"additionalProperties":{"type":"string","enum":["4-5","3-4","2-3","1-2"],"description":"Individual rating bucket.","examples":["4-5"]}},"industry":{"type":["array","object","null"],"description":"List of Kununu industry codes (1-44).","examples":[[12,18]],"items":{"type":"integer","minimum":1,"maximum":44,"description":"Individual industry code (1-44).","examples":[12]},"additionalProperties":{"type":"integer","minimum":1,"maximum":44,"description":"Individual industry code (1-44).","examples":[12]}},"discipline":{"type":["array","object","null"],"description":"List of Kununu discipline codes (1001-1022).","examples":[[1003]],"items":{"type":"integer","minimum":1001,"maximum":1022,"description":"Individual discipline code (1001-1022).","examples":[1003]},"additionalProperties":{"type":"integer","minimum":1001,"maximum":1022,"description":"Individual discipline code (1001-1022).","examples":[1003]}},"benefits":{"type":["array","object","null"],"description":"List of benefits to filter by (see Kununu benefits enum).","examples":[["flexWorkingHours","healthProgram"]],"items":{"type":"string","enum":["flexWorkingHours","pensionPlan","coaching","mobilePhone","internet","healthProgram","reachability","events","discounts","parking","car","meals","dogs","daycare","cantine","stockOptions","doctor","accessibility","material","clothes","transportation"],"description":"Individual benefit key.","examples":["flexWorkingHours"]},"additionalProperties":{"type":"string","enum":["flexWorkingHours","pensionPlan","coaching","mobilePhone","internet","healthProgram","reachability","events","discounts","parking","car","meals","dogs","daycare","cantine","stockOptions","doctor","accessibility","material","clothes","transportation"],"description":"Individual benefit key.","examples":["flexWorkingHours"]}},"is_top_company":{"type":["boolean","null"],"description":"Only return postings from Kununu Top-Company certified employers.","examples":[true]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"top_rated_sales_jobs":{"summary":"Find Kununu sales jobs at Top-Company certified employers with a rating of 4 or higher.","value":{"query":"Sales","country":"de","sort":"kununuScore","kununu_score":["4-5"],"is_top_company":true,"employment_types":["FULL_TIME"]}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"success":{"type":["boolean","null"],"description":"Whether the upstream request succeeded.","examples":[true]},"data":{"type":["array","null"],"description":"List of Kununu job postings.","items":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Kununu job UUID.","examples":["71dd9a39-aaaa-bbbb-cccc-dddddddddddd"]},"title":{"type":["string","null"],"description":"Job title.","examples":["Technical Sales Consultant"]},"url":{"type":["string","null"],"description":"Canonical URL of the posting on Kununu."},"postedAt":{"type":["string","null"],"description":"ISO date the job was posted.","examples":["2026-04-16"]},"city":{"type":["string","null"],"description":"City.","examples":["Frankfurt (Oder)"]},"region":{"type":["string","null"],"description":"Region / state name.","examples":["Brandenburg"]},"employmentTypes":{"type":["array","null"],"description":"Employment type enum values (e.g. `JOB_EMPLOYMENT_FULLTIME`).","examples":[["JOB_EMPLOYMENT_FULLTIME"]]},"company":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Employer name.","examples":["Deutsche Telekom AG"]},"score":{"type":["number","null"],"description":"Kununu company rating (0-5).","examples":[3.9]},"isTopCompany":{"type":["boolean","null"],"description":"Whether the employer is a Kununu Top-Company.","examples":[true]}}}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Kununu jobs search request."}]}},"/api/enrichments/linkedin_company_employees":{"post":{"operationId":"enrichment_linkedin_company_employees","summary":"LinkedIn Company Employees","description":"List the employees of a company by domain or LinkedIn URL, filtered by level, function and country","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-company-employees"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"company_domain":{"type":["string","null"],"maxLength":253,"description":"Company website domain. Protocols, `www` and paths are stripped automatically; the domain is resolved to the company's LinkedIn page first.","examples":["openai.com"]},"company_linkedin_url":{"type":["string","null"],"maxLength":300,"description":"LinkedIn company page URL (linkedin.com/company/<slug>). Takes precedence over `company_domain` when both are given.","examples":["https://www.linkedin.com/company/openai"]},"job_levels":{"type":["array","object","null"],"description":"Seniority levels to include. Allowed values: C-Team, Director, Manager, Other, Staff, VP.","examples":[["Director","VP"]],"items":{"type":"string","enum":["C-Team","Director","Manager","Other","Staff","VP"],"description":"One seniority level: C-Team, Director, Manager, Other, Staff or VP.","examples":["VP"]},"additionalProperties":{"type":"string","enum":["C-Team","Director","Manager","Other","Staff","VP"],"description":"One seniority level: C-Team, Director, Manager, Other, Staff or VP.","examples":["VP"]}},"job_functions":{"type":["array","object","null"],"description":"Job functions to include. Allowed values: Advertising & Marketing, Art, Culture and Creative Professionals, Construction, Customer/Client Service, Education, Engineering, Finance & Accounting, General Business & Management, Healthcare & Human Services, Human Resources, Information Technology, Legal, Manufacturing & Production, Operations, Other, Public Administration & Safety, Purchasing, Research & Development, Sales & Business Development, Science, Supply Chain & Logistics, Writing/Editing.","examples":[["Engineering"]],"items":{"type":"string","enum":["Advertising & Marketing","Art, Culture and Creative Professionals","Construction","Customer/Client Service","Education","Engineering","Finance & Accounting","General Business & Management","Healthcare & Human Services","Human Resources","Information Technology","Legal","Manufacturing & Production","Operations","Other","Public Administration & Safety","Purchasing","Research & Development","Sales & Business Development","Science","Supply Chain & Logistics","Writing/Editing"],"description":"One job function, e.g. `Engineering`.","examples":["Engineering"]},"additionalProperties":{"type":"string","enum":["Advertising & Marketing","Art, Culture and Creative Professionals","Construction","Customer/Client Service","Education","Engineering","Finance & Accounting","General Business & Management","Healthcare & Human Services","Human Resources","Information Technology","Legal","Manufacturing & Production","Operations","Other","Public Administration & Safety","Purchasing","Research & Development","Sales & Business Development","Science","Supply Chain & Logistics","Writing/Editing"],"description":"One job function, e.g. `Engineering`.","examples":["Engineering"]}},"countries":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Two-letter country codes of the person's location (up to 50).","examples":[["US"]],"items":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["US"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["US"]}},"limit":{"type":["integer","null"],"minimum":1,"maximum":50,"description":"People per page at most, 1 to 50, default 10. The reservation is `limit` credits; only people actually returned are billed.","examples":[10]},"page":{"type":["integer","null"],"minimum":1,"maximum":1000,"description":"Page number, 1-based, up to 1000. Fetch pages until `total_pages` or a page returns fewer than `limit` people; each page is billed separately.","examples":[1]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"employees_by_domain":{"summary":"Directors and VPs at openai.com, first page. The domain resolved to the LinkedIn page `openai`.","value":{"company_domain":"openai.com","job_levels":["Director","VP"],"limit":10}},"company_without_page":{"summary":"The domain resolves to no LinkedIn page. Completes with `found: false` and is not charged.","value":{"company_domain":"no-linkedin-match.example"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when at least one person is in `people`. `false` runs are not charged.","examples":[true]},"company_linkedin_url":{"type":["string","null"],"description":"The LinkedIn company page the employees were read from (the resolved page for a `company_domain` input).","examples":["https://www.linkedin.com/company/openai"]},"page":{"type":"integer","description":"The page this response is.","examples":[1]},"total_pages":{"type":["integer","null"],"description":"Pages the company has at the requested `limit`.","examples":[1285]},"count":{"type":"integer","description":"People in this response; what the call is billed for.","examples":[1]},"people":{"type":"array","description":"The employees in the shape of `linkedin_person_profile`.","items":{"type":"object","properties":{"full_name":{"type":["string","null"],"description":"Full name.","examples":["Beulah Lee"]},"headline":{"type":["string","null"],"description":"Profile headline.","examples":["Software Engineer | @Google"]},"linkedin_url":{"type":["string","null"],"description":"Canonical profile URL; feed it to `find_email_linkedin` or `find_phone_linkedin` for contact data.","examples":["https://www.linkedin.com/in/beulah-lee"]},"location":{"type":["object","null"],"description":"Profile location with `city`, `state_code`, `country_code`; `null` when empty."},"current_job":{"type":["object","null"],"description":"The entry of `experiences` with `is_current: true`, or `null`.","properties":{"title":{"type":["string","null"],"description":"Job title of the current role.","examples":["Software Engineer"]},"company_name":{"type":["string","null"],"description":"Employer name of the current role.","examples":["Google"]},"company_domain":{"type":["string","null"],"description":"Website domain of the employer.","examples":["google.com"]}}},"experiences":{"type":"array","description":"Career entries as returned by the search, usually just the current role. For the whole career call `linkedin_person_profile` with `linkedin_url`."}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default reservation","credits":10,"notes":"Reserved for the default limit of 10 people; only people actually returned are charged."},{"tier":"found","label":"Per person returned","credits":1,"notes":"Charged for each person in the response."},{"tier":"not_found","label":"No results","credits":0,"notes":"No charge when nobody matches."}]}},"/api/enrichments/linkedin_company_profile":{"post":{"operationId":"enrichment_linkedin_company_profile","summary":"LinkedIn Company Profile","description":"Get industry, size, founding year and headquarters of a company from its domain or LinkedIn URL","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-company-profile"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":["string","null"],"maxLength":253,"description":"Company website domain. Protocols, `www` and paths are stripped automatically; the company is resolved to its LinkedIn page first.","examples":["google.com"]},"linkedin_url":{"type":["string","null"],"maxLength":300,"description":"LinkedIn company page URL (linkedin.com/company/<slug>). Takes precedence over `domain` when both are given.","examples":["https://www.linkedin.com/company/google"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"company_by_domain":{"summary":"Look up a company by its website domain.","value":{"domain":"google.com"}},"company_by_linkedin_url":{"summary":"Look up a company straight from its LinkedIn page URL.","value":{"linkedin_url":"https://www.linkedin.com/company/google"}},"company_not_found":{"summary":"The domain resolves to no company page. Completes with `found: false` and is not charged.","value":{"domain":"no-linkedin-match.example"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when a company profile was found. `false` runs are not charged.","examples":[true]},"company":{"type":["object","null"],"description":"The normalized company profile. `null` when `found` is `false`.","properties":{"name":{"type":["string","null"],"description":"Company name.","examples":["Google"]},"linkedin_url":{"type":["string","null"],"description":"Canonical LinkedIn company page.","examples":["https://www.linkedin.com/company/google"]},"domain":{"type":["string","null"],"description":"Website domain.","examples":["google.com"]},"website":{"type":["string","null"],"description":"Website URL.","examples":["https://www.google.com"]},"industry":{"type":["string","null"],"description":"Industry classification.","examples":["Software Development"]},"type":{"type":["string","null"],"description":"Company type like Public Company or Privately Held.","examples":["Public Company"]},"size":{"type":["string","null"],"description":"Employee range like `11-50` or `10001+`.","examples":["10001+"]},"employees_on_linkedin":{"type":["integer","null"],"description":"Employees with a profile on LinkedIn.","examples":[328177]},"followers":{"type":["integer","null"],"description":"Followers of the company page.","examples":[40093219]},"founded_year":{"type":["integer","null"],"description":"Founding year.","examples":[1998]},"about":{"type":["string","null"],"description":"Company description."},"specialties":{"type":"array","description":"Specialties as plain strings.","examples":[["search","cloud"]]},"hq":{"type":"object","properties":{"city":{"type":["string","null"],"description":"Headquarters city.","examples":["Mountain View"]},"state":{"type":["string","null"],"description":"Headquarters state or region.","examples":["California"]},"country_code":{"type":["string","null"],"description":"Two-letter headquarters country code.","examples":["US"]},"country_name":{"type":["string","null"],"description":"Headquarters country name.","examples":["United States"]}}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Company found","credits":10,"notes":"Charged when the company profile is found."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no company profile exists for the input."}]}},"/api/enrichments/linkedin_job":{"post":{"operationId":"enrichment_linkedin_job","summary":"LinkedIn Job Detail","description":"Fetch structured job posting details from a LinkedIn job URL","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-job"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Full LinkedIn job URL (must match linkedin.com/jobs/view/<id>).","examples":["https://www.linkedin.com/jobs/view/3821057123"]},"use_cache":{"type":["boolean","null"],"description":"Whether to serve a recent cached version of the job. Defaults to true.","examples":[true]},"maximum_cache_age":{"type":["integer","null"],"minimum":1,"description":"Maximum acceptable cache age in seconds when `use_cache` is enabled.","examples":[86400]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["url"]},"examples":{"fetch_job_detail":{"summary":"Fetch the full detail of a LinkedIn job posting by its canonical URL.","value":{"url":"https://www.linkedin.com/jobs/view/3821057123","use_cache":true}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"data":{"type":"object","description":"Scrappa job detail payload returned verbatim.","properties":{"job_id":{"type":["string","null"],"description":"LinkedIn job id as returned by Scrappa.","examples":["4404040654"]},"title":{"type":["string","null"],"description":"Job title as returned by Scrappa.","examples":["Junior Software Engineer"]},"company":{"type":["object","null"],"description":"Nested company object returned by Scrappa.","properties":{"name":{"type":["string","null"],"description":"Employer name as returned by Scrappa.","examples":["Joveo AI"]},"url":{"type":["string","null"],"description":"LinkedIn company page URL as returned by Scrappa.","examples":["https://www.linkedin.com/company/joveo-ai"]}}},"location":{"type":["string","null"],"description":"Location string as returned by Scrappa.","examples":["Brazil"]},"description":{"type":["string","null"],"description":"Full job description as returned by Scrappa."},"employment_type":{"type":["string","null"],"description":"Employment type as returned by Scrappa.","examples":["Full-time"]},"seniority_level":{"type":["string","null"],"description":"Seniority label as returned by Scrappa.","examples":["Not Applicable"]},"posted_at":{"type":["string","null"],"description":"Posted timestamp or date string as returned by Scrappa.","examples":["2026-04-15T10:00:00.000000Z"]}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per job lookup","credits":1,"notes":"Flat fee per LinkedIn job detail lookup."}]}},"/api/enrichments/linkedin_jobs_search":{"post":{"operationId":"enrichment_linkedin_jobs_search","summary":"LinkedIn Jobs Search","description":"Discover LinkedIn job URLs via Google","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-jobs-search"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":2048,"description":"Search query for LinkedIn jobs. Supports Google-style operators.","examples":["site:linkedin.com/jobs \"frontend engineer\" Berlin"]},"num":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"Number of results per page (1-20).","examples":[10]},"start":{"type":["integer","null"],"minimum":0,"maximum":170,"description":"Starting offset into the result set (0-170).","examples":[0]},"page":{"type":["integer","null"],"minimum":1,"maximum":10,"description":"Result page number (1-10).","examples":[1]},"hl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Interface language code (2 letters).","examples":["en"]},"lr":{"type":["string","null"],"description":"Restrict results to a specific language using `lang_<code>`.","examples":["lang_en"]},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Two-letter country code for geographic biasing.","examples":["de"]},"cr":{"type":["string","null"],"description":"Restrict results to a specific country using `country<CC>` (uppercase).","examples":["countryDE"]},"safe":{"type":["string","null"],"enum":["active","off",null],"description":"SafeSearch toggle (`active` or `off`).","examples":["off"]},"dateRestrict":{"type":["string","null"],"description":"Date filter: `d`, `w`, `m`, or `y` optionally followed by a number of units.","examples":["w2"]},"sort":{"type":["string","null"],"enum":["date","date:r","date:d",null],"description":"Sort order (`date`, `date:r`, or `date:d`).","examples":["date"]},"filter":{"type":["string","null"],"enum":["0","1",null],"description":"Duplicate content filter (`0` off, `1` on).","examples":["1"]},"rights":{"type":["string","null"],"enum":["cc_publicdomain","cc_attribute","cc_sharealike","cc_noncommercial","cc_nonderived",null],"description":"License filter for result content (Creative Commons variants).","examples":["cc_publicdomain"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"frontend_jobs_berlin":{"summary":"Search LinkedIn jobs for frontend engineering postings in Berlin.","value":{"query":"site:linkedin.com/jobs \"frontend engineer\" Berlin","num":10,"gl":"de","hl":"en","dateRestrict":"w2"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"search_information":{"type":"object","description":"Metadata about the search that was performed.","properties":{"query_displayed":{"type":["string","null"],"description":"The query string as surfaced in the upstream response.","examples":["software engineer"]},"total_results":{"type":["integer","null"],"description":"Total number of matching results the upstream reports.","examples":[10]},"time_taken":{"type":["number","null"],"description":"Upstream search duration in seconds.","examples":[0.5]}}},"organic_results":{"type":"array","description":"List of LinkedIn jobs matched by the query.","items":{"type":"object","properties":{"position":{"type":["integer","null"],"description":"1-based rank of the result within the page.","examples":[1]},"title":{"type":["string","null"],"description":"Job / posting title as shown on LinkedIn.","examples":["Senior Software Engineer - Example GmbH"]},"link":{"type":["string","null"],"description":"Direct URL to the LinkedIn job posting.","examples":["https://www.linkedin.com/jobs/view/4404040654/"]},"displayed_link":{"type":["string","null"],"description":"Human-friendly link breadcrumb shown next to the result.","examples":["www.linkedin.com › jobs › view"]},"snippet":{"type":["string","null"],"description":"Snippet / teaser text for the posting.","examples":["We are looking for a Senior Software Engineer..."]}}}},"pagination":{"type":["object","null"],"description":"Pagination cursor and page list for fetching subsequent pages.","properties":{"current_page":{"type":["integer","null"],"description":"Current page number (1-based).","examples":[1]},"pages":{"type":["array","null"],"description":"Available page numbers in the result set.","examples":[[1,2,3]]}}},"total_results":{"type":["integer","null"],"description":"Top-level copy of the total result count.","examples":[10]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per LinkedIn jobs search request."}]}},"/api/enrichments/linkedin_people_search":{"post":{"operationId":"enrichment_linkedin_people_search","summary":"LinkedIn People Search","description":"Find people on LinkedIn by job title, company, location, industry and company size","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-people-search"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"job_titles":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Job titles to include, matched loosely against the current role (up to 50).","examples":[["Head of Sales"]],"items":{"type":"string","minLength":1,"maxLength":200,"description":"One job title.","examples":["Head of Sales"]},"additionalProperties":{"type":"string","minLength":1,"maxLength":200,"description":"One job title.","examples":["Head of Sales"]}},"exclude_job_titles":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Job titles to exclude from the results. Alone it does not count as a filter — combine it with at least one other field (up to 50).","examples":[["Intern"]],"items":{"type":"string","minLength":1,"maxLength":200,"description":"One job title to exclude.","examples":["Intern"]},"additionalProperties":{"type":"string","minLength":1,"maxLength":200,"description":"One job title to exclude.","examples":["Intern"]}},"job_levels":{"type":["array","object","null"],"description":"Seniority levels to include. Allowed values: C-Team, Director, Manager, Other, Staff, VP.","examples":[["VP","Director"]],"items":{"type":"string","enum":["C-Team","Director","Manager","Other","Staff","VP"],"description":"One seniority level: C-Team, Director, Manager, Other, Staff or VP.","examples":["VP"]},"additionalProperties":{"type":"string","enum":["C-Team","Director","Manager","Other","Staff","VP"],"description":"One seniority level: C-Team, Director, Manager, Other, Staff or VP.","examples":["VP"]}},"job_functions":{"type":["array","object","null"],"description":"Job functions to include. Allowed values: Advertising & Marketing, Art, Culture and Creative Professionals, Construction, Customer/Client Service, Education, Engineering, Finance & Accounting, General Business & Management, Healthcare & Human Services, Human Resources, Information Technology, Legal, Manufacturing & Production, Operations, Other, Public Administration & Safety, Purchasing, Research & Development, Sales & Business Development, Science, Supply Chain & Logistics, Writing/Editing.","examples":[["Sales & Business Development"]],"items":{"type":"string","enum":["Advertising & Marketing","Art, Culture and Creative Professionals","Construction","Customer/Client Service","Education","Engineering","Finance & Accounting","General Business & Management","Healthcare & Human Services","Human Resources","Information Technology","Legal","Manufacturing & Production","Operations","Other","Public Administration & Safety","Purchasing","Research & Development","Sales & Business Development","Science","Supply Chain & Logistics","Writing/Editing"],"description":"One job function, e.g. `Sales & Business Development`.","examples":["Sales & Business Development"]},"additionalProperties":{"type":"string","enum":["Advertising & Marketing","Art, Culture and Creative Professionals","Construction","Customer/Client Service","Education","Engineering","Finance & Accounting","General Business & Management","Healthcare & Human Services","Human Resources","Information Technology","Legal","Manufacturing & Production","Operations","Other","Public Administration & Safety","Purchasing","Research & Development","Sales & Business Development","Science","Supply Chain & Logistics","Writing/Editing"],"description":"One job function, e.g. `Sales & Business Development`.","examples":["Sales & Business Development"]}},"countries":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Two-letter country codes of the person's location (up to 50).","examples":[["DE"]],"items":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["DE"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["DE"]}},"cities":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Cities of the person's location to include (up to 50).","examples":[["Berlin"]],"items":{"type":"string","minLength":2,"maxLength":100,"description":"One city name.","examples":["Berlin"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":100,"description":"One city name.","examples":["Berlin"]}},"company_names":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Current employer names to include, matched loosely (up to 50).","examples":[["Acme"]],"items":{"type":"string","minLength":1,"maxLength":200,"description":"One company name.","examples":["Acme"]},"additionalProperties":{"type":"string","minLength":1,"maxLength":200,"description":"One company name.","examples":["Acme"]}},"company_linkedin_urls":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"LinkedIn company page URLs of the current employer (linkedin.com/company/<slug>, up to 50). Any regional subdomain or protocol is normalized away.","examples":[["https://www.linkedin.com/company/google"]],"items":{"type":"string","maxLength":300,"description":"One LinkedIn company page URL.","examples":["https://www.linkedin.com/company/google"]},"additionalProperties":{"type":"string","maxLength":300,"description":"One LinkedIn company page URL.","examples":["https://www.linkedin.com/company/google"]}},"industries":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Employer industries to include, free-form values like `Software Development` (up to 50).","examples":[["Software Development"]],"items":{"type":"string","minLength":1,"maxLength":200,"description":"One industry name.","examples":["Software Development"]},"additionalProperties":{"type":"string","minLength":1,"maxLength":200,"description":"One industry name.","examples":["Software Development"]}},"company_sizes":{"type":["array","object","null"],"description":"Employer size ranges to include. Allowed values: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+.","examples":[["51-200"]],"items":{"type":"string","enum":["1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10001+"],"description":"One company size range, e.g. `51-200`.","examples":["51-200"]},"additionalProperties":{"type":"string","enum":["1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10001+"],"description":"One company size range, e.g. `51-200`.","examples":["51-200"]}},"company_countries":{"type":["array","object","null"],"maxItems":50,"maxProperties":50,"description":"Two-letter country codes of the employer headquarters (up to 50).","examples":[["DE"]],"items":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["DE"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":2,"description":"One ISO 3166-1 alpha-2 country code.","examples":["DE"]}},"limit":{"type":["integer","null"],"minimum":1,"maximum":50,"description":"People to return at most, 1 to 50, default 10. The reservation is `limit` credits; only people actually returned are billed.","examples":[10]},"cursor":{"type":["string","null"],"maxLength":2000,"description":"Paging cursor from a previous call (`next_cursor`). Repeat the same call with it for the next page; `null` means the end.","examples":["example_cursor_people_p2"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"search_found":{"summary":"Sales leaders in German software companies of 51-200 employees. The page returned one person; `next_cursor` leads to more.","value":{"job_titles":["Head of Sales"],"industries":["Software Development"],"company_sizes":["51-200"],"countries":["DE"],"limit":10}},"search_no_results":{"summary":"No person matched the filters. Completes with `found: false` and is not charged.","value":{"job_titles":["Chief Underwater Basket Weaver"],"countries":["DE"]}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when at least one person is in `people`. `false` runs are not charged.","examples":[true]},"total":{"type":["integer","null"],"description":"Estimated total matches across all pages.","examples":[14337505]},"count":{"type":"integer","description":"People in this response; what the call is billed for.","examples":[1]},"next_cursor":{"type":["string","null"],"description":"Repeat the same call with it in `cursor` for the next page; `null` means the end.","examples":["example_cursor_people_p2"]},"people":{"type":"array","description":"The matched people in the shape of `linkedin_person_profile`.","items":{"type":"object","properties":{"full_name":{"type":["string","null"],"description":"Full name.","examples":["Beulah Lee"]},"headline":{"type":["string","null"],"description":"Profile headline.","examples":["Software Engineer | @Google"]},"linkedin_url":{"type":["string","null"],"description":"Canonical profile URL; feed it to `find_email_linkedin` or `find_phone_linkedin` for contact data.","examples":["https://www.linkedin.com/in/beulah-lee"]},"location":{"type":["object","null"],"description":"Profile location with `city`, `state_code`, `country_code`; `null` when empty."},"current_job":{"type":["object","null"],"description":"The entry of `experiences` with `is_current: true`, or `null`.","properties":{"title":{"type":["string","null"],"description":"Job title of the current role.","examples":["Software Engineer"]},"company_name":{"type":["string","null"],"description":"Employer name of the current role.","examples":["Google"]},"company_domain":{"type":["string","null"],"description":"Website domain of the employer.","examples":["google.com"]}}},"experiences":{"type":"array","description":"The career entries that matched the filters, usually just one — not the full history. For the whole career call `linkedin_person_profile` with `linkedin_url`."}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default reservation","credits":10,"notes":"Reserved for the default limit of 10 people; only people actually returned are charged."},{"tier":"found","label":"Per person returned","credits":1,"notes":"Charged for each person in the response."},{"tier":"not_found","label":"No results","credits":0,"notes":"No charge when nobody matches."}]}},"/api/enrichments/linkedin_person_profile":{"post":{"operationId":"enrichment_linkedin_person_profile","summary":"LinkedIn Person Profile","description":"Get name, title, career, education and skills from a LinkedIn profile URL","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/linkedin-person-profile"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"linkedin_url":{"type":"string","maxLength":300,"description":"LinkedIn profile URL (linkedin.com/in/<slug>). Any regional subdomain, protocol or tracking parameters are normalized away.","examples":["https://www.linkedin.com/in/beulah-lee"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["linkedin_url"]},"examples":{"profile_found":{"summary":"A LinkedIn profile with career, education and skills.","value":{"linkedin_url":"https://www.linkedin.com/in/beulah-lee"}},"profile_not_found":{"summary":"No profile exists for the URL. Completes with `found: false` and is not charged.","value":{"linkedin_url":"https://www.linkedin.com/in/nobody"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when a profile exists for the URL. `false` runs are not charged.","examples":[true]},"person":{"type":["object","null"],"description":"The normalized profile. `null` when `found` is `false`.","properties":{"full_name":{"type":["string","null"],"description":"Full name, joined from first and last name when the field itself is empty.","examples":["Beulah Lee"]},"first_name":{"type":["string","null"],"description":"First name.","examples":["Beulah"]},"last_name":{"type":["string","null"],"description":"Last name.","examples":["Lee"]},"headline":{"type":["string","null"],"description":"Profile headline.","examples":["Software Engineer | @Google"]},"about":{"type":["string","null"],"description":"Self-written profile summary."},"linkedin_url":{"type":["string","null"],"description":"Canonical profile URL.","examples":["https://www.linkedin.com/in/beulah-lee"]},"connections_count":{"type":["integer","null"],"description":"Number of LinkedIn connections.","examples":[500]},"location":{"type":"object","properties":{"city":{"type":["string","null"],"description":"City of the profile location.","examples":["Sunnyvale"]},"state_code":{"type":["string","null"],"description":"State or region code of the profile location.","examples":["CA"]},"country_code":{"type":["string","null"],"description":"Two-letter country code of the profile location.","examples":["US"]}}},"current_job":{"type":["object","null"],"description":"The entry of `experiences` with `is_current: true`, or `null`."},"experiences":{"type":"array","description":"Career entries in the order returned by the profile.","items":{"type":"object","properties":{"title":{"type":["string","null"],"description":"Job title.","examples":["Software Engineer"]},"company_name":{"type":["string","null"],"description":"Employer name.","examples":["Google"]},"company_linkedin_url":{"type":["string","null"],"description":"LinkedIn company page of the employer."},"company_domain":{"type":["string","null"],"description":"Website domain of the employer.","examples":["google.com"]},"description":{"type":["string","null"],"description":"Description of the role."},"start_date":{"type":["string","null"],"description":"Start date (ISO).","examples":["2025-04-01"]},"end_date":{"type":["string","null"],"description":"End date (ISO); `null` for the current role."},"is_current":{"type":"boolean","description":"`true` when this is the current role."},"contract_type":{"type":["string","null"],"description":"Employment type like Full-time or Contract.","examples":["Full-time"]},"work_arrangement":{"type":["string","null"],"description":"On-site, hybrid or remote.","examples":["Hybrid"]},"location":{"type":["object","null"],"description":"Location of the role with `city`, `state_code`, `country_code`; `null` when empty."}}}},"education":{"type":"array","description":"Education entries with `school`, `degree`, `start_date`, `end_date`."},"skills":{"type":"array","description":"Listed skills as plain strings.","examples":[["python"]]},"certifications":{"type":"array","description":"Certifications with `name`, `authority`, `url`."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Profile found","credits":10,"notes":"Charged when the profile is found."},{"tier":"not_found","label":"Not found","credits":0,"notes":"No charge when no profile exists for the URL."}]}},"/api/enrichments/list_company_publications":{"post":{"operationId":"enrichment_list_company_publications","summary":"List Company Publications","description":"List Bundesanzeiger publications for a mirrored German company","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/bundesanzeiger/list-company-publications"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","maxLength":128,"description":"Canonical German company id of the form `DE-{REGISTER_TYPE}-{COURT_CODE}-{REGISTER_NUMBER}`.","examples":["DE-HRB-F1103-267645"]},"source":{"type":"string","enum":["bundesanzeiger"],"description":"Optional publication source. Currently only `bundesanzeiger` is supported.","examples":["bundesanzeiger"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["company_id"]},"examples":{"publications_listed":{"summary":"List of Bundesanzeiger filings for a Berlin GmbH.","value":{"company_id":"DE-HRB-F1103-267645"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"publications":{"type":"array","description":"Filings attached to the company id (most recent first).","items":{"type":"object","properties":{"publication_id":{"type":"string","description":"HMAC-signed opaque identifier — pass to `get_publication` to fetch parsed financials."},"source":{"type":"string","description":"Provider that produced the publication (currently always `bundesanzeiger`)."},"type":{"type":"string","description":"Filing type, e.g. `jahresabschluss`, `konzernabschluss`, `hauptversammlung`, `sonstige`."},"published_at":{"type":["string","null"],"description":"ISO 8601 publication date (Bekanntmachungsdatum)."},"fiscal_period":{"type":"object","description":"Fiscal-period bounds parsed from the filing title: `{from, to}` (each ISO 8601 or null)."},"title":{"type":"string","description":"Original Bundesanzeiger filing title."}}}},"_registry_meta":{"type":"object","description":"Metadata: source, cache_hit, scrape_duration_ms, proxy_used."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Publications returned","credits":10,"notes":"Charged when at least one publication is returned (live or mirror cache)."},{"tier":"not_found","label":"No publications","credits":0,"notes":"No charge when the upstream registry has no filings for the company id."}]}},"/api/enrichments/maps_search":{"post":{"operationId":"enrichment_maps_search","summary":"Maps Search","description":"Search for businesses on maps with advanced filtering","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/maps-search"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"Places / business search query.","examples":["plumbers in Berlin"]},"zoom":{"type":["integer","null"],"minimum":3,"maximum":21,"description":"Google Maps zoom level (3-21) to control search radius.","examples":[12]},"limit":{"type":["integer","null"],"minimum":1,"maximum":2000,"description":"Maximum places to return (1-2000).","examples":[100]},"lat":{"type":["number","null"],"minimum":-90,"maximum":90,"description":"Latitude center for geo-biased search.","examples":[52.52]},"lon":{"type":["number","null"],"minimum":-180,"maximum":180,"description":"Longitude center for geo-biased search.","examples":[13.405]},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Two-letter country code to localize results.","examples":["de"]},"hl":{"type":["string","null"],"maxLength":5,"description":"Interface language code.","examples":["en"]},"fields":{"type":["string","null"],"maxLength":500,"description":"Comma-separated list of fields to include in each result row.","examples":["name,website,phone_numbers,rating"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"plumbers_berlin":{"summary":"Search Google Maps for plumbers in Berlin, limited to the top 100 results.","value":{"query":"plumbers in Berlin","limit":100,"gl":"de","hl":"en","fields":"name,website,phone_numbers,rating,full_address"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"items":{"type":"array","description":"List of Google Maps place results. Contents vary by the `fields` parameter.","items":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Business display name.","examples":["Example GmbH"]},"website":{"type":["string","null"],"description":"Primary website URL.","examples":["https://www.example.com"]},"phone_numbers":{"type":["array","null"],"description":"Listed phone numbers for the place.","examples":[["+4930123456789"]]},"type":{"type":["string","null"],"description":"Primary business category.","examples":["Software company"]},"rating":{"type":["number","null"],"description":"Average review rating (0–5).","examples":[4.6]},"review_count":{"type":["integer","null"],"description":"Number of reviews.","examples":[214]},"full_address":{"type":["string","null"],"description":"Formatted address.","examples":["Musterstraße 1, 12345 Berlin"]},"business_id":{"type":["string","null"],"description":"Google Maps business identifier (used for deduplication).","examples":["0x47a84e3e9f5b2a1d:0xabcdef1234567890"]},"place_id":{"type":["string","null"],"description":"Google Maps place_id.","examples":["ChIJaa…"]},"zip_code":{"type":["string","null"],"description":"Postal / ZIP code.","examples":["12345"]}}}},"total":{"type":"integer","description":"Number of unique places returned.","examples":[42]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"max","label":"Upper bound","credits":20,"notes":"Up to 20 credits reserved per request; billed as 2 credits per page actually fetched."},{"tier":"per_page","label":"Per page returned","credits":2,"notes":"Charged for each page of up to 200 results returned."},{"tier":"not_found","label":"No results","credits":0,"notes":"No charge when the search returns no places."}]}},"/api/enrichments/screenshot":{"post":{"operationId":"enrichment_screenshot","summary":"Screenshot","description":"Capture a page, an element or the Impressum company details as an image","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/screenshot"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"description":"Page to capture. http or https only; a URL without scheme gets https://. Private, local and cluster-internal addresses are refused, also when a redirect leads there.","examples":["https://www.example.de/impressum"]},"viewport_breite":{"type":"integer","minimum":320,"maximum":2560,"description":"Width of the browser window in CSS pixels (320 to 2560). Default 1440.","examples":[1440]},"skala":{"type":"integer","enum":[1,2],"description":"Device pixel ratio, 1 or 2. Default 2: text stays sharp, the image has twice the CSS width.","examples":[2]},"voll_seite":{"type":"boolean","description":"Capture the whole page instead of the visible window. Capped at 16000 image pixels in height.","examples":[false]},"selektor":{"type":["string","null"],"maxLength":500,"description":"CSS selector. Only the first visible matching element is captured. Not allowed together with modus impressum.","examples":["#kontakt"]},"modus":{"type":"string","enum":["seite","impressum"],"description":"`seite` (default) or `impressum`: finds the block with the company details (company and legal form, address, managing directors, register number, VAT id, phone and e-mail) and crops it tightly with about 24 px margin.","examples":["impressum"]},"format":{"type":"string","enum":["png","webp"],"description":"`png` (default) or `webp`.","examples":["png"]},"timeout":{"type":"integer","minimum":5,"maximum":60,"description":"Seconds the page may take to load (5 to 60). Default 30.","examples":[30]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["url"]},"examples":{"impressum":{"summary":"Crop the company details of an Impressum page.","value":{"url":"https://www.example.de/impressum","modus":"impressum"}},"full_page":{"summary":"Capture a whole page as WebP at scale 1.","value":{"url":"https://www.example.com","voll_seite":true,"skala":1,"format":"webp"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"finale_url":{"type":"string","description":"URL after redirects.","examples":["https://www.example.de/impressum/"]},"http_status":{"type":["integer","null"],"description":"HTTP status of the page.","examples":[200]},"modus":{"type":"string","description":"`seite` or `impressum`.","examples":["impressum"]},"format":{"type":"string","description":"`png` or `webp`.","examples":["png"]},"breite":{"type":"integer","description":"Image width in pixels (CSS width times `skala`).","examples":[1134]},"hoehe":{"type":"integer","description":"Image height in pixels.","examples":[992]},"bytes":{"type":"integer","description":"Size of the image file.","examples":[87341]},"bild_url":{"type":"string","description":"Signed download URL of the image, valid for 24 hours. Afterwards fetch it from `GET /api/v1/screenshot/{id}` (kept for 7 days)."},"bild_url_gueltig_bis":{"type":"string","description":"ISO 8601 time until which `bild_url` works."},"ausschnitt":{"type":["object","null"],"description":"Captured region in CSS pixels of the page (`x`, `y`, `breite`, `hoehe`); null for the visible window."},"angaben":{"type":"array","description":"Company details found in the Impressum crop: `firma`, `anschrift`, `vertretung`, `register`, `steuer`, `kontakt`.","examples":[["firma","anschrift","register"]]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"success","label":"Screenshot delivered","credits":5,"notes":"Per image, whatever the mode (viewport, full page, element or Impressum crop). A capture holds one Browserless session for about 10 to 25 seconds; the price sits at the proxy tier of the Web Scraper."},{"tier":"failed","label":"No image","credits":0,"notes":"No charge when the page could not be loaded, blocked the browser (also after one retry over a residential proxy), pointed to an internal address, exceeded the size limit, or had no Impressum block or matching element."}]}},"/api/enrichments/search_company":{"post":{"operationId":"enrichment_search_company","summary":"Search Company","description":"Search mirrored German registry companies with strict supported filters","tags":["Registries"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/handelsregister/search-company"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":["string","null"],"maxLength":255,"description":"Optional company-name substring matched against the German registry mirror. Required when no selective filter is provided and must contain at least three searchable characters.","examples":["Mustermann Beratung"]},"page":{"type":"integer","minimum":1,"maximum":1000,"description":"1-indexed result page. Defaults to 1 and is capped at 1000.","examples":[1]},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Results per page. Defaults to 25 and accepts 1-100.","examples":[25]},"filters":{"type":["array","object"],"description":"Strict filter object. Supported keys: register_type, legal_form, state, city, has_financials. The has_financials filter must be paired with a meaningful query or another selective filter.","examples":[{"register_type":"HRB","legal_form":"gmbh","city":"Berlin","has_financials":true}],"properties":{"register_type":{"type":["string","null"],"enum":["HRB","HRA","PR","GnR","VR",null],"description":"Optional register type filter: HRB, HRA, PR, GnR, or VR.","examples":["HRB"]},"legal_form":{"type":["string","null"],"maxLength":64,"description":"Optional normalized legal form filter such as gmbh, ag, ug, kg, or ohg.","examples":["gmbh"]},"state":{"type":["string","null"],"maxLength":64,"description":"Optional registered-office state filter.","examples":["Berlin"]},"city":{"type":["string","null"],"maxLength":128,"description":"Optional registered-office city filter.","examples":["Berlin"]},"has_financials":{"type":"boolean","description":"Optional boolean filter for companies with mirrored Bundesanzeiger financial publications. Requires a meaningful query or another selective filter.","examples":[true]}}},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"berlin_gmbhs_with_financials":{"summary":"Search mirrored Berlin GmbHs that have financial publications.","value":{"query":"Beratung","page":1,"per_page":25,"filters":{"register_type":"HRB","legal_form":"gmbh","state":"Berlin","city":"Berlin","has_financials":true}}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"results":{"type":"array","description":"Matching mirror companies for the requested page.","items":{"type":"object","properties":{"company_id":{"type":"string","description":"Canonical German company ID.","examples":["DE-HRB-F1103-267645"]},"legal_name":{"type":["string","null"],"description":"Registered legal name.","examples":["Mustermann Beratung GmbH"]},"legal_form":{"type":["string","null"],"description":"Normalized legal form.","examples":["gmbh"]},"register":{"type":"object","description":"Register type, court code, court name, and register number."},"status":{"type":["string","null"],"description":"Current mirror status.","examples":["active"]},"state":{"type":["string","null"],"description":"Registered office state.","examples":["Berlin"]},"city":{"type":["string","null"],"description":"Registered office city.","examples":["Berlin"]},"postal_code":{"type":["string","null"],"description":"Registered office postal code.","examples":["10115"]},"has_financials":{"type":"boolean","description":"Whether a financial publication exists for this company in the mirror."}}}},"pagination":{"type":"object","description":"Pagination metadata."},"_registry_meta":{"type":"object","description":"Registry metadata. `search_scope` is `mirror` in v1."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Companies found","credits":10,"notes":"Charged when at least one mirror company matches the query and filters."},{"tier":"not_found","label":"No results","credits":0,"notes":"No charge when the mirror returns zero matching companies."}]}},"/api/enrichments/stepstone_jobs":{"post":{"operationId":"enrichment_stepstone_jobs","summary":"Stepstone Jobs","description":"Search Stepstone job listings across DE/AT/NL/BE with company URLs","tags":["Jobs"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/stepstone-jobs"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"Search query (job title or keywords).","examples":["product manager"]},"location":{"type":["string","null"],"maxLength":200,"description":"City or region to search within.","examples":["Berlin"]},"country":{"type":["string","null"],"enum":["de","at","nl","be",null],"description":"Stepstone country (`de`, `at`, `nl`, `be`).","examples":["de"]},"radius":{"type":["integer","null"],"minimum":0,"maximum":200,"description":"Search radius in km (0-200).","examples":[25]},"sort":{"type":["string","null"],"enum":["relevance","date",null],"description":"Sort order (`relevance` or `date`).","examples":["date"]},"job_type":{"type":["string","null"],"enum":["full_time","part_time","internship","freelance",null],"description":"Employment type (`full_time`, `part_time`, `internship`, `freelance`).","examples":["full_time"]},"work_from_home":{"type":["boolean","null"],"description":"Restrict to remote / work-from-home listings.","examples":[true]},"date_posted":{"enum":["1","3","7","30",null],"description":"Only jobs posted within the last N days (1, 3, 7, 30).","examples":[7]},"page":{"type":["integer","null"],"minimum":1,"maximum":500,"description":"Page number (1-500).","examples":[1]},"limit":{"type":["integer","null"],"minimum":1,"maximum":100,"description":"Results per page (1-100).","examples":[25]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"product_managers_berlin":{"summary":"Search Stepstone for product manager roles in Berlin posted in the last 7 days.","value":{"query":"product manager","location":"Berlin","country":"de","job_type":"full_time","sort":"date","date_posted":7,"limit":25}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"success":{"type":["boolean","null"],"description":"Whether the upstream request succeeded.","examples":[true]},"data":{"type":"object","properties":{"jobs":{"type":["array","null"],"description":"List of Stepstone job postings.","items":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Stepstone job id.","examples":["abc123"]},"title":{"type":["string","null"],"description":"Job title.","examples":["Senior Software Engineer"]},"url":{"type":["string","null"],"description":"Canonical URL of the posting on Stepstone."},"company":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Employer name.","examples":["Example GmbH"]}}},"location":{"type":"object","properties":{"formatted":{"type":["string","null"],"description":"Formatted location string.","examples":["Berlin, Germany"]}}},"salary":{"type":["string","null"],"description":"Salary range string or null.","examples":["€70,000 - €90,000"]}}}},"pagination":{"type":"object","properties":{"page":{"type":["integer","null"],"description":"Current page number.","examples":[1]},"total_pages":{"type":["integer","null"],"description":"Total number of pages."}}}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per search","credits":1,"notes":"Flat fee per Stepstone jobs search request."}]}},"/api/enrichments/tiktok_find_leads":{"post":{"operationId":"enrichment_tiktok_find_leads","summary":"TikTok Lead Finder","description":"Build a TikTok lead list from niche keywords and seed accounts, filtered by follower count and contact data","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/tiktok-find-leads"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":["array","object","null"],"maxItems":10,"maxProperties":10,"description":"Niche terms for the TikTok user search (at most 10). The search mainly supplies starting accounts; seeds yield far more leads.","examples":[["kaffeerösterei","specialty coffee berlin"]],"items":{"type":"string","minLength":2,"maxLength":100,"description":"One search term, 2 to 100 characters.","examples":["kaffeerösterei"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":100,"description":"One search term, 2 to 100 characters.","examples":["kaffeerösterei"]}},"seed_usernames":{"type":["array","object","null"],"maxItems":20,"maxProperties":20,"description":"Accounts of the niche you already know (at most 20, handle or profile URL). Their followed accounts are read first; this is the way that yields on TikTok. Seeds themselves are never returned as leads.","examples":[["roestwerk.berlin"]],"items":{"type":"string","maxLength":300,"description":"One handle or profile URL.","examples":["roestwerk.berlin"]},"additionalProperties":{"type":"string","maxLength":300,"description":"One handle or profile URL.","examples":["roestwerk.berlin"]}},"min_followers":{"type":["integer","null"],"minimum":0,"maximum":1000000000,"description":"Smallest follower count of a lead, default 1000.","examples":[5000]},"max_followers":{"type":["integer","null"],"minimum":1,"maximum":1000000000,"description":"Largest follower count of a lead, default 1000000.","examples":[200000]},"regions":{"type":["array","object","null"],"maxItems":20,"maxProperties":20,"description":"Only accounts TikTok places in these regions (two-letter codes). Accounts without a known region are left out when set.","examples":[["DE","AT","CH"]],"items":{"type":"string","minLength":2,"maxLength":2,"description":"Two-letter region code.","examples":["DE"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":2,"description":"Two-letter region code.","examples":["DE"]}},"require_contact":{"type":["boolean","null"],"description":"Only leads with at least one of email, bio link or Instagram handle. Default `false`.","examples":[true]},"limit":{"type":["integer","null"],"minimum":1,"maximum":200,"description":"Stop after this many leads, 1 to 200, default 25.","examples":[25]},"max_credits":{"type":["integer","null"],"minimum":10,"maximum":1000,"description":"Budget in credits, 10 to 1000, default 100. Reserved up front; the run stops before a lookup would cross it and only the lookups made are billed.","examples":[200]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}}},"examples":{"snowball_from_seed":{"summary":"Leads from the accounts a known niche account follows, filtered to 5,000 to 200,000 followers with contact data.","value":{"seed_usernames":["kaffeeliebe.de"],"keywords":["kaffeerösterei"],"min_followers":5000,"max_followers":200000,"require_contact":true,"limit":25,"max_credits":200}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when at least one lead was found.","examples":[true]},"count":{"type":"integer","description":"Leads returned.","examples":[1]},"leads":{"type":"array","description":"Accounts inside the follower band, each read from its full profile.","items":{"type":"object","properties":{"username":{"type":"string","description":"TikTok handle without @, lower case.","examples":["roestwerk.berlin"]},"user_id":{"type":["string","null"],"description":"Numeric TikTok user id.","examples":["6812345678901234567"]},"sec_uid":{"type":["string","null"],"description":"TikTok secure user id."},"nickname":{"type":["string","null"],"description":"Display name.","examples":["Röstwerk Berlin"]},"profile_url":{"type":"string","description":"Profile URL.","examples":["https://www.tiktok.com/@roestwerk.berlin"]},"bio":{"type":["string","null"],"description":"Bio text as written by the account."},"bio_link":{"type":["string","null"],"description":"The link in the bio (website, link page or shop).","examples":["https://roestwerk-berlin.de"]},"emails":{"type":"array","description":"Email addresses the account lists in its bio or contact field.","examples":[["hallo@roestwerk-berlin.de"]]},"instagram_handle":{"type":["string","null"],"description":"Linked Instagram handle (linked account, bio link or an \"IG:\" mention in the bio).","examples":["roestwerk.berlin"]},"instagram_url":{"type":["string","null"],"description":"Instagram profile URL of that handle."},"youtube_url":{"type":["string","null"],"description":"Linked YouTube channel."},"twitter_handle":{"type":["string","null"],"description":"Linked X/Twitter handle."},"follower_count":{"type":["integer","null"],"description":"Followers.","examples":[48210]},"following_count":{"type":["integer","null"],"description":"Accounts this account follows.","examples":[312]},"likes_count":{"type":["integer","null"],"description":"Likes received over all videos."},"video_count":{"type":["integer","null"],"description":"Published videos."},"verified":{"type":"boolean","description":"`true` for a verified account."},"private":{"type":"boolean","description":"`true` for a private account."},"region":{"type":["string","null"],"description":"Two-letter region of the account as TikTok reports it.","examples":["DE"]},"avatar_url":{"type":["string","null"],"description":"Profile picture URL."},"found_via":{"type":"object","description":"How the lead was found: `method` (`search` or `following`), the `keyword` or the `account` whose following list named it."}}}},"steps_used":{"type":"integer","description":"Lookups made; the run is billed for these.","examples":[4]},"steps":{"type":"object","description":"Lookups by kind: `search`, `following`, `profile`."},"stopped_because":{"type":"string","description":"`limit_reached`, `budget_exhausted`, `time_limit`, `no_more_candidates` or `source_error` (a lookup failed after leads were found; they are kept and the failed lookup is not billed).","examples":["no_more_candidates"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default budget","credits":100,"notes":"Reserved when max_credits is not set; only the lookups made are billed."},{"tier":"step","label":"Per lookup","credits":2,"notes":"Each search page, following page, profile or channel lookup the run makes."}]}},"/api/enrichments/tiktok_following":{"post":{"operationId":"enrichment_tiktok_following","summary":"TikTok Following","description":"List the accounts a TikTok account follows, to snowball a lead list","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/tiktok-following"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","maxLength":300,"description":"The account whose followed accounts you want, as handle or profile URL. Accounts of the same niche follow each other, so this is the way to snowball a lead list.","examples":["roestwerk.berlin"]},"cursor":{"type":["string","null"],"maxLength":200,"description":"`next_cursor` of the previous answer, for the next page. Each page is billed on its own.","examples":["1730000000"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["username"]},"examples":{"following_page":{"summary":"One page of the accounts a creator follows.","value":{"username":"roestwerk.berlin"}},"unknown_account":{"summary":"No account with this handle (or it is private). Completes with `found: false` and is not charged.","value":{"username":"gibt.es.nicht.123"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the page holds at least one account. `false` runs are not charged.","examples":[true]},"account_found":{"type":"boolean","description":"`false` when the handle does not exist.","examples":[true]},"count":{"type":"integer","description":"Accounts on this page.","examples":[1]},"users":{"type":"array","description":"Followed accounts with follower counts; `tiktok_profile` reads bio link and email of the ones you keep.","items":{"type":"object","properties":{"username":{"type":"string","description":"TikTok handle without @, lower case.","examples":["roestwerk.berlin"]},"user_id":{"type":["string","null"],"description":"Numeric TikTok user id.","examples":["6812345678901234567"]},"sec_uid":{"type":["string","null"],"description":"TikTok secure user id."},"nickname":{"type":["string","null"],"description":"Display name.","examples":["Röstwerk Berlin"]},"profile_url":{"type":"string","description":"Profile URL.","examples":["https://www.tiktok.com/@roestwerk.berlin"]},"bio":{"type":["string","null"],"description":"Bio text as written by the account."},"bio_link":{"type":["string","null"],"description":"The link in the bio (website, link page or shop).","examples":["https://roestwerk-berlin.de"]},"emails":{"type":"array","description":"Email addresses the account lists in its bio or contact field.","examples":[["hallo@roestwerk-berlin.de"]]},"instagram_handle":{"type":["string","null"],"description":"Linked Instagram handle (linked account, bio link or an \"IG:\" mention in the bio).","examples":["roestwerk.berlin"]},"instagram_url":{"type":["string","null"],"description":"Instagram profile URL of that handle."},"youtube_url":{"type":["string","null"],"description":"Linked YouTube channel."},"twitter_handle":{"type":["string","null"],"description":"Linked X/Twitter handle."},"follower_count":{"type":["integer","null"],"description":"Followers.","examples":[48210]},"following_count":{"type":["integer","null"],"description":"Accounts this account follows.","examples":[312]},"likes_count":{"type":["integer","null"],"description":"Likes received over all videos."},"video_count":{"type":["integer","null"],"description":"Published videos."},"verified":{"type":"boolean","description":"`true` for a verified account."},"private":{"type":"boolean","description":"`true` for a private account."},"region":{"type":["string","null"],"description":"Two-letter region of the account as TikTok reports it.","examples":["DE"]},"avatar_url":{"type":["string","null"],"description":"Profile picture URL."}}}},"next_cursor":{"type":["string","null"],"description":"Send it back as `cursor` for the next page; `null` at the end.","examples":["1730000000"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Page with accounts","credits":2,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/tiktok_profile":{"post":{"operationId":"enrichment_tiktok_profile","summary":"TikTok Profile","description":"Get followers, bio link, Instagram handle and the email from the bio of a TikTok account","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/tiktok-profile"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","maxLength":300,"description":"TikTok handle, with or without @, or a profile URL (tiktok.com/@<handle>).","examples":["roestwerk.berlin"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["username"]},"examples":{"profile_found":{"summary":"A creator profile with bio link, Instagram handle and the email from the bio.","value":{"username":"@roestwerk.berlin"}},"profile_not_found":{"summary":"No account with this handle. Completes with `found: false` and is not charged.","value":{"username":"gibt.es.nicht.123"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the account exists. `false` runs are not charged.","examples":[true]},"profile":{"type":["object","null"],"description":"The account. `null` when `found` is `false`.","properties":{"username":{"type":"string","description":"TikTok handle without @, lower case.","examples":["roestwerk.berlin"]},"user_id":{"type":["string","null"],"description":"Numeric TikTok user id.","examples":["6812345678901234567"]},"sec_uid":{"type":["string","null"],"description":"TikTok secure user id."},"nickname":{"type":["string","null"],"description":"Display name.","examples":["Röstwerk Berlin"]},"profile_url":{"type":"string","description":"Profile URL.","examples":["https://www.tiktok.com/@roestwerk.berlin"]},"bio":{"type":["string","null"],"description":"Bio text as written by the account."},"bio_link":{"type":["string","null"],"description":"The link in the bio (website, link page or shop).","examples":["https://roestwerk-berlin.de"]},"emails":{"type":"array","description":"Email addresses the account lists in its bio or contact field.","examples":[["hallo@roestwerk-berlin.de"]]},"instagram_handle":{"type":["string","null"],"description":"Linked Instagram handle (linked account, bio link or an \"IG:\" mention in the bio).","examples":["roestwerk.berlin"]},"instagram_url":{"type":["string","null"],"description":"Instagram profile URL of that handle."},"youtube_url":{"type":["string","null"],"description":"Linked YouTube channel."},"twitter_handle":{"type":["string","null"],"description":"Linked X/Twitter handle."},"follower_count":{"type":["integer","null"],"description":"Followers.","examples":[48210]},"following_count":{"type":["integer","null"],"description":"Accounts this account follows.","examples":[312]},"likes_count":{"type":["integer","null"],"description":"Likes received over all videos."},"video_count":{"type":["integer","null"],"description":"Published videos."},"verified":{"type":"boolean","description":"`true` for a verified account."},"private":{"type":"boolean","description":"`true` for a private account."},"region":{"type":["string","null"],"description":"Two-letter region of the account as TikTok reports it.","examples":["DE"]},"avatar_url":{"type":["string","null"],"description":"Profile picture URL."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Profile found","credits":3,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/tiktok_search_users":{"post":{"operationId":"enrichment_tiktok_search_users","summary":"TikTok User Search","description":"Search TikTok accounts by keyword","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/tiktok-search-users"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","minLength":2,"maxLength":100,"description":"Search term as typed into the TikTok user search, e.g. a niche, a trade or a city.","examples":["kaffeerösterei berlin"]},"cursor":{"type":["string","null"],"maxLength":200,"description":"`next_cursor` of the previous answer, for the next page. Each page is billed on its own.","examples":["10"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["keyword"]},"examples":{"accounts_found":{"summary":"One page of accounts for a keyword.","value":{"keyword":"kaffeerösterei berlin"}},"no_accounts":{"summary":"Nothing matches. Completes with `found: false` and is not charged.","value":{"keyword":"qqqxxyyzz"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the page holds at least one account. `false` runs are not charged.","examples":[true]},"count":{"type":"integer","description":"Accounts on this page.","examples":[1]},"users":{"type":"array","description":"The accounts in the order of the search. Bio link and email are only as complete as the search shows them; `tiktok_profile` reads the full profile.","items":{"type":"object","properties":{"username":{"type":"string","description":"TikTok handle without @, lower case.","examples":["roestwerk.berlin"]},"user_id":{"type":["string","null"],"description":"Numeric TikTok user id.","examples":["6812345678901234567"]},"sec_uid":{"type":["string","null"],"description":"TikTok secure user id."},"nickname":{"type":["string","null"],"description":"Display name.","examples":["Röstwerk Berlin"]},"profile_url":{"type":"string","description":"Profile URL.","examples":["https://www.tiktok.com/@roestwerk.berlin"]},"bio":{"type":["string","null"],"description":"Bio text as written by the account."},"bio_link":{"type":["string","null"],"description":"The link in the bio (website, link page or shop).","examples":["https://roestwerk-berlin.de"]},"emails":{"type":"array","description":"Email addresses the account lists in its bio or contact field.","examples":[["hallo@roestwerk-berlin.de"]]},"instagram_handle":{"type":["string","null"],"description":"Linked Instagram handle (linked account, bio link or an \"IG:\" mention in the bio).","examples":["roestwerk.berlin"]},"instagram_url":{"type":["string","null"],"description":"Instagram profile URL of that handle."},"youtube_url":{"type":["string","null"],"description":"Linked YouTube channel."},"twitter_handle":{"type":["string","null"],"description":"Linked X/Twitter handle."},"follower_count":{"type":["integer","null"],"description":"Followers.","examples":[48210]},"following_count":{"type":["integer","null"],"description":"Accounts this account follows.","examples":[312]},"likes_count":{"type":["integer","null"],"description":"Likes received over all videos."},"video_count":{"type":["integer","null"],"description":"Published videos."},"verified":{"type":"boolean","description":"`true` for a verified account."},"private":{"type":"boolean","description":"`true` for a private account."},"region":{"type":["string","null"],"description":"Two-letter region of the account as TikTok reports it.","examples":["DE"]},"avatar_url":{"type":["string","null"],"description":"Profile picture URL."}}}},"next_cursor":{"type":["string","null"],"description":"Send it back as `cursor` for the next page; `null` at the end.","examples":["10"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Page with accounts","credits":2,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/verify_company_website":{"post":{"operationId":"enrichment_verify_company_website","summary":"Verify Company Website","description":"Verify a German company website against the registry mirror through imprint identifiers and fuzzy name matching","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/verify-company-website"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"website_url":{"type":"string","maxLength":2048,"description":"Public company website URL. The URL is validated with the shared SSRF-safe URL validator before any imprint lookup.","examples":["https://www.example.de"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["website_url"]},"examples":{"high_confidence_register_match":{"summary":"Verify a website through an HRB number and register court in the imprint.","value":{"website_url":"https://www.example.de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"company_id":{"type":["string","null"],"description":"Canonical German company ID when a deterministic or single strong match is found.","examples":["DE-HRB-F1103-267645"]},"name":{"type":["string","null"],"description":"Matched registry legal name.","examples":["Muster Software GmbH"]},"match_method":{"type":["string","null"],"description":"Match method: `register_identity`, `vat_id`, or `fuzzy_name_city`.","examples":["register_identity"]},"match_confidence":{"type":"string","description":"`high`, `medium`, `low`, or `none`.","examples":["high"]},"candidates":{"type":"array","description":"Candidate companies for low-confidence fuzzy matches. Empty for high, medium, and no match."},"website":{"type":"string","description":"Normalized validated website URL.","examples":["https://www.example.de"]},"_registry_meta":{"type":"object","description":"Imprint source URL, safe URL metadata, and warnings."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"high","label":"High-confidence match","credits":10,"notes":"Matched through Handelsregister identity or a mirrored VAT ID."},{"tier":"medium","label":"Medium-confidence match","credits":10,"notes":"Single strong fuzzy legal-name and city match."},{"tier":"low","label":"Low-confidence candidates","credits":5,"notes":"Multiple plausible fuzzy candidates returned for manual review."},{"tier":"no_match","label":"No match","credits":0,"notes":"No charge when the website cannot be linked to a mirror company."}]}},"/api/enrichments/verify_email":{"post":{"operationId":"enrichment_verify_email","summary":"Verify Email","description":"Verify email deliverability and validity","tags":["People Data"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/verify-email"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":255,"description":"Email address to verify. Must be a syntactically valid address.","examples":["john.doe@example.com"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["email"]},"examples":{"deliverable":{"summary":"A normal deliverable mailbox at a paid domain.","value":{"email":"jane.doe@example.com"}},"role_account":{"summary":"A deliverable role account (e.g. info@, sales@).","value":{"email":"info@example.com"}},"undeliverable":{"summary":"An address whose mailbox does not exist at the destination domain.","value":{"email":"noone@example.com"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"email":{"type":"string","description":"The email address that was verified (lowercased).","examples":["john.doe@example.com"]},"code":{"type":"integer","description":"Numeric verification code (1-7): 5 deliverable, 4 catch-all, 7 unknown, 1/2/3/6 undeliverable.","examples":[5]},"status":{"type":"string","description":"Human-readable verification status (e.g. `deliverable`, `undeliverable`, `unknown`).","examples":["deliverable"]},"is_deliverable":{"type":["boolean","null"],"description":"Whether the mailbox is confirmed deliverable.","examples":[true]},"is_disposable":{"type":["boolean","null"],"description":"Whether the domain is a known disposable / temporary email provider.","examples":[false]},"is_role":{"type":["boolean","null"],"description":"Whether the address is a role account (e.g. `info@`, `sales@`).","examples":[false]},"is_catch_all":{"type":["boolean","null"],"description":"Whether the domain accepts mail for any recipient (catch-all).","examples":[false]},"is_free_provider":{"type":["boolean","null"],"description":"Whether the domain belongs to a free email provider (gmail, outlook, etc.).","examples":[false]},"reason":{"type":["string","null"],"description":"Human-readable reason for the verification result.","examples":["Accepted email"]},"verified_at":{"type":["string","null"],"description":"When the address was verified (ISO 8601). A result served from the 24-hour cache keeps the time of the original verification.","examples":["2026-09-30T14:05:12+00:00"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Per verification","credits":3,"notes":"Flat fee per email verification, regardless of outcome."}]}},"/api/enrichments/web_scraper":{"post":{"operationId":"enrichment_web_scraper","summary":"Web Scraper","description":"Extract content and metadata from web pages","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/web-scraper"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"description":"Full URL to scrape. Can include protocol and path.","examples":["https://example.com/about"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["url"]},"examples":{"success":{"summary":"Scrape a marketing/about page and extract structured data.","value":{"url":"https://example.com/about"}},"blocked":{"summary":"Target site returned a 5xx or could not be scraped.","value":{"url":"https://blocked.example"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"site_status_code":{"type":"integer","description":"HTTP status code returned by the target site. `0` when the site could not be reached.","examples":[200]},"final_url":{"type":["string","null"],"description":"URL after redirects.","examples":["https://www.example.com/about/"]},"title":{"type":["string","null"],"description":"HTML `<title>` of the rendered page.","examples":["About — Example"]},"description":{"type":["string","null"],"description":"Meta description (`<meta name=\"description\">`).","examples":["Example is a SaaS platform for…"]},"keywords":{"type":"array","description":"Meta keywords, split and trimmed.","examples":[["saas","platform"]]},"favicon":{"type":["string","null"],"description":"Favicon URL.","examples":["https://www.example.com/favicon.ico"]},"social_links":{"type":"array","description":"Social profile URLs discovered in the page (LinkedIn, X, Facebook, …).","examples":[["https://www.linkedin.com/company/example"]]},"links":{"type":"array","description":"All absolute hyperlinks found on the page.","examples":[["https://www.example.com/contact"]]},"emails":{"type":"array","description":"Email addresses parsed from the page text.","examples":[["hello@example.com"]]},"phone_numbers":{"type":"array","description":"Phone numbers parsed from the page text.","examples":[["+4930123456789"]]},"images":{"type":"array","description":"Absolute image URLs referenced in the DOM.","examples":[["https://www.example.com/img/hero.png"]]},"body_text":{"type":"string","description":"Visible text content of the page with markup stripped."},"languages_detected":{"type":"array","description":"Languages detected from the page (ISO 639-1 codes).","examples":[["en"]]},"site_error":{"type":["string","null"],"description":"Populated when the target site could not be scraped (blocked, 5xx, empty).","examples":["Target site returned 503"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"complex_but_success","label":"Scraped via proxy","credits":5,"notes":"Charged when a proxy or headless browser was required to render the page."},{"tier":"success","label":"Scraped directly","credits":2,"notes":"Standard pricing for successful direct fetches."},{"tier":"blocked","label":"Blocked / empty","credits":0,"notes":"No charge when the page could not be retrieved or returned no useful data."}]}},"/api/enrichments/webtraffic":{"post":{"operationId":"enrichment_webtraffic","summary":"Web Traffic","description":"Fetch website traffic, engagement, and ranking metrics via Scrappa (SimilarWeb)","tags":["Web & Companies"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/webtraffic"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","maxLength":255,"description":"Website domain to analyze. Protocols, `www`, and paths are stripped automatically; lookups resolve to the apex domain.","examples":["stripe.com"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["domain"]},"examples":{"domain_traffic":{"summary":"Fetch traffic and engagement metrics for a domain.","value":{"domain":"stripe.com"}},"no_data":{"summary":"A domain SimilarWeb has no traffic data for (too new or too small). Completes with `found: false` and is not charged.","value":{"domain":"some-tiny-unknown-domain.de"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"Whether SimilarWeb had traffic data. `false` means no data was available (not charged); all other fields except `domain` and `message` are then absent.","examples":[true]},"message":{"type":["string","null"],"description":"Explanation when `found` is false. Absent when data was returned."},"domain":{"type":"string","description":"Apex domain the metrics resolve to.","examples":["stripe.com"]},"site_name":{"type":["string","null"],"description":"Site name as reported by SimilarWeb.","examples":["stripe.com"]},"title":{"type":["string","null"],"description":"Homepage title. Null when unavailable."},"description":{"type":["string","null"],"description":"Homepage meta description. Null when unavailable."},"category":{"type":["string","null"],"description":"SimilarWeb category slug. Null when unavailable.","examples":["finance"]},"global_rank":{"type":["integer","null"],"description":"Global traffic rank (lower is more visited).","examples":[327]},"country_rank":{"type":"object","properties":{"country_code":{"type":["string","null"],"description":"Country with the highest rank for this site.","examples":["US"]},"rank":{"type":["integer","null"],"description":"Rank within `country_rank.country_code`.","examples":[245]}}},"category_rank":{"type":"object","properties":{"category":{"type":["string","null"],"description":"Category the rank applies to.","examples":["Finance"]},"rank":{"type":["integer","null"],"description":"Rank within the category.","examples":[21]}}},"engagement":{"type":"object","properties":{"monthly_visits":{"type":["integer","null"],"description":"Estimated visits in the most recent reported month.","examples":[122394040]},"time_on_site":{"type":["number","null"],"description":"Average session duration in seconds.","examples":[165.93]},"pages_per_visit":{"type":["number","null"],"description":"Average pages viewed per visit.","examples":[3.26]},"bounce_rate":{"type":["number","null"],"description":"Bounce rate as a 0–1 fraction.","examples":[0.55]}}},"traffic_sources":{"type":"object","description":"Share of traffic per channel (0–1). Null channels are unmeasured, not zero."},"top_countries":{"type":"array","description":"Top countries by visit share. Each entry has `country_code`, `country_id`, `share`."},"estimated_monthly_visits":{"type":"object","description":"Trailing monthly visit estimates keyed by ISO date (YYYY-MM-01)."},"top_keywords":{"type":"array","description":"Top organic keywords. Each entry has `keyword`, `share`, `volume`, `cpc`."},"screenshot":{"type":["string","null"],"description":"Signed URL of a homepage screenshot."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Traffic data found","credits":7,"notes":"Charged only when SimilarWeb returns traffic data for the domain."},{"tier":"not_found","label":"No data","credits":0,"notes":"No charge when SimilarWeb has no data for the domain (too new or too small)."}]}},"/api/enrichments/youtube_channel":{"post":{"operationId":"enrichment_youtube_channel","summary":"YouTube Channel","description":"Get subscribers, listed links and the public email of a YouTube channel","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/youtube-channel"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string","maxLength":300,"description":"Channel id (UC…), handle (@name) or channel URL (youtube.com/@name, /channel/UC…, /c/name, /user/name).","examples":["@roestwerkberlin"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["channel"]},"examples":{"channel_found":{"summary":"Subscribers, listed links and the email from the description of a channel.","value":{"channel":"@roestwerkberlin"}},"channel_not_found":{"summary":"No channel with this handle. Completes with `found: false` and is not charged.","value":{"channel":"@gibt-es-nicht-123"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the channel exists. `false` runs are not charged.","examples":[true]},"channel":{"type":["object","null"],"description":"The channel. `null` when `found` is `false`.","properties":{"channel_id":{"type":["string","null"],"description":"YouTube channel id (UC…).","examples":["UCrstwrkBerlin0000000000"]},"title":{"type":["string","null"],"description":"Channel name.","examples":["Röstwerk Berlin"]},"handle":{"type":["string","null"],"description":"Handle with @.","examples":["@roestwerkberlin"]},"url":{"type":"string","description":"Channel URL.","examples":["https://www.youtube.com/@roestwerkberlin"]},"description":{"type":["string","null"],"description":"Channel description as written by the creator."},"subscriber_count":{"type":["integer","null"],"description":"Subscribers (YouTube rounds large counts).","examples":[12400]},"video_count":{"type":["integer","null"],"description":"Published videos.","examples":[143]},"view_count":{"type":["integer","null"],"description":"Views over all videos."},"country":{"type":["string","null"],"description":"Country the channel states on its About page.","examples":["Germany"]},"joined_date":{"type":["string","null"],"description":"Date the channel was created (ISO).","examples":["2016-03-14"]},"verified":{"type":"boolean","description":"`true` for a verified channel."},"links":{"type":"array","description":"Links the channel lists, each with `title` and `url`."},"emails":{"type":"array","description":"Email addresses the creator wrote into the description or the links. The business email YouTube hides behind a captcha is not read.","examples":[["kooperation@roestwerk-berlin.de"]]},"has_hidden_business_email":{"type":"boolean","description":"`true` when the About page offers a business email behind sign-in and captcha."},"website":{"type":["string","null"],"description":"First listed link that is not a social network.","examples":["https://roestwerk-berlin.de"]},"instagram_url":{"type":["string","null"],"description":"Listed Instagram profile."},"tiktok_url":{"type":["string","null"],"description":"Listed TikTok profile."},"thumbnail_url":{"type":["string","null"],"description":"Channel picture URL."},"about_page_read":{"type":"boolean","description":"`false` when the About page could not be read; links, country and emails are then missing."}}}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Channel found","credits":3,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/youtube_channel_videos":{"post":{"operationId":"enrichment_youtube_channel_videos","summary":"YouTube Channel Videos","description":"List the uploads of a YouTube channel with views and dates","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/youtube-channel-videos"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string","maxLength":300,"description":"Channel id (UC…), handle (@name) or channel URL.","examples":["@roestwerkberlin"]},"sort":{"type":["string","null"],"enum":["newest","popular","oldest",null],"description":"Order of the uploads: `newest` (default), `popular` or `oldest`.","examples":["newest"]},"cursor":{"type":["string","null"],"maxLength":500,"description":"`next_cursor` of the previous answer, for the next page. Each page is billed on its own.","examples":["EgZ2aWRlb3MYAyAAMAE"]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["channel"]},"examples":{"uploads_found":{"summary":"The newest uploads of a channel, to judge how active it is.","value":{"channel":"UCrstwrkBerlin0000000000"}},"channel_not_found":{"summary":"No channel with this handle. Completes with `found: false` and is not charged.","value":{"channel":"@gibt-es-nicht-123"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the page holds at least one video. `false` runs are not charged.","examples":[true]},"channel_found":{"type":"boolean","description":"`false` when the channel does not exist.","examples":[true]},"channel_id":{"type":["string","null"],"description":"Channel id the videos belong to.","examples":["UCrstwrkBerlin0000000000"]},"count":{"type":"integer","description":"Videos on this page.","examples":[1]},"videos":{"type":"array","description":"Uploads in the chosen order.","items":{"type":"object","properties":{"video_id":{"type":"string","description":"Video id.","examples":["abcdEFGhijk"]},"title":{"type":["string","null"],"description":"Video title."},"url":{"type":"string","description":"Watch URL (shorts link for a short)."},"published":{"type":["string","null"],"description":"Publish time as YouTube shows it, e.g. `3 days ago`."},"view_count":{"type":["integer","null"],"description":"Views.","examples":[18234]},"duration":{"type":["string","null"],"description":"Length as shown, e.g. `12:41`."},"is_short":{"type":"boolean","description":"`true` for a short."},"is_live":{"type":"boolean","description":"`true` for a live stream."}}}},"next_cursor":{"type":["string","null"],"description":"Send it back as `cursor` for the next page; `null` at the end."}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Page with videos","credits":2,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/youtube_find_leads":{"post":{"operationId":"enrichment_youtube_find_leads","summary":"YouTube Lead Finder","description":"Build a YouTube lead list from niche keywords, filtered by subscriber count and contact data","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/youtube-find-leads"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":["array","object"],"minItems":1,"minProperties":1,"maxItems":10,"maxProperties":10,"description":"Niche terms as typed into YouTube (1 to 10). Each runs page by page, the keywords take turns.","examples":[["kaffee rösten","espresso maschine test"]],"items":{"type":"string","minLength":2,"maxLength":200,"description":"One search term, 2 to 200 characters.","examples":["kaffee rösten"]},"additionalProperties":{"type":"string","minLength":2,"maxLength":200,"description":"One search term, 2 to 200 characters.","examples":["kaffee rösten"]}},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Country of the search as two-letter code.","examples":["de"]},"hl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Language of the search as two-letter code.","examples":["de"]},"min_subscribers":{"type":["integer","null"],"minimum":0,"maximum":1000000000,"description":"Smallest subscriber count of a lead, default 1000.","examples":[5000]},"max_subscribers":{"type":["integer","null"],"minimum":1,"maximum":1000000000,"description":"Largest subscriber count of a lead, default 1000000.","examples":[250000]},"require_contact":{"type":["boolean","null"],"description":"Only leads with at least one of email, website or Instagram link. Default `false`.","examples":[true]},"limit":{"type":["integer","null"],"minimum":1,"maximum":200,"description":"Stop after this many leads, 1 to 200, default 25.","examples":[25]},"max_credits":{"type":["integer","null"],"minimum":10,"maximum":1000,"description":"Budget in credits, 10 to 1000, default 100. Reserved up front; the run stops before a lookup would cross it and only the lookups made are billed.","examples":[200]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["keywords"]},"examples":{"channels_with_contact":{"summary":"Channels of a niche with 5,000 to 250,000 subscribers that list an email, a website or Instagram.","value":{"keywords":["kaffee rösten"],"gl":"de","hl":"de","min_subscribers":5000,"max_subscribers":250000,"require_contact":true,"limit":25,"max_credits":200}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when at least one lead was found.","examples":[true]},"count":{"type":"integer","description":"Leads returned.","examples":[1]},"leads":{"type":"array","description":"Channels inside the subscriber band, each read with its About page.","items":{"type":"object","properties":{"channel_id":{"type":["string","null"],"description":"YouTube channel id (UC…).","examples":["UCrstwrkBerlin0000000000"]},"title":{"type":["string","null"],"description":"Channel name.","examples":["Röstwerk Berlin"]},"handle":{"type":["string","null"],"description":"Handle with @.","examples":["@roestwerkberlin"]},"url":{"type":"string","description":"Channel URL.","examples":["https://www.youtube.com/@roestwerkberlin"]},"description":{"type":["string","null"],"description":"Channel description as written by the creator."},"subscriber_count":{"type":["integer","null"],"description":"Subscribers (YouTube rounds large counts).","examples":[12400]},"video_count":{"type":["integer","null"],"description":"Published videos.","examples":[143]},"view_count":{"type":["integer","null"],"description":"Views over all videos."},"country":{"type":["string","null"],"description":"Country the channel states on its About page.","examples":["Germany"]},"joined_date":{"type":["string","null"],"description":"Date the channel was created (ISO).","examples":["2016-03-14"]},"verified":{"type":"boolean","description":"`true` for a verified channel."},"links":{"type":"array","description":"Links the channel lists, each with `title` and `url`."},"emails":{"type":"array","description":"Email addresses the creator wrote into the description or the links. The business email YouTube hides behind a captcha is not read.","examples":[["kooperation@roestwerk-berlin.de"]]},"has_hidden_business_email":{"type":"boolean","description":"`true` when the About page offers a business email behind sign-in and captcha."},"website":{"type":["string","null"],"description":"First listed link that is not a social network.","examples":["https://roestwerk-berlin.de"]},"instagram_url":{"type":["string","null"],"description":"Listed Instagram profile."},"tiktok_url":{"type":["string","null"],"description":"Listed TikTok profile."},"thumbnail_url":{"type":["string","null"],"description":"Channel picture URL."},"about_page_read":{"type":"boolean","description":"`false` when the About page could not be read; links, country and emails are then missing."},"found_via":{"type":"object","description":"The `keyword` that found the channel and the `video` (`title`, `url`) it was found by."}}}},"steps_used":{"type":"integer","description":"Lookups made; the run is billed for these.","examples":[3]},"steps":{"type":"object","description":"Lookups by kind: `search`, `channel`."},"stopped_because":{"type":"string","description":"`limit_reached`, `budget_exhausted`, `time_limit`, `no_more_candidates` or `source_error` (a lookup failed after leads were found; they are kept and the failed lookup is not billed).","examples":["no_more_candidates"]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"default","label":"Default budget","credits":100,"notes":"Reserved when max_credits is not set; only the lookups made are billed."},{"tier":"step","label":"Per lookup","credits":2,"notes":"Each search page, following page, profile or channel lookup the run makes."}]}},"/api/enrichments/youtube_search":{"post":{"operationId":"enrichment_youtube_search","summary":"YouTube Channel Search","description":"Find the YouTube channels behind a search term","tags":["Discovery"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/youtube-search"},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":200,"description":"Search term as typed into YouTube, e.g. a niche plus a language word (\"kaffee rösten\").","examples":["kaffee rösten"]},"gl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Country of the search as two-letter code.","examples":["de"]},"hl":{"type":["string","null"],"minLength":2,"maxLength":2,"description":"Language of the search as two-letter code.","examples":["de"]},"page":{"type":["integer","null"],"minimum":1,"maximum":10,"description":"Result page, 1 to 10, default 1. Each page is billed on its own.","examples":[1]},"async":{"type":["boolean","null"]},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255},"custom_vars":{"type":["array","object","null"]}},"required":["query"]},"examples":{"channels_found":{"summary":"The channels behind one page of search results.","value":{"query":"kaffee rösten","gl":"de","hl":"de"}},"no_channels":{"summary":"Nothing matches. Completes with `found: false` and is not charged.","value":{"query":"qqqxxyyzz"}}}}}},"responses":{"200":{"description":"The enrichment finished while the request waited; data.output carries the result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Enrichment"},{"type":"object","properties":{"output":{"type":"object","properties":{"found":{"type":"boolean","description":"`true` when the page names at least one channel. `false` runs are not charged.","examples":[true]},"count":{"type":"integer","description":"Channels on this page.","examples":[1]},"channels":{"type":"array","description":"Channels from channel results and from the uploaders of video results, each once. Subscribers are only set where the search shows them; `youtube_channel` reads links and emails.","items":{"type":"object","properties":{"channel_id":{"type":["string","null"],"description":"Channel id (UC…); `null` when the search names only the handle."},"title":{"type":["string","null"],"description":"Channel name."},"handle":{"type":["string","null"],"description":"Handle with @."},"url":{"type":"string","description":"Channel URL."},"subscriber_count":{"type":["integer","null"],"description":"Subscribers, when the search shows them."},"matched_video":{"type":["object","null"],"description":"The video that brought the channel into the results (`title`, `url`)."}}}},"next_page":{"type":["integer","null"],"description":"Send it as `page` for more; `null` when this page was empty.","examples":[2]}}}}}]}}}}}},"202":{"description":"Queued asynchronously, or still running after the sync wait; poll GET /api/enrichments/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"x-credits":[{"tier":"found","label":"Page with channels","credits":2,"notes":"Charged when the lookup returns data."},{"tier":"not_found","label":"No result","credits":0,"notes":"No charge when nothing is found."}]}},"/api/enrichments/{id}":{"get":{"operationId":"get_api_enrichments_id","summary":"Fetch an enrichment","tags":["Enrichments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"wait","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"wait_time","in":"query","required":false,"schema":{"type":["integer","null"],"minimum":1,"maximum":3600}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/api-guide"},"responses":{"200":{"description":"The enrichment reached a terminal state.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"202":{"description":"Still queued or processing; repeat the GET with wait=true.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enrichment"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/enrichments/{type}/batch":{"post":{"operationId":"post_api_enrichments_type_batch","summary":"Create a batch of enrichments","tags":["Batches"],"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string","enum":["app_scanner","find_email_person","find_email_linkedin","find_phone_linkedin","find_phone_person","linkedin_person_profile","linkedin_people_search","linkedin_company_employees","verify_email","web_scraper","maps_search","find_cities","imprint_extractor","screenshot","icp_checker","google_search","google_ai_overview","google_ai_mode","webtraffic","linkedin_company_profile","ai_research_agent","linkedin_job","linkedin_jobs_search","indeed_jobs","stepstone_jobs","kununu_jobs","arbeitsagentur_jobs","get_company","search_company","autocomplete_company","list_company_publications","get_publication","get_company_financials","get_company_documents","get_company_owners","get_company_holdings","get_company_ubo","get_company_historical_owners","verify_company_website","extract_tax_identifiers","instagram_profile","instagram_following","instagram_followers","instagram_similar","instagram_search_accounts","instagram_hashtag_authors","instagram_location_authors","instagram_find_leads","tiktok_find_leads","tiktok_search_users","tiktok_profile","tiktok_following","youtube_find_leads","youtube_search","youtube_channel","youtube_channel_videos","google_jobs"]},"description":"One of the public enrichment types; every row runs as that type."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retries with the same key and the same body within 24 hours return the original result instead of charging twice."}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/local-scripts"},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":["array","object"],"properties":{"custom_vars":{}}}},"csv_url":{"type":"string","maxLength":2048},"mapping":{"type":["array","object","null"],"items":{"type":"string","maxLength":100},"additionalProperties":{"type":"string","maxLength":100}},"custom_vars":{},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255}}}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/registry/monitors":{"get":{"operationId":"get_api_registry_monitors","summary":"List registry monitors","tags":["Registries"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/registry-monitors"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post_api_registry_monitors","summary":"Create a registry monitor","tags":["Registries"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/registry-monitors"},"x-credits":[{"tier":"default","label":"Per monitor","credits":50,"notes":null}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject_type":{"type":"string","enum":["company"]},"company_id":{"type":"string","maxLength":64},"callback_url":{"type":"string","format":"uri","maxLength":255}},"required":["subject_type","company_id","callback_url"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/registry/monitors/{monitorId}":{"delete":{"operationId":"delete_api_registry_monitors_monitorId","summary":"Delete a registry monitor","tags":["Registries"],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/registry-monitors"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/registry/transparenzregister/credentials":{"post":{"operationId":"post_api_registry_transparenzregister_credentials","summary":"Store Transparenzregister credentials","tags":["Registries"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/transparenzregister/transparenzregister-credentials"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":64},"username":{"type":"string","maxLength":255},"password":{"type":"string","maxLength":2048},"client_id":{"type":["string","null"],"maxLength":255},"client_secret":{"type":["string","null"],"maxLength":2048}},"required":["name","username","password"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/registry/transparenzregister/extracts":{"post":{"operationId":"post_api_registry_transparenzregister_extracts","summary":"Request a Transparenzregister extract","tags":["Registries"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/transparenzregister/transparenzregister-extracts"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/registry/transparenzregister/extracts/{extractId}":{"get":{"operationId":"get_api_registry_transparenzregister_extracts_extractId","summary":"Fetch a Transparenzregister extract","tags":["Registries"],"parameters":[{"name":"extractId","in":"path","required":true,"schema":{"type":"string"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/registries/transparenzregister/transparenzregister-extracts"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/skaelreach/webhook-config":{"get":{"operationId":"get_api_skaelreach_webhook_config","summary":"Fetch the SkaelReach webhook config","tags":["SkaelReach"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/screenshot":{"post":{"operationId":"post_api_v1_screenshot","summary":"Take a website screenshot","tags":["Screenshot"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/screenshot"},"x-credits":[{"tier":"success","label":"Screenshot delivered","credits":5,"notes":"Per image, whatever the mode (viewport, full page, element or Impressum crop). A capture holds one Browserless session for about 10 to 25 seconds; the price sits at the proxy tier of the Web Scraper."},{"tier":"failed","label":"No image","credits":0,"notes":"No charge when the page could not be loaded, blocked the browser (also after one retry over a residential proxy), pointed to an internal address, exceeded the size limit, or had no Impressum block or matching element."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"viewport_breite":{"type":"integer","minimum":320,"maximum":2560},"skala":{"type":"integer","enum":[1,2]},"voll_seite":{"type":"boolean"},"selektor":{"type":["string","null"],"maxLength":500},"modus":{"type":"string","enum":["seite","impressum"]},"format":{"type":"string","enum":["png","webp"]},"timeout":{"type":"integer","minimum":5,"maximum":60},"antwort":{"type":"string","enum":["bild","json"]},"async":{"type":"boolean"}},"required":["url"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"image/png":{"schema":{"type":"string","contentMediaType":"image/png"}},"image/webp":{"schema":{"type":"string","contentMediaType":"image/webp"}},"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/v1/screenshot/{id}":{"get":{"operationId":"get_api_v1_screenshot_id","summary":"Fetch a screenshot","tags":["Screenshot"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"antwort","in":"query","required":false,"schema":{"type":"string","enum":["bild","json"]}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/enrichments/screenshot"},"responses":{"2XX":{"description":"Successful response.","content":{"image/png":{"schema":{"type":"string","contentMediaType":"image/png"}},"image/webp":{"schema":{"type":"string","contentMediaType":"image/webp"}},"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/video-campaigns":{"get":{"operationId":"get_api_video_campaigns","summary":"List video campaigns","tags":["SkaelReach"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post_api_video_campaigns","summary":"Create a video campaign","tags":["SkaelReach"],"parameters":[],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"custom_domain_id":{"type":"integer"},"theme":{"enum":["light","dark",null]},"primary_color":{"type":["string","null"]},"secondary_color":{"type":["string","null"]},"button_color":{"type":["string","null"]},"redirect_base_url":{"type":["string","null"],"format":"uri"},"redirect_param_name":{"type":["string","null"],"maxLength":50},"screenshot_mode":{"enum":["static","scroll_return","scroll_stay",null]},"screenshot_duration":{"type":["integer","null"],"minimum":5,"maximum":30},"button_text":{"type":["string","null"],"maxLength":30}},"required":["name","custom_domain_id"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/video-campaigns/{campaignId}/prospects":{"post":{"operationId":"post_api_video_campaigns_campaignId_prospects","summary":"Create Prospect","description":"Create a video prospect under a campaign. Renders a personalized screenshot and AI voice preview, returning a unique landing page URL.","tags":["SkaelReach"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/prospects/create"},"parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"screenshot_url":{"type":["string","null"],"maxLength":2048,"description":"HTTPS URL to screenshot for the personalized preview. Must start with http(s)://. Max 2048 characters."},"screenshot_urls":{"type":["array","object","null"],"description":"Optional object mapping extra screenshot slots (screenshot_2, screenshot_3) to HTTPS URLs. Each populated slot that the campaign timeline actually uses is recorded and adds its recording time to the price (max 3 screenshots total, see pricing).","properties":{"screenshot_2":{"type":["string","null"],"maxLength":2048,"description":"HTTPS URL for the second screenshot slot. Must start with http(s)://. Max 2048 characters. Its recording time counts toward the price when the campaign timeline uses this slot."},"screenshot_3":{"type":["string","null"],"maxLength":2048,"description":"HTTPS URL for the third screenshot slot. Must start with http(s)://. Max 2048 characters. Its recording time counts toward the price when the campaign timeline uses this slot."}}},"custom_params":{"type":["array","object","null"],"maxItems":20,"maxProperties":20,"description":"Key-value pairs appended to the screenshot URL as query parameters. Max 20 keys; keys must be alphanumeric + underscore.","items":{"type":"string","maxLength":255,"description":"Each custom_params value must be a string up to 255 characters."},"additionalProperties":{"type":"string","maxLength":255,"description":"Each custom_params value must be a string up to 255 characters."}},"async":{"type":["boolean","null"],"description":"When true, returns 202 immediately instead of waiting for the render to complete."},"callback_url":{"type":["string","null"],"format":"uri","maxLength":255,"description":"HTTPS webhook URL invoked when the prospect render finishes. Requires async=true. Max 255 characters."},"email":{"type":["string","null"],"format":"email","maxLength":255,"description":"Prospect email. Used for deduplication and display. Lower-cased on save."},"first_name":{"type":["string","null"],"maxLength":255,"description":"Prospect first name; falls back to custom_vars.first_name if absent."},"last_name":{"type":["string","null"],"maxLength":255,"description":"Prospect last name; falls back to custom_vars.last_name if absent."},"company":{"type":["string","null"],"maxLength":255,"description":"Prospect company name; falls back to custom_vars.company if absent."},"domain":{"type":["string","null"],"maxLength":255,"description":"Prospect company domain (normalized). Used for domain-level deduplication."},"dedupe_value":{"type":["string","null"],"maxLength":255,"description":"Free-form deduplication key (any string up to 255 chars). Combined with the dedup.dedupe_value flags below."},"phone":{"type":["string","null"],"maxLength":50,"description":"Prospect phone number (normalized, E.164 when possible)."},"dedup_campaign":{"type":["boolean","null"],"description":"Legacy: when true, skip if a prospect with the same email already exists in this campaign."},"dedup_organization":{"type":["boolean","null"],"description":"Legacy: when true, skip if a prospect with the same email already exists in any campaign of the organization."},"dedup":{"type":["array","object","null"],"description":"Structured deduplication rules per attribute (email, domain, url, dedupe_value).","properties":{"email":{"type":["array","object","null"],"description":"Deduplication scope for the email attribute.","properties":{"campaign":{"type":["boolean","null"],"description":"Skip if email already exists in this campaign."},"organization":{"type":["boolean","null"],"description":"Skip if email already exists in any campaign of the organization."}}},"domain":{"type":["array","object","null"],"description":"Deduplication scope for the domain attribute.","properties":{"campaign":{"type":["boolean","null"],"description":"Skip if domain already exists in this campaign."},"organization":{"type":["boolean","null"],"description":"Skip if domain already exists in any campaign of the organization."}}},"url":{"type":["array","object","null"],"description":"Deduplication scope for the screenshot_url attribute.","properties":{"campaign":{"type":["boolean","null"],"description":"Skip if screenshot_url already exists in this campaign."},"organization":{"type":["boolean","null"],"description":"Skip if screenshot_url already exists in any campaign of the organization."}}},"dedupe_value":{"type":["array","object","null"],"description":"Deduplication scope for the dedupe_value attribute.","properties":{"campaign":{"type":["boolean","null"],"description":"Skip if dedupe_value already exists in this campaign."},"organization":{"type":["boolean","null"],"description":"Skip if dedupe_value already exists in any campaign of the organization."}}}}},"custom_vars":{"type":["array","object","null"],"description":"Customer-supplied metadata that flows through to webhooks and landing-page templates. Max 50 keys, 2KB total, values up to 500 chars."}}},"examples":{"Sync_minimal":{"summary":"Create a prospect with just a screenshot URL and wait for the render to complete. campaign_id is the path parameter (not a body field) — the playground extracts it before POSTing.","value":{"campaign_id":42,"screenshot_url":"https://example.com/landing-page"}},"Async_with_webhook":{"summary":"Queue the prospect render and receive the result via webhook. Useful for Zapier / Make flows where custom_vars track external IDs.","value":{"campaign_id":42,"screenshot_url":"https://example.com/landing-page","screenshot_urls":{"screenshot_2":"https://example.com/pricing"},"email":"john@acme.com","async":true,"callback_url":"https://your-app.com/webhooks/skaelreach","custom_vars":{"external_id":"lead_8712","first_name":"John","company":"Acme Corp"}}}}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}},"x-credits":[{"tier":"from_0","label":"From 0 videos in the last 60 days","credits":110,"notes":"110 credits per video up to 2 minutes long, +55 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."},{"tier":"from_1000","label":"From 1,000 videos in the last 60 days","credits":80,"notes":"80 credits per video up to 2 minutes long, +40 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."},{"tier":"from_2000","label":"From 2,000 videos in the last 60 days","credits":70,"notes":"70 credits per video up to 2 minutes long, +35 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."},{"tier":"from_4000","label":"From 4,000 videos in the last 60 days","credits":65,"notes":"65 credits per video up to 2 minutes long, +32 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."},{"tier":"from_10000","label":"From 10,000 videos in the last 60 days","credits":55,"notes":"55 credits per video up to 2 minutes long, +27 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."},{"tier":"from_14000","label":"From 14,000 videos in the last 60 days","credits":40,"notes":"40 credits per video up to 2 minutes long, +20 credits per further started minute. Every rendered video counts toward the tier for 60 days. Reserved on creation; refunded if rendering fails or a screenshot capture fails."}]}},"/api/video-campaigns/{id}":{"get":{"operationId":"get_api_video_campaigns_id","summary":"Fetch a video campaign","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}},"put":{"operationId":"put_api_video_campaigns_id","summary":"Update a video campaign","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"custom_domain_id":{"type":["integer","null"]},"theme":{"enum":["light","dark",null]},"primary_color":{"type":["string","null"]},"secondary_color":{"type":["string","null"]},"button_color":{"type":["string","null"]},"redirect_base_url":{"type":["string","null"],"format":"uri"},"redirect_param_name":{"type":["string","null"],"maxLength":50},"screenshot_mode":{"enum":["static","scroll_return","scroll_stay",null]},"screenshot_duration":{"type":["integer","null"],"minimum":5,"maximum":30},"button_text":{"type":["string","null"],"maxLength":30}}}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/video-campaigns/{id}/confirm-upload":{"post":{"operationId":"post_api_video_campaigns_id_confirm_upload","summary":"Confirm an uploaded asset","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"enum":["recording","face_recording","thumbnail"]},"path":{"type":"string"}},"required":["type","path"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/video-campaigns/{id}/pause":{"post":{"operationId":"post_api_video_campaigns_id_pause","summary":"Pause a video campaign","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/video-campaigns/{id}/resume":{"post":{"operationId":"post_api_video_campaigns_id_resume","summary":"Resume a video campaign","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/video-campaigns/{id}/upload-url":{"post":{"operationId":"post_api_video_campaigns_id_upload_url","summary":"Create a presigned upload URL","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"enum":["recording","face_recording","thumbnail"]},"filename":{"type":"string"}},"required":["type","filename"]}}}},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/api/video-campaigns/{id}/viewers":{"get":{"operationId":"get_api_video_campaigns_id_viewers","summary":"List video campaign viewers","tags":["SkaelReach"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/webhooks"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/video-prospects":{"get":{"operationId":"get_api_video_prospects","summary":"List Prospects","description":"Paginate video prospects for the authenticated organization. Returns an opaque cursor, filterable by campaign, email, LinkedIn URL, external_id, or status. Use this to reconcile state from a CRM, build dedup lookups, or drive admin UIs.","tags":["SkaelReach"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/prospects/list"},"parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"type":["integer","null"],"description":"Restrict results to a single campaign. Must belong to the authenticated organization."}},{"name":"email","in":"query","required":false,"schema":{"type":["string","null"],"format":"email","maxLength":255,"description":"Exact-match filter on the normalized email address (lower-cased server-side)."}},{"name":"linkedin_url","in":"query","required":false,"schema":{"type":["string","null"],"format":"uri","maxLength":2048,"description":"Exact-match filter on the canonical LinkedIn URL stored in custom_vars.linkedin_url. Normalized server-side."}},{"name":"external_id","in":"query","required":false,"schema":{"type":["string","null"],"maxLength":255,"description":"Exact-match filter on custom_vars.external_id. Typically used to reconcile prospects with an external CRM record."}},{"name":"status","in":"query","required":false,"schema":{"type":["string","null"],"enum":["queued","processing","ready","failed","pending_credits",null],"description":"Filter by lifecycle status: queued, processing, ready, failed, or pending_credits."}},{"name":"limit","in":"query","required":false,"schema":{"type":["integer","null"],"minimum":1,"maximum":100,"description":"Page size, 1..100. Defaults to 25."}},{"name":"cursor","in":"query","required":false,"schema":{"type":["string","null"],"maxLength":512,"description":"Opaque pagination cursor from a previous response.next_cursor. Pass verbatim to fetch the next page."}}],"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/video-prospects/{id}":{"get":{"operationId":"get_api_video_prospects_id","summary":"Show Prospect","description":"Look up a video prospect by ID. Returns the full prospect resource including render status, landing-page URL, and any custom variables. Supports long-polling so you can wait for an in-flight render to finish in a single request.","tags":["SkaelReach"],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/skaelreach/prospects/show"},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"wait","in":"query","required":false,"schema":{"type":["boolean","null"],"description":"When true, long-poll until the prospect reaches a terminal state (ready or failed) or the wait_time elapses."}},{"name":"wait_time","in":"query","required":false,"schema":{"type":["integer","null"],"minimum":1,"maximum":3600,"description":"Maximum seconds to wait for terminal state when wait=true. Defaults to the standard polling window; capped server-side."}}],"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/workflows/{type}":{"post":{"operationId":"post_api_workflows_type","summary":"Run a shared workflow","tags":["Workflows"],"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"}}],"externalDocs":{"description":"Documentation","url":"https://api.skael.de/docs/workflows/example-ping"},"responses":{"2XX":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"default":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"eak_…","description":"API key from the dashboard, sent as Authorization: Bearer eak_…"}},"schemas":{"Error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"ValidationError":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["message"]},"Enrichment":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string"},"status":{"type":"string","enum":["queued","processing","waiting","completed","failed","timeout"]},"input":{},"output":{},"custom_vars":{"type":["object","null"]},"message":{"type":"string"},"callback_url":{"type":["string","null"]},"error_message":{"type":["string","null"]},"credits_cost":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"queued_at":{"type":"string","format":"date-time"},"started_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","type","status"]}},"responses":{"Unauthorized":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InsufficientCredits":{"description":"The organization has not enough credits for this request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationFailed":{"description":"The request body did not pass validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"NotFound":{"description":"The resource does not exist or belongs to another organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"The rate limit for this endpoint is reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}