> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firmintent.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Job done

> When a job you submitted with `callback_url` finishes, firmintent POSTs this payload to it.
Respond `2xx` to acknowledge.



## OpenAPI

````yaml https://api.firmintent.com/openapi.json webhook job.done
openapi: 3.1.0
info:
  title: firmintent API
  description: >

    Give firmintent a **LinkedIn company and persona** — get back the **right
    people**.


    You submit a company — a **LinkedIn company URL** (`…/company/<slug-or-id>`)
    or a **bare numeric

    company id**; we scan and broadly enrich its roster, find likely persona
    candidates, verify the

    shortlist, and return a ranked target list. (Bare name/domain lookup is a
    later layer — not accepted

    yet.) Jobs run

    **asynchronously** (minutes) — you either poll `GET /v1/jobs/{id}` or
    receive a **webhook**.


    All endpoints are versioned under **`/v1`**. Pin the version; new fields are
    added within `/v1`,

    breaking changes ship under a new `/vN`.


    ### Authentication

    Every request needs an API key in the `X-API-Key` header. Generate yours in
    the

    [dashboard](https://app.firmintent.com/dashboard). `POST /v1/jobs` spends
    money, so it

    is never anonymous.


    ### The flow — two calls

    1. `POST /v1/jobs` `{ "input": "linkedin.com/company/<slug>", "operation":
    "target_people", "persona": "owners-founders" }` → `202 { job_id }`

    2. Poll `GET /v1/jobs/{job_id}` until `status: "done"` — that response
    contains
       `target_people[]` inline. No third call.

    Re-polling a finished job returns the same result (idempotent, already paid
    for), so a lost response

    never costs a new job.


    ### Webhook (optional — instead of polling)

    Pass `callback_url` on `POST /v1/jobs`. When the job is done we `POST` that
    URL with the full result:

    `{ job_id, company_id, company, status: "done", target_people_count,
    target_people[] }`. You just need

    an HTTPS endpoint on your side that returns `2xx`.
  contact:
    name: firmintent
    url: https://firmintent.com/
  version: 1.0.0
servers:
  - url: https://api.firmintent.com
    description: Production
security: []
tags:
  - name: jobs
    description: Submit and track target-people jobs.
  - name: account
    description: Your credit balance, tier and usage.
  - name: personas
    description: Saved target audiences used by persona-first jobs.
paths: {}

````