Should I Bid API

Your keyword analyses, from your own tools.

The same analysis as the app, driven by your scripts and automations: keyword ideas, quotes, launches and results, with the same credit rules and the same guardrails.

REST API · JSON · OpenAPI 3.1 · included in every paid plan

Create an API key

Getting started

First call in three steps.

One key, one header, one request.

  1. Key — Create an API key

    In Should I Bid › Integrations › Create a key. Check "Allow launching analyses" if your script must launch analyses. The key is shown only once; only its fingerprint is stored.

  2. Header — Send it in the header

    Every request carries the header Authorization: Bearer sib_live_… A key placed in the URL is refused: it would end up in logs.

  3. Call — Make your first call

    GET /api/v1/account returns your balance, your plan, your companies and their product ids.

curl -H "Authorization: Bearer $SIB_API_KEY" https://shouldibid.app/api/v1/account

Typical flow

From ideas to verdicts, in four calls.

The full Vision flow: generate ideas for a product, quote them, launch them, then read the results.

  1. Generate ideas (free)

    Up to 3 sources: company products or web pages. The response contains the new ideas, the ones already analyzed with their score, and a suggestion_batch_id valid 24 hours for a single launch.

    POST /api/v1/suggestions
    {"sources":[{"product_id":"…"}]}
  2. Ask for a quote

    Nothing is launched: cleaned list, credits to reserve, available balance, today's cap and any blockers.

    POST /api/v1/analyses/estimate
    {"suggestion_batch_id":"…"}
  3. Launch the analysis

    max_credits is required: it is the maximum amount you accept. For a Vision batch, only recommended keywords (score of 50 or more) are charged. Response 201 with the analysis id.

    POST /api/v1/analyses
    {"suggestion_batch_id":"…","max_credits":20}
  4. Poll, then read the results

    An analysis takes 3 to 10 minutes: poll it every 30 to 60 seconds until it is done, then read the Bid, Test or Don't bid verdicts, sorted by score.

    GET /api/v1/analyses/{analysis_id}

Reference

Every route of API v1.

Base URL: https://shouldibid.app/api/v1. JSON responses, never cached, with an X-Request-Id header to give to support.

MethodPathPurpose
GET/api/v1/accountAccount: plan, available credits, today's cap, companies and products.
GET/api/v1/analysesAnalysis history, with filters (status, company, name) and pagination.
POST/api/v1/analysesLaunches an analysis (uses credits); max_credits required.
POST/api/v1/analyses/estimateQuote without launching anything: credits to reserve, balance, cap, blockers.
GET/api/v1/analyses/{analysis_id}Progress and results of an analysis, keywords sorted by score.
POST/api/v1/analyses/{analysis_id}/cancelStops a running analysis; keywords not analyzed yet are not charged.
GET/api/v1/analyses/{analysis_id}/keywords/{keyword_id}Detail of one keyword: score, decision, sub-scores, reasoning, advertisers.
POST/api/v1/suggestionsVision keyword ideas from 1 to 3 sources (free).
GET/api/v1/openapi.jsonThis reference in OpenAPI 3.1 format (public, no key).

Guardrails

The same rules as the app.

Designed so that a script can never spend more than planned.

Per-key permissions

Read-only by default; launching analyses is an explicit checkbox on the key. At most 10 active keys, instant revocation.

Daily cap

At most 200 credits per 24 hours for all launches outside the app, adjustable in Integrations (0 = no launches).

One analysis at a time

Only one analysis launched through the API or Claude can run at a time; a second launch gets a 409 error.

200 keywords per launch

Beyond that, the request is refused with the list of extra keywords: nothing is silently cut.

Rate limits

120 reads and 10 writes per minute; suggestions: 5 per minute and 30 per day, per account.

Isolation

A key only sees its own account's analyses and companies; "does not exist" and "not yours" return the same 404 error.

Errors

Stable codes.

Every error carries a fixed code, an English message and the request id.

Format

{ "error": { "code": "…", "message": "…", "details": { }, "request_id": "…" } }
CodeHTTPMeaning
unauthorized401Missing, invalid or revoked key.
forbidden403Account without a paid plan (details.reason = plan_required, with the link to the plans) or access not open yet.
insufficient_scope403Read-only key for a launch action.
api_disabled503API temporarily closed.
not_found404Resource does not exist or belongs to another account.
method_not_allowed405Method not allowed (see the Allow header).
invalid_request422Invalid parameters (details in details.issues).
payload_too_large413Request body larger than 256 KB.
rate_limited429Too many requests (see the Retry-After header).
insufficient_credits402Not enough credits.
daily_cap_reached429Daily cap reached.
analysis_in_progress409An analysis launched outside the app is already running.
too_many_keywords422More than 200 keywords in the launch.
max_credits_exceeded422The cost exceeds max_credits.
company_required422Several companies: set company_id.
suggestion_batch_invalid422Unknown, expired or already used suggestion batch.
unavailable503Service temporarily unavailable: retry.
internal500Unexpected error: give the request_id to support.

OpenAPI specification

The full machine-readable description: import it into Postman, Insomnia or a client generator.

https://shouldibid.app/api/v1/openapi.json

Connect Should I Bid to your automations.

Create an API key

Included in every paid plan · 1 credit = 1 keyword analyzed