{
  "openapi": "3.1.0",
  "info": {
    "title": "SocialCrawl API: Jobs",
    "version": "1.0.0",
    "description": "Unified social media data API - one API key, one consistent response format, 69 platforms, 679 endpoints. Power AI agents with clean social data.\n\nThis document covers the Jobs endpoints only (11 operations). The full contract for every platform is at https://www.socialcrawl.dev/v1/openapi.json, and every per-platform document is listed at https://www.socialcrawl.dev/openapi/index.json.",
    "contact": {
      "name": "SocialCrawl",
      "url": "https://www.socialcrawl.dev",
      "email": "socialcrawl@ridio.io"
    }
  },
  "servers": [
    {
      "url": "https://www.socialcrawl.dev/v1",
      "description": "Production"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    },
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "API key authentication. Send your key in the `x-api-key` request header on every call. Create and manage keys in the dashboard."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "The same API key sent as `Authorization: Bearer <key>`, the default in most agents and HTTP tools. Same key, same rules; when both headers are sent, `x-api-key` wins."
      }
    },
    "schemas": {
      "ErrorEnvelope": {
        "type": "object",
        "description": "Unified error response envelope. Every 4xx/5xx response returns this shape; `error.type` is a machine-readable code from the API's error catalog.",
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              false
            ],
            "example": false,
            "description": "Always false on an error response."
          },
          "error": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "MISSING_API_KEY",
                  "INVALID_API_KEY",
                  "INSUFFICIENT_CREDITS",
                  "INVALID_REQUEST",
                  "ENDPOINT_NOT_FOUND",
                  "RESOURCE_NOT_FOUND",
                  "CONCURRENCY_LIMIT",
                  "UPSTREAM_ERROR",
                  "SERVICE_UNAVAILABLE",
                  "INTERNAL_ERROR",
                  "METHOD_NOT_ALLOWED",
                  "IDEMPOTENCY_KEY_CONFLICT",
                  "IDEMPOTENCY_IN_PROGRESS",
                  "IDEMPOTENCY_REPLAY_UNAVAILABLE",
                  "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                  "COHORT_MEMBER_LIMIT_EXCEEDED",
                  "COHORT_LIMIT_EXCEEDED",
                  "COHORT_IDENTITY_PLATFORM_UNSUPPORTED",
                  "COHORT_IDENTITY_CONFLICT",
                  "COHORT_QUERY_NOT_CANCELLABLE",
                  "COHORT_QUERY_NOT_READY",
                  "COHORT_RESULT_TOO_LARGE",
                  "PAYLOAD_TOO_LARGE",
                  "RATE_LIMITED",
                  "KEY_BUDGET_EXCEEDED",
                  "RUN_NOT_FOUND",
                  "RUN_STATE_CONFLICT",
                  "RUN_EXPIRED",
                  "NEEDS_ASYNC",
                  "CURSOR_EXPIRED",
                  "SCHEDULE_NOT_FOUND",
                  "STREAM_NOT_FOUND",
                  "STREAM_STATE_CONFLICT"
                ],
                "example": "INVALID_REQUEST",
                "description": "Machine-readable error code. The per-status `x-error-codes` list on each response narrows which codes that status can carry."
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation of the error."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code, echoed in the body."
              },
              "doc_url": {
                "type": "string",
                "description": "Link to the docs page for this error code."
              },
              "retryable": {
                "type": "boolean",
                "description": "Whether retrying the identical request can succeed. True for rate limits, concurrency limits, idempotency contention and transient upstream or server failures; false for every other code, including both 402s."
              },
              "details": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": true,
                "description": "Optional structured context. Omitted on ordinary errors. Both 402s carry `reason` (`balance_too_low` or `key_budget_reached`), `retry_will_succeed: false`, a one-sentence `next_step`, and `top_up_url` or `key_settings_url`; the GET endpoints add `credits_required`; a metered endpoint adds `pricing` (`\"ceiling\"` when the hold is the most the call can cost and the unused part is refunded, `\"exact\"` when the call is charged what it holds; measured on recent production calls), `credits_typical` (on a ceiling, what a call like this is usually charged), and, when a cheaper shape of the same request exists, `lower_cost_with`, `lower_cost_options` (`param`, `value` or null to leave it out, and `credits_required` with that change) and `credits_required_cheapest`. A `max_credits` page that switched to a cheaper form to fit (`threads/search` with `expand=false`) and still found the balance short adds `balance_fallback`: the `param` and `value` it switched to, and `credits_required` for the call as sent. A page-cap rejection carries `reason: \"page_limit\"` with `max_page`, `requested_page` and `narrow_with`. An `INVALID_REQUEST` that sends no member of a required one-of group carries `fields` (the parameters of that group) and a one-sentence `next_step`. Other endpoints use it for their own taxonomies, such as the comment-lookup not-found reasons."
              },
              "status_url": {
                "type": "string",
                "format": "uri",
                "description": "Present on 5xx responses: the public status page, filtered to the platform when one is known."
              },
              "incident": {
                "type": "object",
                "description": "Present on a 5xx response when an open public incident explains the failure.",
                "properties": {
                  "id": {
                    "type": "string",
                    "example": "k3v9w2m8q1zt"
                  },
                  "title": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string",
                    "example": "investigating"
                  },
                  "impact": {
                    "type": "string",
                    "example": "major"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "required": [
                  "id",
                  "title",
                  "status",
                  "impact",
                  "url"
                ]
              }
            },
            "required": [
              "type",
              "message",
              "status",
              "doc_url"
            ]
          },
          "credits_used": {
            "type": "integer",
            "description": "Net credits charged for this request. Error paths deduct-then-refund, so this is 0 in almost every case; a partial-coverage composite may keep the succeeded-leg cost."
          },
          "credits_remaining": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Credits left after this request when established. Some unauthenticated errors use null; on a prebilling route whose attempted balance lookup fails, this field is omitted instead of fabricated."
          },
          "request_id": {
            "type": "string",
            "description": "Unique request identifier - matches the X-Request-Id header. Quote it in support requests."
          }
        },
        "required": [
          "success",
          "error",
          "credits_used",
          "request_id"
        ]
      },
      "MonitorAlertRule": {
        "description": "A numeric condition evaluated against a monitor run and, for change operators, a previous comparable run.",
        "properties": {
          "metric": {
            "description": "Dot path to a numeric key in the recipe's own result, for example `coverage` or `summary.total`. On a numbers-only monitor (created with `track`) the metric must be one of `track.metrics`, and an `items[].<path>` metric is evaluated once per row: a fired alert then carries `row_id`. The special metric `rows_new` (numbers-only monitors only; it needs an `items[].` metric in `track.metrics` and is not itself tracked) counts the list rows this run has that the previous run did not: `{\"metric\":\"rows_new\",\"op\":\"gt\",\"value\":0}` alerts on any new post or video. It accepts only `gt` and `gte`, and is skipped on the first run. \"New\" means absent from the previous successful run's stored rows (capped at `max_rows`, default 100), so a row that drops off and returns later counts as new again. An empty-page run is refunded and is not a baseline, so on a sparse feed the first run that holds rows has no baseline and stays silent: the first new post after a quiet period may not alert. Use a daily cadence or leave `max_rows` headroom.",
            "type": "string"
          },
          "op": {
            "enum": [
              "gt",
              "lt",
              "gte",
              "lte",
              "abs_change_gt",
              "pct_change_gt",
              "pct_change_lt"
            ],
            "type": "string"
          },
          "value": {
            "type": "number"
          },
          "window": {
            "description": "Accepted and stored, but ignored: a change op always compares against the immediately preceding comparable run, whatever the value.",
            "enum": [
              "1d",
              "1w"
            ],
            "type": "string"
          }
        },
        "required": [
          "metric",
          "op",
          "value"
        ],
        "type": "object"
      },
      "EventEnvelope": {
        "description": "One event, identical in the feed and in every webhook batch. `id` is stable for one fact, so deduplicate on it.",
        "properties": {
          "id": {
            "description": "Deterministic event id: the same fact never mints a second event.",
            "example": "evt_k3m7q2xwcbvd4nph6trz5ycgda",
            "type": "string"
          },
          "type": {
            "description": "Dot-delimited lower-case type. Types written today: `discover.progress`, `discover.accounts_ready`, `discover.completed`, `discover.partial`, `discover.paused`, `discover.failed`, `discover.new_rows`, `discover.new_accounts`, `discover.new_items`, `discover.run_skipped`, `discover.run_failed`, `endpoint.disabled`, `mention.created`, `mention.deleted`, `stream.baseline.established`, `stream.coverage_gap`, `stream.paused`, `stream.resumed`, `stream.deleted`, `stream.budget.warning`, `stream.health`.",
            "example": "discover.completed",
            "type": "string"
          },
          "api_version": {
            "example": "2026-10-01",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "cursor": {
            "description": "The feed position right after this event. Send it as `cursor` to read what came after; an event id works too.",
            "example": "c_MS4xMi4xNzkyNDA0OTA0",
            "type": "string"
          },
          "subject": {
            "description": "The object the event is about, for example `{ kind: \"discover_run\", id: \"run_…\" }`.",
            "properties": {
              "id": {
                "type": "string"
              },
              "kind": {
                "type": "string"
              },
              "metadata": {
                "type": [
                  "object",
                  "null"
                ]
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "kind",
              "id"
            ],
            "type": [
              "object",
              "null"
            ]
          },
          "data": {
            "description": "The event's facts. Discover events carry counts and ids, never keywords or row text.",
            "type": "object"
          },
          "links": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Absolute URLs to the subject, such as `run` and `results` (for example `https://www.socialcrawl.dev/v1/prism/discover/runs/run_...`), the same in the feed and in webhook batches. Events served before 26/10/2026 carried relative paths.",
            "type": "object"
          }
        },
        "required": [
          "id",
          "type",
          "api_version",
          "created_at",
          "cursor",
          "subject",
          "data",
          "links"
        ],
        "type": "object"
      },
      "WebhookEndpoint": {
        "description": "A registered receiver. The signing secret is never part of it: it is returned once, by create and by rotate-secret.",
        "properties": {
          "id": {
            "example": "we_V1StGXR8Z5jdHi6BmyT",
            "type": "string"
          },
          "url": {
            "example": "https://example.com/hooks/socialcrawl",
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "types": {
            "description": "Subscribed event types: exact types, `ns.*` wildcards, or `*` for every type.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "subject_ids": {
            "description": "Only events about these subjects (a run or schedule id); null for every subject.",
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "status": {
            "enum": [
              "enabled",
              "disabled"
            ],
            "type": "string"
          },
          "disabled_reason": {
            "description": "`gone` (the receiver answered 410), `failing` (5 consecutive days of failed deliveries), `key_revoked` (the creating key was revoked or deleted) or `user` (set with PATCH). Null while enabled.",
            "enum": [
              "gone",
              "failing",
              "key_revoked",
              "user",
              null
            ],
            "type": [
              "string",
              "null"
            ]
          },
          "failing_since": {
            "description": "Start of the current run of failed deliveries; null while healthy.",
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "api_version": {
            "example": "2026-10-01",
            "type": "string"
          },
          "secret_rotation": {
            "description": "Set during a rotation: until `previous_secret_expires_at` every delivery is signed with both secrets.",
            "properties": {
              "previous_secret_expires_at": {
                "format": "date-time",
                "type": "string"
              }
            },
            "type": [
              "object",
              "null"
            ]
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "next": {
            "description": "Ready relative URLs for the next calls.",
            "properties": {
              "attempts_url": {
                "type": "string"
              },
              "events_url": {
                "type": "string"
              },
              "rotate_secret_url": {
                "type": "string"
              },
              "self_url": {
                "type": "string"
              },
              "test_url": {
                "type": "string"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "id",
          "url",
          "types",
          "status",
          "api_version",
          "created_at"
        ],
        "type": "object"
      },
      "WebhookAttempt": {
        "description": "One delivery attempt. `response_excerpt` is at most 1 KB of your receiver's answer.",
        "properties": {
          "id": {
            "type": "string"
          },
          "delivery_id": {
            "description": "The batch's `webhook-id`, the same on every retry.",
            "type": "string"
          },
          "test": {
            "type": "boolean"
          },
          "status": {
            "description": "Your receiver's HTTP status; null for a timeout, a refused host, a network error or a secret that could not be opened.",
            "type": [
              "integer",
              "null"
            ]
          },
          "outcome": {
            "enum": [
              "delivered",
              "failed",
              "gone",
              "retry_after",
              "timeout",
              "redirect",
              "refused_host",
              "secret_unavailable",
              "network_error"
            ],
            "type": "string"
          },
          "duration_ms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "response_excerpt": {
            "type": [
              "string",
              "null"
            ]
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "delivery_id",
          "test",
          "status",
          "outcome",
          "created_at"
        ],
        "type": "object"
      },
      "EventBatch": {
        "description": "What every delivery carries, also for one event: at most 100 events or 256 KB. Each inner event keeps its own `id` and `cursor`; deduplicate on the inner ids. A test send marks its event `\"test\": true` with `\"cursor\": null`.",
        "properties": {
          "id": {
            "example": "bat_V1StGXR8Z5jdHi6BmyT",
            "type": "string"
          },
          "type": {
            "const": "event.batch",
            "type": "string"
          },
          "data": {
            "properties": {
              "events": {
                "items": {
                  "$ref": "#/components/schemas/EventEnvelope"
                },
                "maxItems": 100,
                "type": "array"
              }
            },
            "required": [
              "events"
            ],
            "type": "object"
          }
        },
        "required": [
          "id",
          "type",
          "data"
        ],
        "type": "object"
      },
      "ListeningRuleAst": {
        "description": "A rule as a tree of `and`, `or`, `not`, `term`, `phrase` and `field` nodes, as the dry run returns it in `data.stream.groups[].ast`.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "and": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ListeningRuleAst"
                }
              }
            },
            "required": [
              "and"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "or": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ListeningRuleAst"
                }
              }
            },
            "required": [
              "or"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "not": {
                "$ref": "#/components/schemas/ListeningRuleAst"
              }
            },
            "required": [
              "not"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "term": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "term"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "phrase": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "phrase"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "field": {
                "type": "string",
                "enum": [
                  "lang",
                  "country",
                  "platform",
                  "site",
                  "community"
                ]
              },
              "value": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "field",
              "value"
            ],
            "additionalProperties": false
          }
        ]
      }
    }
  },
  "tags": [
    {
      "name": "jobs",
      "description": "Jobs endpoints"
    }
  ],
  "paths": {
    "/jobs/linkedin/search": {
      "get": {
        "summary": "Search LinkedIn job listings",
        "description": "Returns LinkedIn job listings matching a keyword and optional location, date, employment type, experience, workplace, or company-id filters. Each row has job id, title, company, location, posting date, and listing URL. Pass an id to GET /v1/jobs/linkedin for the full description. Page 2 with the cursor from page 1.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_linkedin_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "premium",
        "x-credit-cost": 10,
        "x-socialcrawl-oneOf": [
          [
            "query",
            "cursor"
          ]
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Keywords, job title, or company name. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "software engineer"
          },
          {
            "name": "location",
            "in": "query",
            "required": false,
            "description": "City or country. Defaults to worldwide when omitted.",
            "schema": {
              "type": "string"
            },
            "example": "United States"
          },
          {
            "name": "organization_ids",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated LinkedIn organization ids from GET /v1/jobs/linkedin/organizations.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Maximum age: month, week, or day.",
            "schema": {
              "type": "string",
              "enum": [
                "month",
                "week",
                "day"
              ]
            },
            "example": "week"
          },
          {
            "name": "employment_types",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: contractor, fulltime, parttime, intern, temporary.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "experience_levels",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: intern, entry, associate, midSenior, director.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "workplace_types",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: remote, hybrid, onSite.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from the previous page. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 120 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 120
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/linkedin/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical job wrappers ({ job })",
                          "items": {
                            "type": "object",
                            "description": "Canonical job wrapper",
                            "properties": {
                              "job": {
                                "type": "object",
                                "description": "Nested object: job",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "String at job.id"
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.url"
                                  },
                                  "company": {
                                    "type": "object",
                                    "description": "Nested object: job.company",
                                    "properties": {
                                      "id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.id"
                                      },
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.name"
                                      },
                                      "url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.url"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.company.verified"
                                      }
                                    }
                                  },
                                  "location": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.location"
                                  },
                                  "listed_at": {
                                    "type": [
                                      "string",
                                      "number",
                                      "null"
                                    ],
                                    "description": "Union: string | number | null"
                                  },
                                  "easy_apply": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Boolean at job.easy_apply"
                                  },
                                  "remote": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.remote"
                                  },
                                  "employment_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.employment_type"
                                  },
                                  "experience_level": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.experience_level"
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.description"
                                  },
                                  "apply_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.apply_url"
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: job.ext",
                                    "properties": {
                                      "is_promote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.is_promote"
                                      },
                                      "applicant_count": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.applicant_count"
                                      },
                                      "skills": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at job.ext.skills",
                                        "items": {
                                          "type": "string",
                                          "description": "String at job.ext.skills"
                                        }
                                      },
                                      "job_provider": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_provider"
                                      },
                                      "salary_min": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_min"
                                      },
                                      "salary_max": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_max"
                                      },
                                      "salary_currency": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.salary_currency"
                                      },
                                      "country_code": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.country_code"
                                      },
                                      "linkedin_company_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.linkedin_company_name"
                                      },
                                      "industries": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.industries"
                                      },
                                      "job_function": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_function"
                                      },
                                      "accepting_applications": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.accepting_applications"
                                      },
                                      "board": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.board"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "walk": {
                          "type": "object",
                          "description": "Present when the request sent a row-walk param (`max_pages` above 1, `max_items`, `max_credits`, a row filter, `sort_rows` or `seen`). What the walk did across the pages it fetched. Each page is billed as one call, and its charge is recorded under its own request id.",
                          "properties": {
                            "pages": {
                              "type": "integer",
                              "description": "Pages fetched.",
                              "example": 3
                            },
                            "stopped": {
                              "type": "string",
                              "enum": [
                                "end",
                                "max_pages",
                                "max_items",
                                "max_credits",
                                "time_budget",
                                "page_error"
                              ],
                              "description": "Why the walk stopped. `end`: the list ran out. `max_pages`, `max_items` or `max_credits`: the limit you set was reached. `time_budget`: the request's time budget ran low. `page_error`: a later page failed. Unless it is `end`, `pagination.next_cursor` continues from where the walk stopped.",
                              "example": "max_pages"
                            },
                            "rows_fetched": {
                              "type": "integer",
                              "description": "Rows read across every page, before any filter.",
                              "example": 60
                            },
                            "rows_returned": {
                              "type": "integer",
                              "description": "Rows in `data.items`.",
                              "example": 41
                            },
                            "discarded": {
                              "type": "object",
                              "description": "Present when you sent a row filter. Rows the filters removed, counted once each under the first filter they failed. A row a filter cannot verify (no view count, no date, no country) is discarded.",
                              "properties": {
                                "views_below_min": {
                                  "type": "integer",
                                  "description": "Rows with fewer views than `min_views`."
                                },
                                "views_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no view count, when `min_views` was sent."
                                },
                                "older_than_max_age": {
                                  "type": "integer",
                                  "description": "Rows published before the `max_age_days` window."
                                },
                                "date_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no publish date, when `max_age_days` was sent."
                                },
                                "country_not_included": {
                                  "type": "integer",
                                  "description": "Rows registered to a country that is not in `country`."
                                },
                                "country_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no country, when `country` was sent."
                                },
                                "country_excluded": {
                                  "type": "integer",
                                  "description": "Rows registered to a country listed in `exclude_country`."
                                }
                              }
                            },
                            "repeats": {
                              "type": "integer",
                              "description": "Present when you sent `seen`: rows removed because your account already received them under that id."
                            },
                            "duplicates": {
                              "type": "integer",
                              "description": "Present when above zero: rows a later page repeated from an earlier page of the same walk, kept once."
                            },
                            "credits": {
                              "type": "object",
                              "description": "What the pages cost.",
                              "properties": {
                                "pages": {
                                  "type": "integer",
                                  "description": "Credits charged for the pages walked, before refunds."
                                },
                                "refunded": {
                                  "type": "integer",
                                  "description": "Credits refunded across the pages."
                                }
                              }
                            },
                            "request_ids": {
                              "type": "array",
                              "description": "The request id of each page walked. Each is its own entry in `GET /v1/credits/transactions`.",
                              "items": {
                                "type": "string",
                                "description": "A row id."
                              }
                            }
                          }
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/linkedin/search",
                  "data": {
                    "items": [
                      {
                        "job": {
                          "id": "4471288751",
                          "title": "Software Engineer III (Java/AWS)",
                          "url": "https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4471288751",
                          "company": {
                            "id": null,
                            "name": "JPMorganChase",
                            "url": "https://www.linkedin.com/company/jpmorganchase",
                            "verified": null
                          },
                          "location": "Columbus, OH",
                          "listed_at": "2026-09-29",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": null,
                          "experience_level": null,
                          "description": null,
                          "apply_url": "https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4471288751",
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": null,
                            "linkedin_company_name": "jpmorganchase",
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "linkedin"
                          }
                        }
                      },
                      {
                        "job": {
                          "id": "4443948088",
                          "title": "Senior Backend Software Engineer - GM Energy",
                          "url": "https://www.linkedin.com/jobs/view/senior-backend-software-engineer-gm-energy-at-general-motors-4443948088",
                          "company": {
                            "id": null,
                            "name": "General Motors",
                            "url": "https://www.linkedin.com/company/general-motors",
                            "verified": null
                          },
                          "location": "Warren, MI",
                          "listed_at": "2026-09-26",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": null,
                          "experience_level": null,
                          "description": null,
                          "apply_url": "https://www.linkedin.com/jobs/view/senior-backend-software-engineer-gm-energy-at-general-motors-4443948088",
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": null,
                            "linkedin_company_name": "general-motors",
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "linkedin"
                          }
                        }
                      }
                    ],
                    "next_cursor": "dD0xMDtxPXNvZnR3YXJlIGVuZ2luZWVyO2w9VW5pdGVkIFN0YXRlcztkcD13ZWVrO2V0PTtlbD07d3Q9O3A9MTtvaT0=",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 10,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoiZEQweE1EdHhQWE52Wm5SM1lYSmxJR1Z1WjJsdVpXVnlPMnc5Vlc1cGRHVmtJRk4wWVhSbGN6dGtjRDEzWldWck8yVjBQVHRsYkQwN2QzUTlPM0E5TVR0dmFUMD0iLCJlIjoiam9icy9saW5rZWRpbi9zZWFyY2giLCJwIjoiY3Vyc29yIn0",
                    "has_more": true,
                    "page_size": 10
                  },
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/linkedin": {
      "get": {
        "summary": "Get a LinkedIn job listing by id",
        "description": "Returns one LinkedIn job: title, company, location, employment type, seniority, applicant count, description, and listing URL. Use an id from GET /v1/jobs/linkedin/search.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_linkedin",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "advanced",
        "x-credit-cost": 5,
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Numeric LinkedIn job id from linkedin/search.",
            "schema": {
              "type": "string"
            },
            "example": "4460359588"
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 600 seconds old is served; this endpoint keeps copies for 3600 seconds, so a value up to 3600 can save a call. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3600
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/linkedin"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "job": {
                          "type": "object",
                          "description": "Nested object: job",
                          "properties": {
                            "id": {
                              "type": "string",
                              "description": "String at job.id"
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.title"
                            },
                            "url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.url"
                            },
                            "company": {
                              "type": "object",
                              "description": "Nested object: job.company",
                              "properties": {
                                "id": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.id"
                                },
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.name"
                                },
                                "url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.url"
                                },
                                "verified": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.company.verified"
                                }
                              }
                            },
                            "location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.location"
                            },
                            "listed_at": {
                              "type": [
                                "string",
                                "number",
                                "null"
                              ],
                              "description": "Union: string | number | null"
                            },
                            "easy_apply": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at job.easy_apply"
                            },
                            "remote": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.remote"
                            },
                            "employment_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.employment_type"
                            },
                            "experience_level": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.experience_level"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.description"
                            },
                            "apply_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.apply_url"
                            },
                            "ext": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: job.ext",
                              "properties": {
                                "is_promote": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.is_promote"
                                },
                                "applicant_count": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.applicant_count"
                                },
                                "skills": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at job.ext.skills",
                                  "items": {
                                    "type": "string",
                                    "description": "String at job.ext.skills"
                                  }
                                },
                                "job_provider": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_provider"
                                },
                                "salary_min": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_min"
                                },
                                "salary_max": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_max"
                                },
                                "salary_currency": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.salary_currency"
                                },
                                "country_code": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.country_code"
                                },
                                "linkedin_company_name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.linkedin_company_name"
                                },
                                "industries": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.industries"
                                },
                                "job_function": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_function"
                                },
                                "accepting_applications": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.accepting_applications"
                                },
                                "board": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.board"
                                }
                              }
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "job"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/linkedin",
                  "data": {
                    "job": {
                      "id": "4460359588",
                      "title": "Software Engineer II (Java/AWS)",
                      "url": "https://www.linkedin.com/jobs/view/software-engineer-ii-java-aws-at-jpmorganchase-4460359588",
                      "company": {
                        "id": null,
                        "name": "JPMorganChase",
                        "url": "https://www.linkedin.com/company/jpmorganchase",
                        "verified": null
                      },
                      "location": "New York, NY",
                      "listed_at": "2 weeks ago",
                      "easy_apply": null,
                      "remote": null,
                      "employment_type": "Full-time",
                      "experience_level": "Not Applicable",
                      "description": "Job DescriptionYou're ready to gain the skills and experience needed to grow within your role and advance your career — and we have the perfect software engineering opportunity for you.As a Software Engineer II at JPMorganChase within the Trust & Security Team, you are part of an agile team that works to enhance, design, and deliver the software components of the firm's state-of-the-art technology products in a secure, stable, and scalable way. As an emerging member of a software engineering team, you execute software solutions through the design, development, and technical troubleshooting of multiple components within a technical product, application, or system, while gaining the skills and experience needed to grow within your role.Job ResponsibilitiesExecutes standard software solutions, design, development, and technical troubleshootingLeverages enterprise-authorized AI coding assist tools within the work environment to improve code quality, delivery speed, and productivity (e.g., code generation/refactoring, unit test creation, documentation), while validating outputs through peer review, automated testing, and secure coding standards.Designs, develops, codes, and troubleshoots with consideration of upstream and downstream systems and technical implicationsApplies knowledge of tools within the Software Development Life Cycle toolchain, including enterprise-authorized AI-assisted development and automation capabilities, to improve the value realized by automationApplies technical troubleshooting to break down solutions and solve technical problems of basic complexityGathers, analyzes, and draws conclusions from large, diverse data sets to identify problems and contribute to decision-making in service of secure, stable application developmentLearns and applies system processes, methodologies, and skills for the development of secure, stable code and systemsAdds to team culture of diversity, opportunity, inclusion, and respectRequired Qualifications, Capabilities, And SkillsFormal training or certification in software engineering and 2+ years of relevant experience.Hands-on practical experience in system design, application development, testing, and operational stabilityExperience in developing, debugging, and maintaining code in a large corporate environment with one or more modern programming languages and database querying languagesHands-on experience using enterprise-authorized AI-assisted software development tools within the work environment (e.g., for coding, testing, troubleshooting, or documentation) with demonstrated ability to critically evaluate and validate AI-generated outputs.Understanding of responsible AI use in engineering workflows, including data sensitivity considerations, secure handling of inputs/outputs, and adherence to resiliency and security expectations.Practical experience with Java, J2EE, Spring Boot, RESTful APIs, and microservicesExperience with AWSExperience across the whole Software Development Life CycleExposure to agile methodologies such as CI/CD, Application Resiliency, and SecurityPreferred Qualifications, Capabilities, And SkillsFamiliarity with modern front-end technologiesExperience with event-driven architectureABOUT USChase is a leading financial services firm, helping nearly half of America's households and small businesses achieve their financial goals through a broad range of financial products. Our mission is to create engaged, lifelong relationships and put our customers at the heart of everything we do. We also help small businesses, nonprofits and cities grow, delivering solutions to solve all their financial needs.We offer a competitive total rewards package including base salary determined based on the role, experience, skill set and location. Those in eligible roles may receive commission-based pay and/or discretionary incentive compensation, paid in the form of cash and/or forfeitable equity, awarded in recognition of individual achievements and contributions. We also offer a range of benefits and programs to meet employee needs, based on eligibility. These benefits include comprehensive health care coverage, on-site health and wellness centers, a retirement savings plan, backup childcare, tuition reimbursement, mental health support, financial coaching and more. Additional details about total compensation and benefits will be provided during the hiring process.We recognize that our people are our strength and the diverse talents they bring to our global workforce are directly linked to our success. We are an equal opportunity employer and place a high value on diversity and inclusion at our company. We do not discriminate on the basis of any protected attribute, including race, religion, color, national origin, gender, sexual orientation, gender identity, gender expression, age, marital or veteran status, pregnancy or disability, or any other basis protected under applicable law. We also make reasonable accommodations for applicants' and employees' religious practices and beliefs, as well as mental health or physical disability needs. Visit our FAQs for more information about requesting an accommodation.Equal Opportunity Employer/Disability/VeteransAbout The TeamOur Consumer & Community Banking division serves our Chase customers through a range of financial services, including personal banking, credit cards, mortgages, auto financing, investment advice, small business loans and payment processing. We're proud to lead the U.S. in credit card sales and deposit growth and have the most-used digital solutions – all while ranking first in customer satisfaction.",
                      "apply_url": "https://www.linkedin.com/jobs/view/software-engineer-ii-java-aws-at-jpmorganchase-4460359588",
                      "ext": {
                        "applicant_count": 87,
                        "job_provider": null,
                        "salary_min": null,
                        "salary_max": null,
                        "salary_currency": null,
                        "country_code": null,
                        "linkedin_company_name": "jpmorganchase",
                        "industries": "Financial Services",
                        "job_function": "Engineering and Information Technology",
                        "accepting_applications": true,
                        "board": "linkedin"
                      }
                    }
                  },
                  "credits_used": 5,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/linkedin/organizations": {
      "get": {
        "summary": "Resolve LinkedIn organization ids",
        "description": "Returns LinkedIn companies and schools matching a name, each with a display name and numeric id. Pass those ids as organization_ids on GET /v1/jobs/linkedin/search to filter listings by employer.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_linkedin_organizations",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Company or school name.",
            "schema": {
              "type": "string"
            },
            "example": "google"
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 120 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 120
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/linkedin/organizations"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of search result objects",
                          "items": {
                            "type": "object",
                            "description": "Search result item"
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/linkedin/organizations",
                  "data": {
                    "items": [
                      {
                        "displayName": "Google",
                        "id": "1441"
                      },
                      {
                        "displayName": "Google DeepMind",
                        "id": "1594050"
                      }
                    ],
                    "total": 10,
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": null,
                    "has_more": false,
                    "page_size": 10
                  },
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/indeed/search": {
      "get": {
        "summary": "Search Indeed job listings",
        "description": "Returns Indeed job listings matching a keyword, country, and optional city, sort, and radius. Each row includes title, company, location, description, and apply URL. country_code is required on page 1 (ISO 3166-1 alpha-2). Page 2 with the cursor from page 1.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_indeed_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "premium",
        "x-credit-cost": 10,
        "x-socialcrawl-oneOf": [
          [
            "query",
            "cursor"
          ],
          [
            "country_code",
            "cursor"
          ]
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Keywords, job title, or company name. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "software engineer"
          },
          {
            "name": "location",
            "in": "query",
            "required": false,
            "description": "City or region within the country.",
            "schema": {
              "type": "string"
            },
            "example": "San Francisco"
          },
          {
            "name": "country_code",
            "in": "query",
            "required": false,
            "description": "ISO 3166-1 alpha-2 country code (for example us, de, kr). (one of: country_code, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "us"
          },
          {
            "name": "sort_type",
            "in": "query",
            "required": false,
            "description": "relevance (default) or date.",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "date"
              ]
            }
          },
          {
            "name": "radius",
            "in": "query",
            "required": false,
            "description": "Distance from location.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "radius_type",
            "in": "query",
            "required": false,
            "description": "km (default) or miles.",
            "schema": {
              "type": "string",
              "enum": [
                "km",
                "miles"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from the previous page. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 120 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 120
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/indeed/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical job wrappers ({ job })",
                          "items": {
                            "type": "object",
                            "description": "Canonical job wrapper",
                            "properties": {
                              "job": {
                                "type": "object",
                                "description": "Nested object: job",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "String at job.id"
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.url"
                                  },
                                  "company": {
                                    "type": "object",
                                    "description": "Nested object: job.company",
                                    "properties": {
                                      "id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.id"
                                      },
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.name"
                                      },
                                      "url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.url"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.company.verified"
                                      }
                                    }
                                  },
                                  "location": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.location"
                                  },
                                  "listed_at": {
                                    "type": [
                                      "string",
                                      "number",
                                      "null"
                                    ],
                                    "description": "Union: string | number | null"
                                  },
                                  "easy_apply": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Boolean at job.easy_apply"
                                  },
                                  "remote": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.remote"
                                  },
                                  "employment_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.employment_type"
                                  },
                                  "experience_level": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.experience_level"
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.description"
                                  },
                                  "apply_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.apply_url"
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: job.ext",
                                    "properties": {
                                      "is_promote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.is_promote"
                                      },
                                      "applicant_count": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.applicant_count"
                                      },
                                      "skills": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at job.ext.skills",
                                        "items": {
                                          "type": "string",
                                          "description": "String at job.ext.skills"
                                        }
                                      },
                                      "job_provider": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_provider"
                                      },
                                      "salary_min": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_min"
                                      },
                                      "salary_max": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_max"
                                      },
                                      "salary_currency": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.salary_currency"
                                      },
                                      "country_code": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.country_code"
                                      },
                                      "linkedin_company_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.linkedin_company_name"
                                      },
                                      "industries": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.industries"
                                      },
                                      "job_function": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_function"
                                      },
                                      "accepting_applications": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.accepting_applications"
                                      },
                                      "board": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.board"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "walk": {
                          "type": "object",
                          "description": "Present when the request sent a row-walk param (`max_pages` above 1, `max_items`, `max_credits`, a row filter, `sort_rows` or `seen`). What the walk did across the pages it fetched. Each page is billed as one call, and its charge is recorded under its own request id.",
                          "properties": {
                            "pages": {
                              "type": "integer",
                              "description": "Pages fetched.",
                              "example": 3
                            },
                            "stopped": {
                              "type": "string",
                              "enum": [
                                "end",
                                "max_pages",
                                "max_items",
                                "max_credits",
                                "time_budget",
                                "page_error"
                              ],
                              "description": "Why the walk stopped. `end`: the list ran out. `max_pages`, `max_items` or `max_credits`: the limit you set was reached. `time_budget`: the request's time budget ran low. `page_error`: a later page failed. Unless it is `end`, `pagination.next_cursor` continues from where the walk stopped.",
                              "example": "max_pages"
                            },
                            "rows_fetched": {
                              "type": "integer",
                              "description": "Rows read across every page, before any filter.",
                              "example": 60
                            },
                            "rows_returned": {
                              "type": "integer",
                              "description": "Rows in `data.items`.",
                              "example": 41
                            },
                            "discarded": {
                              "type": "object",
                              "description": "Present when you sent a row filter. Rows the filters removed, counted once each under the first filter they failed. A row a filter cannot verify (no view count, no date, no country) is discarded.",
                              "properties": {
                                "views_below_min": {
                                  "type": "integer",
                                  "description": "Rows with fewer views than `min_views`."
                                },
                                "views_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no view count, when `min_views` was sent."
                                },
                                "older_than_max_age": {
                                  "type": "integer",
                                  "description": "Rows published before the `max_age_days` window."
                                },
                                "date_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no publish date, when `max_age_days` was sent."
                                },
                                "country_not_included": {
                                  "type": "integer",
                                  "description": "Rows registered to a country that is not in `country`."
                                },
                                "country_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no country, when `country` was sent."
                                },
                                "country_excluded": {
                                  "type": "integer",
                                  "description": "Rows registered to a country listed in `exclude_country`."
                                }
                              }
                            },
                            "repeats": {
                              "type": "integer",
                              "description": "Present when you sent `seen`: rows removed because your account already received them under that id."
                            },
                            "duplicates": {
                              "type": "integer",
                              "description": "Present when above zero: rows a later page repeated from an earlier page of the same walk, kept once."
                            },
                            "credits": {
                              "type": "object",
                              "description": "What the pages cost.",
                              "properties": {
                                "pages": {
                                  "type": "integer",
                                  "description": "Credits charged for the pages walked, before refunds."
                                },
                                "refunded": {
                                  "type": "integer",
                                  "description": "Credits refunded across the pages."
                                }
                              }
                            },
                            "request_ids": {
                              "type": "array",
                              "description": "The request id of each page walked. Each is its own entry in `GET /v1/credits/transactions`.",
                              "items": {
                                "type": "string",
                                "description": "A row id."
                              }
                            }
                          }
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/indeed/search",
                  "data": {
                    "items": [
                      {
                        "job": {
                          "id": "aWQ9YTIwY2NjOWJhOGQ4Y2M1MjtjYz11cw==",
                          "title": "Software Engineer Intern",
                          "url": "https://jobs.lever.co/shopback-2/640ac3fb-dae5-4738-95b9-9cb80cc7ad15?lever-source=Indeed",
                          "company": {
                            "id": null,
                            "name": "ShopBack",
                            "url": null,
                            "verified": null
                          },
                          "location": "San Francisco, CA",
                          "listed_at": "2026-10-02T05:00:00.000Z",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": null,
                          "experience_level": null,
                          "description": "Our Journey\nThe ShopBack Group is Asia-Pacific’s leading shopping, rewards, and payments platform, serving over 20 million active members across 13 markets. In 2025, the Group continued its global growth with its expansion into North America. Driven by the vision to make every day more rewarding, ShopBack is dedicated to saving members money and time, and delivering delight every day. The platform also enables merchants and brands to engage with their members in a cost-effective manner. Founded in 2014, ShopBack now powers over US$5.5 billion in annual sales for over 20,000 online and in-store partners, and has rewarded shoppers with more than US$900 million (over S$1 billion) in Cashback to date. Through its innovative offerings, ShopBack continues to create value for both members and merchants. Notably, its payment solution, ShopBack Pay, offers members a convenient and rewarding payment option at checkout.\n\nAs a ShopBack intern, you do real work and deliver real impact. You ship code that goes to production and is used by millions of members all over the world. AI agents are part of how we build every day, so you will orchestrate and build with them from day one.\nWhat You'll Own\nShip real features. You own a scoped project, from design to production, with a mentor who supports you.\nBuild with AI as a teammate. You use coding agents to move fast, and you learn to review, test, and verify what they produce.\nMake AI tools for others. You build a skill, a tool, or an agent workflow that your team keeps using after your internship ends.\nMeasure, don't guess. You write evals and tests so you can prove that your AI-powered work is good.\nEssentials to Succeed\nYou have good fundamentals. You can write clean code, you are familiar with design patterns, and you understand data structures, APIs, and testing.\nYou have built things outside of class. Side projects, hackathons, open source, and freelance work all count.\nYou have applied AI, not only chatted with it. What have you built? Tell us about an app on an LLM API, a custom agent or MCP server, a boring task you automated end to end, or a simple eval you used to compare prompts or models.\nYou stay curious and sceptical. You ask why the AI gave an answer, and you check it before you trust it.\nYou learn fast. You are excited to learn new things. You are comfortable when you do not know something yet, and you ask good questions.\nShow Us What You Built with AI\n\nTell us about:\n\nThe coolest one: the thing you are most proud of, or the thing that made people say \"wait, how?\"\nOr the hardest one: the thing that broke many times before it worked.\n\nFor each one, tell us:\n\nThe problem: what you wanted to solve, and why it mattered to you.\nWhat you built: what you built, compared to what the AI did.\nWhat broke: where the AI failed, and how you found and fixed the problem.\nThe result: a link to a repo, a demo, a video, or a write-up. A result that works with rough edges is better than slides that look polished.\n\nStart where the problem is real. A personal agent that saves your time 10 minutes every day is better than a big idea that nobody built. Build it, ship it, and let people use it.\n\nBonus Points\nAgents: you built an agent that uses tools, keeps memory, or runs many steps without a human.\nEvals: you wrote evals or tests to measure whether your AI output improved.\nReal users: you shipped something that people other than you actually use.\nCloud: you deployed your project to a cloud platform.\nWe are looking for builders who are curious about AI and make a real impact with it.\n\nTechnologies You'll Touch\nTypeScript / Node.js\nPostgres\nKafka\nKubernetes\nGitLab\nDatadog\nClaude Code\nMCP\nShopBacker Traits\nAgency - We take ownership and act, rather than waiting for permission. When something's blocking progress, we find a way through it and follow through until it's done.\nJudgement - We aim for high-impact decisions, not just easy wins, and we put the bigger picture ahead of individual interests. That means moving quickly and confidently, while staying thoughtful about when a call really matters.\nLearning Velocity - We pick up new skills fast and let go of old habits just as quickly when something better comes along. We benchmark ourselves against the best and keep raising our own bar.\nTenacity - We stay in it when things get hard, keeping a level head under pressure. We debate openly before deciding, then commit fully — and support each other along the way.\nWhat's in it for ShopBackers\nCareer growth opportunities to take on greater challenges that help you realise your ambitions.\nBe part of a winning team on a journey to global scale.\nCompetitive compensation based on performance.\nCandid, open, and collaborative culture where feedback is valued.\n\nWe are committed to protecting your data and ensuring fairness in our recruitment process. We may use artificial intelligence (AI) tools to help our team review applications, analyse resumes, match candidates to roles, generate interview notes, and assess responses. These tools assist our recruiters and interviewers and they do not make final hiring decisions. Final hiring decisions are ultimately made by humans. If an assessment is part of your process, we may (with your consent) capture screen activity and/or webcam images during the test to help verify test integrity. We do not use AI to infer your emotions or sensitive traits. We process personal data lawfully, securely, and transparently in line with applicable data-protection laws and our commitment to fair employment. You can ask questions or exercise your rights including to request human review or to challenge an outcome by contacting redacted@example.com. ShopBack is an equal opportunity employer. We celebrate diversity and are committed to creating an inclusive environment for all employees. We do not discriminate on the basis of race, color, religion, sexual orientation, national origin, age, disability, genetic information, veteran status, or any other protected status under applicable laws. Join our team and help us make a difference!",
                          "apply_url": "https://jobs.lever.co/shopback-2/640ac3fb-dae5-4738-95b9-9cb80cc7ad15?lever-source=Indeed",
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": "US",
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "indeed"
                          }
                        }
                      },
                      {
                        "job": {
                          "id": "aWQ9ZTQ1NmNiZWZkNzkxZmE4YTtjYz11cw==",
                          "title": "Software Engineer III - ServiceNow",
                          "url": "https://JPMorganChase.contacthr.com/153797928",
                          "company": {
                            "id": null,
                            "name": "JPMorganChase",
                            "url": null,
                            "verified": null
                          },
                          "location": "San Francisco, CA",
                          "listed_at": "2026-10-02T05:00:00.000Z",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": null,
                          "experience_level": null,
                          "description": "JOB DESCRIPTION\n\nWe have an exciting and rewarding opportunity for you to take your software engineering career to the next level.\n\nAs a Software Engineer III at JPMorganChase within the Infrastructure Platform ServiceNow IT Service Management , you serve as a seasoned member of an agile team to design and deliver trusted market-leading technology products in a secure, stable, and scalable way. You are responsible for carrying out critical technology solutions across multiple technical areas within various business functions in support of the firm's business objectives.\n\nJob responsibilities\nExecutes software solutions, design, development, and technical troubleshooting with ability to think beyond routine or conventional approaches to build solutions or breakdown technical problems\nCreates secure and high-quality production code and maintains algorithms that run synchronously with appropriate systems\nLeverages enterprise-authorized AI coding assist tools within the work environment to improve code quality, delivery speed, and productivity across complex deliverables (e.g., code generation/refactoring, unit test creation, documentation), while validating outputs through peer review, automated testing, and secure coding standards; contributes learnings and reusable patterns to improve broader team effectiveness.\nApplies knowledge of tools within the Software Development Life Cycle toolchain, including enterprise-authorized AI-assisted development and automation capabilities, to improve the value realized by automation.\nProduces architecture and design artifacts for complex applications while being accountable for ensuring design constraints are met by software code development\nContributes to software engineering communities of practice and events that explore new and emerging technologies\nDesign, code, test, and deliver software leveraging firm-wide frameworks and best practices for the ServiceNow platform.\nGathers, analyzes, synthesizes, and develops visualizations and reporting from large, diverse data sets in service of continuous improvement of software applications and systems\nProactively identifies hidden problems and patterns in data and uses these insights to drive improvements to coding hygiene and system architecture\nFollow and enhance the scrum practices for continuous team processes improvement\nCollaborate with the Business Analysis team for producing estimates and agile delivery plans\nRequired qualifications, capabilities, and skills\nFormal training or certification on software engineering concepts and 3+ years applied experience\nHands-on ServiceNow platform implementation experience\nProficiency in one or more modern programming languages (JavaScript/GlideScript /ServiceNow script strongly relevant) and database querying languages\nExperience in Java/PHP/Python programming language\nKnowledge of ServiceNow development best practices — scripting, configuration, tool navigation, custom widgets — with excellent analytical, debugging and problem-solving skills\nPractical experience across system design, application development, testing and operational stability in a large corporate environment\nStrong grounding in agile delivery, CI/CD, application resiliency and security\nDemonstrated knowledge of a technical discipline such as cloud, AI/ML or mobile\nExtensive knowledge of best practices developing in the ServiceNow platform or proven ability to learn a new platform quickly with excellent analytical, debugging and problem solving skills. Experience should span writing custom widgets, tool navigation, configuration and scripting.\nHands-on experience using enterprise-authorized AI-assisted software development tools within the work environment (e.g., for coding, test creation, troubleshooting, or documentation) with demonstrated ability to critically evaluate, validate, and refine AI-generated outputs for correctness, performance, and security.\nUnderstanding of responsible AI use in engineering workflows, including data sensitivity considerations, secure handling of inputs/outputs, and adherence to resiliency and security expectations; ability to guide peers on safe and effective usage within team practices.\nPreferred qualifications, capabilities, and skills\nFamiliarity with modern front-end technologies\nExposure to cloud technologies\nExperience implementing the Service Portal on ServiceNow (preferred).\n\nDemonstrates strong understanding of ServiceNow platform and PaaS model with relevance to ServiceNow integration solutions.\n\nThis position is subject to Section 19 of the Federal Deposit Insurance Act. As such, an employment offer for this position is contingent on JPMorganChase's review of criminal conviction history, including pretrial diversions or program entries.\n\nABOUT US\n\nJPMorganChase, one of the oldest financial institutions, offers innovative financial solutions to millions of consumers, small businesses and many of the world's most prominent corporate, institutional and government clients under the J.P. Morgan and Chase brands. Our history spans over 200 years and today we are a leader in investment banking, consumer and small business banking, commercial banking, financial transaction processing and asset management.\n\nWe offer a competitive total rewards package including base salary determined based on the role, experience, skill set and location. Those in eligible roles may receive commission-based pay and/or discretionary incentive compensation, paid in the form of cash and/or forfeitable equity, awarded in recognition of individual achievements and contributions. We also offer a range of benefits and programs to meet employee needs, based on eligibility. These benefits include comprehensive health care coverage, on-site health and wellness centers, a retirement savings plan, backup childcare, tuition reimbursement, mental health support, financial coaching and more. Additional details about total compensation and benefits will be provided during the hiring process.\n\nWe recognize that our people are our strength and the diverse talents they bring to our global workforce are directly linked to our success. We are an equal opportunity employer and place a high value on diversity and inclusion at our company. We do not discriminate on the basis of any protected attribute, including race, religion, color, national origin, gender, sexual orientation, gender identity, gender expression, age, marital or veteran status, pregnancy or disability, or any other basis protected under applicable law. We also make reasonable accommodations for applicants' and employees' religious practices and beliefs, as well as mental health or physical disability needs. Visit our FAQs for more information about requesting an accommodation.\n\nJPMorgan Chase & Co. is an Equal Opportunity Employer, including Disability/Veterans\n\nABOUT THE TEAM\n\nOur professionals in our Corporate Functions cover a diverse range of areas from finance and risk to human resources and marketing. Our corporate teams are an essential part of our company, ensuring that we're setting our businesses, clients, customers and employees up for success.",
                          "apply_url": "https://JPMorganChase.contacthr.com/153797928",
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": "US",
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "indeed"
                          }
                        }
                      }
                    ],
                    "next_cursor": "dD1BQlFBQVFBVUFBQUFBQUFBQUFBQUFBQUNaUEFNcXdFQkFRbE51ZmJQVkJMY2ZZNUhZSGtYTjl0eVlWMXZjNXVDeDNlQ0pzT2Y1R2NpaytXUmNjSWJGMmJmNWF6eC9naTZZYWx0O3E9c29mdHdhcmUgZW5naW5lZXI7bD1TYW4gRnJhbmNpc2NvO2NjPVVTO3N0PTtyPTA7cnQ9O3A9MQ==",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 10,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoiZEQxQlFsRkJRVkZCVlVGQlFVRkJRVUZCUVVGQlFVRkJRVU5hVUVGTmNYZEZRa0ZSYkU1MVptSlFWa0pNWTJaWk5VaFpTR3RZVGpsMGVWbFdNWFpqTlhWRGVETmxRMHB6VDJZMVIyTnBheXRYVW1OalNXSkdNbUptTldGNmVDOW5hVFpaWVd4ME8zRTljMjltZEhkaGNtVWdaVzVuYVc1bFpYSTdiRDFUWVc0Z1JuSmhibU5wYzJOdk8yTmpQVlZUTzNOMFBUdHlQVEE3Y25ROU8zQTlNUT09IiwiZSI6ImpvYnMvaW5kZWVkL3NlYXJjaCIsInAiOiJjdXJzb3IifQ",
                    "has_more": true,
                    "page_size": 20
                  },
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/indeed": {
      "get": {
        "summary": "Get an Indeed job listing by id",
        "description": "Returns one Indeed job: title, company, location, description, and apply URL. Use an id from GET /v1/jobs/indeed/search.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_indeed",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "advanced",
        "x-credit-cost": 5,
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Indeed job id from indeed/search.",
            "schema": {
              "type": "string"
            },
            "example": "aWQ9NWExYzEwM2YzOTEzODljNDtjYz11cw=="
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 600 seconds old is served; this endpoint keeps copies for 3600 seconds, so a value up to 3600 can save a call. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3600
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/indeed"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "job": {
                          "type": "object",
                          "description": "Nested object: job",
                          "properties": {
                            "id": {
                              "type": "string",
                              "description": "String at job.id"
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.title"
                            },
                            "url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.url"
                            },
                            "company": {
                              "type": "object",
                              "description": "Nested object: job.company",
                              "properties": {
                                "id": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.id"
                                },
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.name"
                                },
                                "url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.url"
                                },
                                "verified": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.company.verified"
                                }
                              }
                            },
                            "location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.location"
                            },
                            "listed_at": {
                              "type": [
                                "string",
                                "number",
                                "null"
                              ],
                              "description": "Union: string | number | null"
                            },
                            "easy_apply": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at job.easy_apply"
                            },
                            "remote": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.remote"
                            },
                            "employment_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.employment_type"
                            },
                            "experience_level": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.experience_level"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.description"
                            },
                            "apply_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.apply_url"
                            },
                            "ext": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: job.ext",
                              "properties": {
                                "is_promote": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.is_promote"
                                },
                                "applicant_count": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.applicant_count"
                                },
                                "skills": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at job.ext.skills",
                                  "items": {
                                    "type": "string",
                                    "description": "String at job.ext.skills"
                                  }
                                },
                                "job_provider": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_provider"
                                },
                                "salary_min": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_min"
                                },
                                "salary_max": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_max"
                                },
                                "salary_currency": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.salary_currency"
                                },
                                "country_code": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.country_code"
                                },
                                "linkedin_company_name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.linkedin_company_name"
                                },
                                "industries": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.industries"
                                },
                                "job_function": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_function"
                                },
                                "accepting_applications": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.accepting_applications"
                                },
                                "board": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.board"
                                }
                              }
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "job"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/indeed",
                  "data": {
                    "job": {
                      "id": "aWQ9NWExYzEwM2YzOTEzODljNDtjYz11cw==",
                      "title": "Software Engineer, Security",
                      "url": "https://jobs.ashbyhq.com/harvey/d2624850-8dd4-4eb4-b5dc-f386b715a26f",
                      "company": {
                        "id": null,
                        "name": "HARVEY",
                        "url": null,
                        "verified": null
                      },
                      "location": "San Francisco, CA",
                      "listed_at": "2026-09-01T05:00:00.000Z",
                      "easy_apply": null,
                      "remote": null,
                      "employment_type": null,
                      "experience_level": null,
                      "description": "Location\n\nSan Francisco\n\nEmployment Type\n\nFull time\n\nDepartment\n\nSecurity\n\nCompensation\n$161K – $245K • Offers Equity • Offers Bonus\n\nAdditionally, this role is eligible to participate in our equity plan and benefits program. Benefits include, but not limited to: Comprehensive health, dental and vision coverage, retirement benefits (401k match up to 4%), and flexible PTO.\nWhy Harvey\n\nAt Harvey, we’re transforming how legal and professional services operate. By combining frontier agentic AI, an enterprise-grade platform, and deep domain expertise, we’re reshaping how critical knowledge work gets done for decades to come.\n\nThis is a rare chance to help build a generational company at a true inflection point. We have strong product-market fit and world-class investor support. We’re scaling fast and defining a new category in real time. The work is ambitious, the bar is high, and the opportunity for growth — personal, professional, and financial — is unmatched.\n\nOur team moves fast, takes ownership, and is deeply committed to the mission — operating with intensity, staying close to our customers, and pushing each other for excellence. We live by three values: Decisiveness, Simplicity, and Job's Not Finished. We act quickly on clear judgment over perfect information, we believe simplicity is what scales, and we're never satisfied with where we are. If you want to do the best work of your career alongside people who share that drive, we'd love to build with you.\n\nAt Harvey, the future of professional services is being written today — and we’re just getting started.\n\nRole Overview\n\nAs a Software Engineer on the Security Engineering team at Harvey, you'll build and operate foundational security services for both our customer-facing product and the internal systems our workforce depends on: identity and access management, secrets and privileged access, agent sandboxes, and tooling that makes the secure path the fast path. You'll turn security needs into production systems and own the reliability and security of what you build, working closely with engineers and partner teams along the way. Attackers increasingly operate at agent speed, so we’re building defenses that can keep pace.\n\nSecurity at Harvey is an engineering discipline, not a gatekeeper function. We build platforms and libraries that make it hard for engineers to get security wrong, and we measure ourselves on adoption and outcomes rather than tickets filed. Our program is informed by risk: we invest where the actual exposure to our most sensitive data and resources is greatest, rather than where a framework tells us to.\n\nWhat You'll Do\n\nBuild and operate Harvey’s core identity and access services across customer-facing product, workforce, and infrastructure systems, including authentication, authorization, access governance, secrets, and privileged access\n\nEvolve how Harvey customers set up and manage their environments, making security-critical configuration—from identity and access to policies and integrations—delightful to use and secure by default\n\nBuild identity controls, sandboxes, and safety harnesses that let services and AI agents operate with least privilege, constrained actions, clear auditability, and effective monitoring\n\nCreate secure-by-default libraries, paved-road abstractions, self-service tooling, and agentic workflows that automate security triage, remediation, and evidence collection\n\nTake security systems from design through production, accounting for trust boundaries, attacker paths, and operational failure modes while owning their reliability and security\n\nShare an on-call rotation for Harvey’s mission-critical security services, contribute to incident response, and raise the engineering bar through design reviews, code reviews, and clear documentation\n\nWhat You Have\n\n2+ years of software engineering experience, including experience shipping and operating production services\n\nExperience building or contributing to security infrastructure such as identity and access management, authentication and authorization, secrets management, or privileged access\n\nStrong programming, debugging, testing, and problem-solving skills, with the ability to work across unfamiliar systems and domains\n\nExperience with cloud infrastructure such as Microsoft Azure, Google Cloud Platform, or Amazon Web Services and familiarity with modern distributed-system patterns\n\nA track record of translating security requirements into maintainable, automated systems\n\nExperience using agentic coding tools and creating workflows that automate repetitive security work, with the judgment to review their output critically and measure whether they improve security outcomes\n\nClear communication and collaboration skills, including the ability to explain technical risks, decisions, and tradeoffs to engineering partners\n\nWorking knowledge of common vulnerability classes and the ability to reason about how a system fails under an attacker, not just under load\n\nNice to Have\n\nExperience building security infrastructure at a fast-growing company\n\nExperience with SCIM; OpenID Connect (OIDC); Security Assertion Markup Language (SAML); policy engines such as Open Policy Agent (OPA), Cedar, or Zanzibar-style systems; or hardware-backed credentials\n\nExperience securing agentic or AI-powered systems, especially systems that act on behalf of users against sensitive data\n\nExperience working in a highly regulated enterprise environment\n\nCompensation\n\n$161,000 - $245,000 USD\n\nDepending on your location, an Applicant Privacy Notice may apply to you. You can find all of our Applicant Privacy Notices [here].\n\n#LI-NP1\n\nHarvey is an equal opportunity employer and does not discriminate on the basis of race, gender, sexual orientation, gender identity/expression, national origin, disability, age, genetic information, veteran status, marital status, pregnancy or related condition, or any other basis protected by law.\n\nWe are committed to providing reasonable accommodations to applicants with disabilities, and requests can be made by emailing accommodations@harvey.ai",
                      "apply_url": "https://jobs.ashbyhq.com/harvey/d2624850-8dd4-4eb4-b5dc-f386b715a26f",
                      "ext": {
                        "applicant_count": null,
                        "job_provider": null,
                        "salary_min": null,
                        "salary_max": null,
                        "salary_currency": null,
                        "country_code": "US",
                        "linkedin_company_name": null,
                        "industries": null,
                        "job_function": null,
                        "accepting_applications": null,
                        "board": "indeed"
                      }
                    }
                  },
                  "credits_used": 5,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/bing/search": {
      "get": {
        "summary": "Search Bing job listings",
        "description": "Returns aggregated job listings from Bing matching a keyword and location, with optional date, employment type, and remote-only filters. Each row has title, company, location, and the original job board. List rows do not include an apply URL; pass an id to GET /v1/jobs/bing for the description and apply link. location is required on page 1.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_bing_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "premium",
        "x-credit-cost": 10,
        "x-socialcrawl-oneOf": [
          [
            "query",
            "cursor"
          ],
          [
            "location",
            "cursor"
          ]
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Keywords, job title, or company name. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "software engineer"
          },
          {
            "name": "location",
            "in": "query",
            "required": false,
            "description": "City or country. Required on page 1. (one of: location, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "United States"
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Maximum age: week or day.",
            "schema": {
              "type": "string",
              "enum": [
                "week",
                "day"
              ]
            },
            "example": "week"
          },
          {
            "name": "employment_types",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: contractor, fulltime, parttime, temporary.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "remote_only",
            "in": "query",
            "required": false,
            "description": "When true, only remote listings.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from the previous page. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 120 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 120
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/bing/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical job wrappers ({ job })",
                          "items": {
                            "type": "object",
                            "description": "Canonical job wrapper",
                            "properties": {
                              "job": {
                                "type": "object",
                                "description": "Nested object: job",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "String at job.id"
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.url"
                                  },
                                  "company": {
                                    "type": "object",
                                    "description": "Nested object: job.company",
                                    "properties": {
                                      "id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.id"
                                      },
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.name"
                                      },
                                      "url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.url"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.company.verified"
                                      }
                                    }
                                  },
                                  "location": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.location"
                                  },
                                  "listed_at": {
                                    "type": [
                                      "string",
                                      "number",
                                      "null"
                                    ],
                                    "description": "Union: string | number | null"
                                  },
                                  "easy_apply": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Boolean at job.easy_apply"
                                  },
                                  "remote": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.remote"
                                  },
                                  "employment_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.employment_type"
                                  },
                                  "experience_level": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.experience_level"
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.description"
                                  },
                                  "apply_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.apply_url"
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: job.ext",
                                    "properties": {
                                      "is_promote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.is_promote"
                                      },
                                      "applicant_count": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.applicant_count"
                                      },
                                      "skills": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at job.ext.skills",
                                        "items": {
                                          "type": "string",
                                          "description": "String at job.ext.skills"
                                        }
                                      },
                                      "job_provider": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_provider"
                                      },
                                      "salary_min": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_min"
                                      },
                                      "salary_max": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_max"
                                      },
                                      "salary_currency": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.salary_currency"
                                      },
                                      "country_code": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.country_code"
                                      },
                                      "linkedin_company_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.linkedin_company_name"
                                      },
                                      "industries": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.industries"
                                      },
                                      "job_function": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_function"
                                      },
                                      "accepting_applications": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.accepting_applications"
                                      },
                                      "board": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.board"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "walk": {
                          "type": "object",
                          "description": "Present when the request sent a row-walk param (`max_pages` above 1, `max_items`, `max_credits`, a row filter, `sort_rows` or `seen`). What the walk did across the pages it fetched. Each page is billed as one call, and its charge is recorded under its own request id.",
                          "properties": {
                            "pages": {
                              "type": "integer",
                              "description": "Pages fetched.",
                              "example": 3
                            },
                            "stopped": {
                              "type": "string",
                              "enum": [
                                "end",
                                "max_pages",
                                "max_items",
                                "max_credits",
                                "time_budget",
                                "page_error"
                              ],
                              "description": "Why the walk stopped. `end`: the list ran out. `max_pages`, `max_items` or `max_credits`: the limit you set was reached. `time_budget`: the request's time budget ran low. `page_error`: a later page failed. Unless it is `end`, `pagination.next_cursor` continues from where the walk stopped.",
                              "example": "max_pages"
                            },
                            "rows_fetched": {
                              "type": "integer",
                              "description": "Rows read across every page, before any filter.",
                              "example": 60
                            },
                            "rows_returned": {
                              "type": "integer",
                              "description": "Rows in `data.items`.",
                              "example": 41
                            },
                            "discarded": {
                              "type": "object",
                              "description": "Present when you sent a row filter. Rows the filters removed, counted once each under the first filter they failed. A row a filter cannot verify (no view count, no date, no country) is discarded.",
                              "properties": {
                                "views_below_min": {
                                  "type": "integer",
                                  "description": "Rows with fewer views than `min_views`."
                                },
                                "views_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no view count, when `min_views` was sent."
                                },
                                "older_than_max_age": {
                                  "type": "integer",
                                  "description": "Rows published before the `max_age_days` window."
                                },
                                "date_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no publish date, when `max_age_days` was sent."
                                },
                                "country_not_included": {
                                  "type": "integer",
                                  "description": "Rows registered to a country that is not in `country`."
                                },
                                "country_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no country, when `country` was sent."
                                },
                                "country_excluded": {
                                  "type": "integer",
                                  "description": "Rows registered to a country listed in `exclude_country`."
                                }
                              }
                            },
                            "repeats": {
                              "type": "integer",
                              "description": "Present when you sent `seen`: rows removed because your account already received them under that id."
                            },
                            "duplicates": {
                              "type": "integer",
                              "description": "Present when above zero: rows a later page repeated from an earlier page of the same walk, kept once."
                            },
                            "credits": {
                              "type": "object",
                              "description": "What the pages cost.",
                              "properties": {
                                "pages": {
                                  "type": "integer",
                                  "description": "Credits charged for the pages walked, before refunds."
                                },
                                "refunded": {
                                  "type": "integer",
                                  "description": "Credits refunded across the pages."
                                }
                              }
                            },
                            "request_ids": {
                              "type": "array",
                              "description": "The request id of each page walked. Each is its own entry in `GET /v1/credits/transactions`.",
                              "items": {
                                "type": "string",
                                "description": "A row id."
                              }
                            }
                          }
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/bing/search",
                  "data": {
                    "items": [
                      {
                        "job": {
                          "id": "LTQxMzc3OTE1MS5SZXRybw==",
                          "title": "Sr. Full-Stack Software Engineer - Remote",
                          "url": null,
                          "company": {
                            "id": null,
                            "name": "YO AI Labs",
                            "url": null,
                            "verified": null
                          },
                          "location": "Anywhere, HE",
                          "listed_at": "4 days ago",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": "Contract",
                          "experience_level": null,
                          "description": null,
                          "apply_url": null,
                          "ext": {
                            "applicant_count": null,
                            "job_provider": "LinkedIn",
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": null,
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "bing"
                          }
                        }
                      },
                      {
                        "job": {
                          "id": "NjY3NTk3MzYxLlJldHJv",
                          "title": "Senior Software Engineer - Fully Remote  Upto $210/Hr",
                          "url": null,
                          "company": {
                            "id": null,
                            "name": "Mercor",
                            "url": null,
                            "verified": null
                          },
                          "location": "Anywhere, BE",
                          "listed_at": "7 days ago",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": "Part-time",
                          "experience_level": null,
                          "description": null,
                          "apply_url": null,
                          "ext": {
                            "applicant_count": null,
                            "job_provider": "LinkedIn",
                            "salary_min": null,
                            "salary_max": null,
                            "salary_currency": null,
                            "country_code": null,
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "bing"
                          }
                        }
                      }
                    ],
                    "next_cursor": "dD04NTBFRkZFQ0FGNDY0QTM4OTMwMjU5OUFBN0EyRTc4OToyMDtkcD13ZWVrO3JvPWZhbHNlO2V0PTtsPVVuaXRlZCBTdGF0ZXM7cD0x",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 10,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoiZEQwNE5UQkZSa1pGUTBGR05EWTBRVE00T1RNd01qVTVPVUZCTjBFeVJUYzRPVG95TUR0a2NEMTNaV1ZyTzNKdlBXWmhiSE5sTzJWMFBUdHNQVlZ1YVhSbFpDQlRkR0YwWlhNN2NEMHgiLCJlIjoiam9icy9iaW5nL3NlYXJjaCIsInAiOiJjdXJzb3IifQ",
                    "has_more": true,
                    "page_size": 20
                  },
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/bing": {
      "get": {
        "summary": "Get a Bing job listing by id",
        "description": "Returns one Bing-aggregated job: title, company, location, employment type, description, and apply URL. Use an id from GET /v1/jobs/bing/search.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_bing",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "advanced",
        "x-credit-cost": 5,
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Bing job id from bing/search.",
            "schema": {
              "type": "string"
            },
            "example": "NTU5NDY0MDEzLlJldHJv"
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 600 seconds old is served; this endpoint keeps copies for 3600 seconds, so a value up to 3600 can save a call. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3600
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/bing"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "job": {
                          "type": "object",
                          "description": "Nested object: job",
                          "properties": {
                            "id": {
                              "type": "string",
                              "description": "String at job.id"
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.title"
                            },
                            "url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.url"
                            },
                            "company": {
                              "type": "object",
                              "description": "Nested object: job.company",
                              "properties": {
                                "id": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.id"
                                },
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.name"
                                },
                                "url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.url"
                                },
                                "verified": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.company.verified"
                                }
                              }
                            },
                            "location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.location"
                            },
                            "listed_at": {
                              "type": [
                                "string",
                                "number",
                                "null"
                              ],
                              "description": "Union: string | number | null"
                            },
                            "easy_apply": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at job.easy_apply"
                            },
                            "remote": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.remote"
                            },
                            "employment_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.employment_type"
                            },
                            "experience_level": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.experience_level"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.description"
                            },
                            "apply_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.apply_url"
                            },
                            "ext": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: job.ext",
                              "properties": {
                                "is_promote": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.is_promote"
                                },
                                "applicant_count": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.applicant_count"
                                },
                                "skills": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at job.ext.skills",
                                  "items": {
                                    "type": "string",
                                    "description": "String at job.ext.skills"
                                  }
                                },
                                "job_provider": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_provider"
                                },
                                "salary_min": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_min"
                                },
                                "salary_max": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_max"
                                },
                                "salary_currency": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.salary_currency"
                                },
                                "country_code": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.country_code"
                                },
                                "linkedin_company_name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.linkedin_company_name"
                                },
                                "industries": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.industries"
                                },
                                "job_function": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_function"
                                },
                                "accepting_applications": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.accepting_applications"
                                },
                                "board": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.board"
                                }
                              }
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "job"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/bing",
                  "data": {
                    "job": {
                      "id": "MTE5OTc2NjYxOS5SZXRybw==",
                      "title": "Staff Software Engineer, Motion Planning",
                      "url": "https://de.linkedin.com/jobs/view/staff-software-engineer-motion-planning-at-aerovect-4459093710?trk=bingjobs",
                      "company": {
                        "id": null,
                        "name": "AeroVect",
                        "url": null,
                        "verified": null
                      },
                      "location": "Frankfurt, HE",
                      "listed_at": "22 days ago",
                      "easy_apply": null,
                      "remote": null,
                      "employment_type": "Full-time",
                      "experience_level": null,
                      "description": "Job descriptionWho We Are\n\n\n\nAeroVect is transforming ground handling with autonomy, redefining how airlines and ground service providers around the globe run day-to-day operations. We are a Series A company backed by top-tier venture capital investors in aviation and autonomous driving. Our customers include some of the world’s largest airlines and ground handling providers. For more information, visit www.aerovect.com.\n\n\n\nJob Description\n\n\n\nWe are looking for an experienced Staff Software Engineer who can design and build best-in-class planning systems for autonomous driving in structured, low-speed environments.\n\n\n\nIn this role, you'll be the technical backbone of the planning stack — owning the design and implementation of production-grade mission planning, behavior planning, and motion planning software. You'll work across the full planning pipeline to achieve category-defining vehicle autonomy for the airside, tackling hard problems in trajectory optimization, decision-making under uncertainty, and real-time constraint optimization.\n\n\n\nThis opportunity offers a deeply technical engineer the chance to shape a market-defining enterprise product that combines autonomous vehicle technology with a robotics-as-a-service (RaaS) business model. This role reports to our Planning Tech Lead and works closely with the autonomy engineering team.\n\n\n\nYou Will:\n\n\n\n\n\n- Design, implement, and iterate on the mission planner, behavior planner, and motion planner for autonomous ground support equipment operating in airport airside environments.\n\n- Drive key technical decisions across the planning stack — selecting algorithms, defining interfaces, and establishing the architecture that the team builds on.\n\n- Prototype and evaluate new planning approaches (e.g., optimization-based methods, search-based planners, learning-augmented pipelines) and bring the best ideas to production.\n\n- Collaborate cross-functionally with perception, controls, localization, and systems engineering teams to deliver an integrated autonomous driving system.\n\n- Establish and promote best practices in software development, functional safety, and systems engineering as they apply to the planning domain.\n\n- Mentor other engineers through technical guidance, code review, and design discussions.\n\n\n\n\n\nYou Have:\n\n\n\n\n\n- Bachelor's or Master's degree in Computer Science, Math, Electrical Engineering, Mechanical Engineering, Robotics, Physics, or a related field.\n\n- Extensive hands-on experience designing and implementing planning modules for autonomous systems shipped to production or deployed in real-world operations.\n\n- Strong programming skills in C&#43;&#43; (preferred) or Python, and experience with Linux-based operating systems.\n\n- Demonstrated ability to take ambiguous technical problems and drive them to well-architected solutions independently.\n\n- Excellent communication skills, proactiveness, and a strong sense of ownership.\n\n\n\n\n\nWe Prefer:\n\n\n\n\n\n- MS or Ph.D. in Computer Science, Robotics, or a related field. \n- Mastery of Modern C&#43;&#43; (14 and beyond) and safety-critical coding practices (e.g., MISRA, ISO 26262).\n\n- 5&#43; years of industry experience in planning for robotic ground vehicles. \n- In-depth understanding of DDS frameworks like ROS/ROS2 or other networking middleware.\n\n- Experience in startup environments, demonstrating adaptability to rapidly changing priorities.",
                      "apply_url": "https://de.linkedin.com/jobs/view/staff-software-engineer-motion-planning-at-aerovect-4459093710?trk=bingjobs",
                      "ext": {
                        "applicant_count": null,
                        "job_provider": null,
                        "salary_min": null,
                        "salary_max": null,
                        "salary_currency": null,
                        "country_code": null,
                        "linkedin_company_name": null,
                        "industries": null,
                        "job_function": null,
                        "accepting_applications": null,
                        "board": "bing"
                      }
                    }
                  },
                  "credits_used": 5,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/xing/search": {
      "get": {
        "summary": "Search Xing job listings",
        "description": "Returns Xing job listings matching a keyword, with optional German-language location, date, employment type, career level, remote option, and minimum yearly salary filters. Rows often include a salary range. Page 2 with the cursor from page 1.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_xing_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "premium",
        "x-credit-cost": 10,
        "x-socialcrawl-oneOf": [
          [
            "query",
            "cursor"
          ]
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Keywords, job title, or company name. Required on page 1. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "software engineer"
          },
          {
            "name": "location",
            "in": "query",
            "required": false,
            "description": "City or country, preferably in German (for example Berlin, Schweiz).",
            "schema": {
              "type": "string"
            },
            "example": "Berlin"
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Maximum age: month, week, or day.",
            "schema": {
              "type": "string",
              "enum": [
                "month",
                "week",
                "day"
              ]
            },
            "example": "week"
          },
          {
            "name": "employment_types",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: contractor, fulltime, intern, parttime, seasonal, temporary, voluntary.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "career_levels",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: student, entry, professional, manager, executive, seniorExecutive.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "remote_options",
            "in": "query",
            "required": false,
            "description": "Semicolon-separated: remote, hybrid, onSite.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minimum_salary",
            "in": "query",
            "required": false,
            "description": "Minimum yearly salary. Listings whose range intersects this floor are returned.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from the previous page. (one of: query, cursor; at least one required)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 120 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 120
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/xing/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical job wrappers ({ job })",
                          "items": {
                            "type": "object",
                            "description": "Canonical job wrapper",
                            "properties": {
                              "job": {
                                "type": "object",
                                "description": "Nested object: job",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "String at job.id"
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.url"
                                  },
                                  "company": {
                                    "type": "object",
                                    "description": "Nested object: job.company",
                                    "properties": {
                                      "id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.id"
                                      },
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.name"
                                      },
                                      "url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.company.url"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.company.verified"
                                      }
                                    }
                                  },
                                  "location": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.location"
                                  },
                                  "listed_at": {
                                    "type": [
                                      "string",
                                      "number",
                                      "null"
                                    ],
                                    "description": "Union: string | number | null"
                                  },
                                  "easy_apply": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Boolean at job.easy_apply"
                                  },
                                  "remote": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.remote"
                                  },
                                  "employment_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.employment_type"
                                  },
                                  "experience_level": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.experience_level"
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.description"
                                  },
                                  "apply_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at job.apply_url"
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: job.ext",
                                    "properties": {
                                      "is_promote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.is_promote"
                                      },
                                      "applicant_count": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.applicant_count"
                                      },
                                      "skills": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at job.ext.skills",
                                        "items": {
                                          "type": "string",
                                          "description": "String at job.ext.skills"
                                        }
                                      },
                                      "job_provider": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_provider"
                                      },
                                      "salary_min": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_min"
                                      },
                                      "salary_max": {
                                        "type": [
                                          "number",
                                          "null"
                                        ],
                                        "description": "Numeric at job.ext.salary_max"
                                      },
                                      "salary_currency": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.salary_currency"
                                      },
                                      "country_code": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.country_code"
                                      },
                                      "linkedin_company_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.linkedin_company_name"
                                      },
                                      "industries": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.industries"
                                      },
                                      "job_function": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.job_function"
                                      },
                                      "accepting_applications": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at job.ext.accepting_applications"
                                      },
                                      "board": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at job.ext.board"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "walk": {
                          "type": "object",
                          "description": "Present when the request sent a row-walk param (`max_pages` above 1, `max_items`, `max_credits`, a row filter, `sort_rows` or `seen`). What the walk did across the pages it fetched. Each page is billed as one call, and its charge is recorded under its own request id.",
                          "properties": {
                            "pages": {
                              "type": "integer",
                              "description": "Pages fetched.",
                              "example": 3
                            },
                            "stopped": {
                              "type": "string",
                              "enum": [
                                "end",
                                "max_pages",
                                "max_items",
                                "max_credits",
                                "time_budget",
                                "page_error"
                              ],
                              "description": "Why the walk stopped. `end`: the list ran out. `max_pages`, `max_items` or `max_credits`: the limit you set was reached. `time_budget`: the request's time budget ran low. `page_error`: a later page failed. Unless it is `end`, `pagination.next_cursor` continues from where the walk stopped.",
                              "example": "max_pages"
                            },
                            "rows_fetched": {
                              "type": "integer",
                              "description": "Rows read across every page, before any filter.",
                              "example": 60
                            },
                            "rows_returned": {
                              "type": "integer",
                              "description": "Rows in `data.items`.",
                              "example": 41
                            },
                            "discarded": {
                              "type": "object",
                              "description": "Present when you sent a row filter. Rows the filters removed, counted once each under the first filter they failed. A row a filter cannot verify (no view count, no date, no country) is discarded.",
                              "properties": {
                                "views_below_min": {
                                  "type": "integer",
                                  "description": "Rows with fewer views than `min_views`."
                                },
                                "views_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no view count, when `min_views` was sent."
                                },
                                "older_than_max_age": {
                                  "type": "integer",
                                  "description": "Rows published before the `max_age_days` window."
                                },
                                "date_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no publish date, when `max_age_days` was sent."
                                },
                                "country_not_included": {
                                  "type": "integer",
                                  "description": "Rows registered to a country that is not in `country`."
                                },
                                "country_unknown": {
                                  "type": "integer",
                                  "description": "Rows with no country, when `country` was sent."
                                },
                                "country_excluded": {
                                  "type": "integer",
                                  "description": "Rows registered to a country listed in `exclude_country`."
                                }
                              }
                            },
                            "repeats": {
                              "type": "integer",
                              "description": "Present when you sent `seen`: rows removed because your account already received them under that id."
                            },
                            "duplicates": {
                              "type": "integer",
                              "description": "Present when above zero: rows a later page repeated from an earlier page of the same walk, kept once."
                            },
                            "credits": {
                              "type": "object",
                              "description": "What the pages cost.",
                              "properties": {
                                "pages": {
                                  "type": "integer",
                                  "description": "Credits charged for the pages walked, before refunds."
                                },
                                "refunded": {
                                  "type": "integer",
                                  "description": "Credits refunded across the pages."
                                }
                              }
                            },
                            "request_ids": {
                              "type": "array",
                              "description": "The request id of each page walked. Each is its own entry in `GET /v1/credits/transactions`.",
                              "items": {
                                "type": "string",
                                "description": "A row id."
                              }
                            }
                          }
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/xing/search",
                  "data": {
                    "items": [
                      {
                        "job": {
                          "id": "YmVybGluLXNvZnR3YXJlLWVuZ2luZWVyLWZvdW5kaW5nLXRlYW0tMTU3Njc1NTky",
                          "title": "Software Engineer (Founding Team)",
                          "url": null,
                          "company": {
                            "id": null,
                            "name": "Junini GmbH",
                            "url": null,
                            "verified": null
                          },
                          "location": "Berlin",
                          "listed_at": "2026-10-02T08:32:56Z",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": "Full-time",
                          "experience_level": null,
                          "description": null,
                          "apply_url": null,
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": 55000,
                            "salary_max": 70000,
                            "salary_currency": "EUR",
                            "country_code": null,
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "xing"
                          }
                        }
                      },
                      {
                        "job": {
                          "id": "YmVybGluLXNvZnR3YXJlLWVuZ2luZWVyLXdlYi1tb2JpbGUtYW5kLWNyeXB0by0xNTgxODU5NTk=",
                          "title": "Software Engineer - Web & Mobile and Crypto",
                          "url": null,
                          "company": {
                            "id": null,
                            "name": "Avaloq",
                            "url": null,
                            "verified": null
                          },
                          "location": "Berlin",
                          "listed_at": "2026-09-28T22:59:28Z",
                          "easy_apply": null,
                          "remote": null,
                          "employment_type": "Full-time",
                          "experience_level": null,
                          "description": null,
                          "apply_url": null,
                          "ext": {
                            "applicant_count": null,
                            "job_provider": null,
                            "salary_min": 72500,
                            "salary_max": 114500,
                            "salary_currency": "EUR",
                            "country_code": null,
                            "linkedin_company_name": null,
                            "industries": null,
                            "job_function": null,
                            "accepting_applications": null,
                            "board": "xing"
                          }
                        }
                      }
                    ],
                    "next_cursor": "dD0xO3E9c29mdHdhcmUgZW5naW5lZXI7bD1CZXJsaW47ZHA9d2VlaztldD07Y2w9O3JvPTttcz0w",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 10,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoiZEQweE8zRTljMjltZEhkaGNtVWdaVzVuYVc1bFpYSTdiRDFDWlhKc2FXNDdaSEE5ZDJWbGF6dGxkRDA3WTJ3OU8zSnZQVHR0Y3owdyIsImUiOiJqb2JzL3hpbmcvc2VhcmNoIiwicCI6ImN1cnNvciJ9",
                    "has_more": true,
                    "page_size": 10
                  },
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/xing": {
      "get": {
        "summary": "Get a Xing job listing by id",
        "description": "Returns one Xing job: title, company, location, employment type, remote option, salary range, description, and apply URL. Use an id from GET /v1/jobs/xing/search.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_xing",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "advanced",
        "x-credit-cost": 5,
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Xing job id from xing/search.",
            "schema": {
              "type": "string"
            },
            "example": "YmVybGluLXNvZnR3YXJlZW50d2lja2xlci0xNTY4OTYwMjk="
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 600 seconds old is served; this endpoint keeps copies for 3600 seconds, so a value up to 3600 can save a call. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3600
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/xing"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "job": {
                          "type": "object",
                          "description": "Nested object: job",
                          "properties": {
                            "id": {
                              "type": "string",
                              "description": "String at job.id"
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.title"
                            },
                            "url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.url"
                            },
                            "company": {
                              "type": "object",
                              "description": "Nested object: job.company",
                              "properties": {
                                "id": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.id"
                                },
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.name"
                                },
                                "url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.company.url"
                                },
                                "verified": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.company.verified"
                                }
                              }
                            },
                            "location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.location"
                            },
                            "listed_at": {
                              "type": [
                                "string",
                                "number",
                                "null"
                              ],
                              "description": "Union: string | number | null"
                            },
                            "easy_apply": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at job.easy_apply"
                            },
                            "remote": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.remote"
                            },
                            "employment_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.employment_type"
                            },
                            "experience_level": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.experience_level"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.description"
                            },
                            "apply_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at job.apply_url"
                            },
                            "ext": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: job.ext",
                              "properties": {
                                "is_promote": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.is_promote"
                                },
                                "applicant_count": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.applicant_count"
                                },
                                "skills": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at job.ext.skills",
                                  "items": {
                                    "type": "string",
                                    "description": "String at job.ext.skills"
                                  }
                                },
                                "job_provider": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_provider"
                                },
                                "salary_min": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_min"
                                },
                                "salary_max": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Numeric at job.ext.salary_max"
                                },
                                "salary_currency": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.salary_currency"
                                },
                                "country_code": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.country_code"
                                },
                                "linkedin_company_name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.linkedin_company_name"
                                },
                                "industries": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.industries"
                                },
                                "job_function": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.job_function"
                                },
                                "accepting_applications": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Boolean at job.ext.accepting_applications"
                                },
                                "board": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at job.ext.board"
                                }
                              }
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "job"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/xing",
                  "data": {
                    "job": {
                      "id": "YmVybGluLXNlbmlvci1zb2x1dGlvbi1lbmdpbmVlci0xNTY3NTI5MTA=",
                      "title": "Senior Solution Engineer (m/w/d)",
                      "url": "https://jobdb.softgarden.de/jobdb/public/jobposting/applyonline/click?jp=66344808&utm_source=xing.com",
                      "company": {
                        "id": null,
                        "name": "Beta Systems Software AG",
                        "url": null,
                        "verified": null
                      },
                      "location": "Berlin",
                      "listed_at": "2026-09-10T16:15:52Z",
                      "easy_apply": null,
                      "remote": "remote",
                      "employment_type": "Full-time",
                      "experience_level": null,
                      "description": "Die Beta Systems Software-Gruppe ist ein führender unabhängiger Softwareanbieter mit Sitz in Berlin, der Unternehmen mit komplexen IT-Systemlandschaften und anspruchsvollen IT-Prozessen unterstützt. Seit über 40 Jahren am Markt, vertrauen weltweit über 800 Unternehmen auf unsere Lösungen, insbesondere in den Bereichen Finanzdienstleistungen, Versicherungen, Fertigung, Energie, Agrar &amp; Bau, Handel und IT-Services.\nDas Produktportfolio umfasst innovative Softwarelösungen zur Automatisierung, Dokumentation, Analyse und Überwachung von IT-Prozessen in den Bereichen Workload Automation, einschließlich einer Next-Gen Enterprise Automation- und Orchestrierungsplattform, Log Management, Output Management, Mainframe Utilities, IT Operations Management sowie Identity &amp; Access Management – sowohl on-premise als auch für Cloud-Umgebungen.\nZur Verstärkung unseres Teams suchen wir einen Senior Solution Engineer – Workload Automation ANOW! Suite (m/w/d), der unsere Vertriebsinitiativen im Enterprise-Umfeld unterstützt und mit passgenauen Automatisierungslösungen zum Kundenerfolg beiträgt. \nIn dieser Rolle bist du technischer Ansprechpartner für Unternehmenskunden verschiedener Branchen und arbeitest eng mit Vertrieb, Produktmanagement und Entwicklung zusammen. Du analysierst komplexe Kundenumgebungen, erkennst Automatisierungspotenziale und entwickelst skalierbare, sichere und leistungsstarke Lösungskonzepte, die auf die Geschäftsziele abgestimmt sind.",
                      "apply_url": "https://jobdb.softgarden.de/jobdb/public/jobposting/applyonline/click?jp=66344808&utm_source=xing.com",
                      "ext": {
                        "applicant_count": null,
                        "job_provider": null,
                        "salary_min": 52500,
                        "salary_max": 82500,
                        "salary_currency": "EUR",
                        "country_code": "DE",
                        "linkedin_company_name": null,
                        "industries": null,
                        "job_function": null,
                        "accepting_applications": null,
                        "board": "xing"
                      }
                    }
                  },
                  "credits_used": 5,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/salary/titles": {
      "get": {
        "summary": "Suggest job titles for a salary lookup",
        "description": "Returns known job titles matching a query in a country, each with a listing count. Use a returned title as query on GET /v1/jobs/salary.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_salary_titles",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Partial job title (for example programming, nurse).",
            "schema": {
              "type": "string"
            },
            "example": "software"
          },
          {
            "name": "country_code",
            "in": "query",
            "required": true,
            "description": "ISO 3166-1 alpha-2 country code.",
            "schema": {
              "type": "string"
            },
            "example": "us"
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 1800 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1800
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/salary/titles"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "metrics": {
                          "type": "object",
                          "description": "Key performance metrics",
                          "properties": {
                            "total_views": {
                              "type": "integer",
                              "description": "Total view count"
                            },
                            "total_likes": {
                              "type": "integer",
                              "description": "Total like count"
                            },
                            "total_comments": {
                              "type": "integer",
                              "description": "Total comment count"
                            },
                            "engagement_rate": {
                              "type": "number",
                              "description": "Computed engagement rate (0-1)"
                            }
                          }
                        },
                        "period": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Time period for the analytics data"
                        },
                        "breakdown": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Per-item or per-period breakdown",
                          "items": {
                            "type": "object",
                            "description": "Breakdown entry"
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/salary/titles",
                  "data": {
                    "jobTitles": [
                      {
                        "count": 11676,
                        "jobTitle": "software engineer"
                      },
                      {
                        "count": 8784,
                        "jobTitle": "senior software engineer"
                      }
                    ]
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/salary": {
      "get": {
        "summary": "Get salary ranges for a job title and country",
        "description": "Returns min, max, mean, and median pay for a job title in a country, broken out hourly, daily, weekly, monthly, and yearly, plus the local currency. Use GET /v1/jobs/salary/titles first when the title is uncertain.",
        "tags": [
          "jobs"
        ],
        "operationId": "get_jobs_salary",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Job title, preferably one returned by salary/titles.",
            "schema": {
              "type": "string"
            },
            "example": "software engineer"
          },
          {
            "name": "country_code",
            "in": "query",
            "required": true,
            "description": "ISO 3166-1 alpha-2 country code.",
            "schema": {
              "type": "string"
            },
            "example": "us"
          },
          {
            "name": "max_age_s",
            "in": "query",
            "required": false,
            "description": "The oldest cached copy you accept, in seconds. A copy that old or younger is served for 0 credits, with its age in `age_s` and the `X-Cache-Age` header. Without it a copy up to 1800 seconds old is served. A lower value fetches fresh (billed) when the copy is older, and 0 always fetches live, like `Cache-Control: no-cache`.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1800
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. To accept an older cached copy, or to require a younger one, send the `max_age_s` query parameter instead. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "jobs"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/jobs/salary"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "metrics": {
                          "type": "object",
                          "description": "Key performance metrics",
                          "properties": {
                            "total_views": {
                              "type": "integer",
                              "description": "Total view count"
                            },
                            "total_likes": {
                              "type": "integer",
                              "description": "Total like count"
                            },
                            "total_comments": {
                              "type": "integer",
                              "description": "Total comment count"
                            },
                            "engagement_rate": {
                              "type": "number",
                              "description": "Computed engagement rate (0-1)"
                            }
                          }
                        },
                        "period": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Time period for the analytics data"
                        },
                        "breakdown": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Per-item or per-period breakdown",
                          "items": {
                            "type": "object",
                            "description": "Breakdown entry"
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "credits_remaining_note": {
                      "type": "string",
                      "description": "Present only when `credits_remaining` is null by design, as on a free cache hit: says why the balance was not read and where to read it.",
                      "example": "not read on cache hits (credits_used is 0); call GET /v1/credits/balance for the current balance"
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "age_s": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Present only on a cache hit (`cached: true`): whole seconds since this copy was fetched, also sent as the `X-Cache-Age` header. Null for a copy stored before ages were recorded. Send `max_age_s` to set how old a copy you accept: a profile or post copy up to an hour old is served for 0 credits, and a lower value fetches fresh.",
                      "example": 340
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "jobs",
                  "endpoint": "/v1/jobs/salary",
                  "data": {
                    "country": "United States",
                    "countryCode": "US",
                    "currency": "USD",
                    "dailySalary": {
                      "max": 1029.328765759257,
                      "mean": 658.625178545061,
                      "median": 604.057736021952,
                      "min": 354.4890229302169
                    },
                    "hourlySalary": {
                      "max": 99.4538071166776,
                      "mean": 63.6364042744803,
                      "median": 58.3640947033583,
                      "min": 34.25075066805907
                    },
                    "lastUpdatedTimestamp": -417307432,
                    "monthlySalary": {
                      "max": 16398.55357434734,
                      "mean": 10492.76055917719,
                      "median": 9623.4298269594,
                      "min": 5647.47379788936
                    },
                    "weeklySalary": {
                      "max": 4237.736052071328,
                      "mean": 2711.55315655009,
                      "median": 2486.8995510726,
                      "min": 1459.427699396741
                    },
                    "yearlySalary": {
                      "max": 231612.5793158561,
                      "mean": 148199.3717455924,
                      "median": 135920.9758337433,
                      "min": 79764.7162609541
                    }
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    }
  },
  "x-full-spec": "https://www.socialcrawl.dev/v1/openapi.json"
}
