# Store Listing: Order a job, or get the offer: the price and the exact next call.

URL: https://services.dev/docs/examples/lingua/api/order_store_listing

## Store Listing: Order a job, or get the offer: the price and the exact next call.

`POST /jobs` · `order_store_listing`

Status: live

Your app store listing, written for each language you sell in. $29 per job, within 48 hours, charged on delivery. AI delivers every job.

### Parameters

- `service` string · required: The Service to order: "store-listing".
- `app` string · text · required: what the app does, such as a budgeting app for couples
- `languages` string[] · language · required: such as fr, de, ja
- `tone`  · required
- `max_usd` number: The most you will pay, in dollars. Missing or below the price, you get an offer instead of a job.
- `key` string: Any string you choose. Retrying with the same key returns the same job.
- `metadata` object: Your own keys, echoed on the job and its events.
- `test_clock` string: A test clock the job runs on: tc_….

### Returns

- 200 job: The same job, for a key already used.
- 202 job: The job, working.
- 400 error: BLOCKED: body_invalid, version_unknown. (not captured yet)
- 401 error: BLOCKED: key_missing, key_invalid. (not captured yet)
- 402 OFFER: OFFER: the price and the exact next call.
- 403 error: BLOCKED: not_live, act_refused, region_not_ratified, brand_unverified. (not captured yet)
- 404 error: EMPTY: not_found. (not captured yet)
- 409 error: BLOCKED: key_reused.
- 422 error: BLOCKED: input_invalid, policy_invalid.
- 500 error: BLOCKED: api_error. (not captured yet)

### CLI

```
$ npx services.dev store-listing app=a budgeting app for couples languages=fr,de,ja tone=plain service=store-listing
OFFER · $29 per job, within 48 hours, charged on delivery.
  next    npx services.dev store-listing app="a budgeting app for couples" languages=fr,de,ja tone=plain --max 29

$ npx services.dev store-listing app="a budgeting app for couples" languages=fr,de,ja tone=plain --max 29
job_7Hv5 · working · $29.00 held
```

### API

```
curl http://localhost:8787/jobs \
  -H 'content-type: application/json' \
  -d '{"service":"store-listing","app":"a budgeting app for couples","languages":["fr","de","ja"],"tone":"plain","max_usd":29,"key":"any-string-you-choose"}'
```

### MCP

```
→ tools/call order_store_listing {"app":"a budgeting app for couples","languages":["fr","de","ja"],"tone":"plain","max_usd":29,"key":"store-listing-1"}
← job_7Hv5 · working · $29.00 held
```

### SDK

```
import { connect } from 'services.dev/agent'

const lingua = connect('http://localhost:8787', { budget: 100 })
const job = await lingua.order('store-listing', {"app":"a budgeting app for couples","languages":["fr","de","ja"],"tone":"plain"}, { key: 'store-listing-1' })
```

### 202 job

```json
{
  "id": "job_7Hv5",
  "object": "job",
  "created": "2026-10-25T14:01:04.000Z",
  "livemode": false,
  "simulated": true,
  "service": "store-listing",
  "input": {
    "app": "a budgeting app for couples",
    "languages": [
      "fr",
      "de",
      "ja"
    ],
    "tone": "plain"
  },
  "metadata": {},
  "price": {
    "usd": 29,
    "approved": false,
    "max_usd": 29
  },
  "payment": {
    "status": "held",
    "amount_usd": 29
  },
  "human": "AI delivers every job.",
  "stage": null,
  "steps": [
    {
      "id": "stp_1",
      "object": "step",
      "step": "draft",
      "by": "ai",
      "status": "working"
    },
    {
      "id": "stp_2",
      "object": "step",
      "step": "review",
      "by": "ai",
      "review": "adversarial",
      "status": "pending"
    }
  ],
  "next": [
    {
      "do": "get",
      "arguments": {
        "id": "job_7Hv5"
      },
      "tool": "get_job",
      "http": "GET http://localhost:8787/jobs/job_7Hv5?wait=50"
    },
    {
      "do": "cancel",
      "arguments": {
        "id": "job_7Hv5"
      },
      "tool": "cancel_job",
      "http": "POST http://localhost:8787/jobs/job_7Hv5/cancel"
    }
  ],
  "status": "working"
}
```

### 200 job

```json
{
  "id": "job_7Hv5",
  "object": "job",
  "created": "2026-10-25T14:01:04.000Z",
  "livemode": false,
  "simulated": true,
  "service": "store-listing",
  "input": {
    "app": "a budgeting app for couples",
    "languages": [
      "fr",
      "de",
      "ja"
    ],
    "tone": "plain"
  },
  "metadata": {},
  "price": {
    "usd": 29,
    "approved": false,
    "max_usd": 29
  },
  "payment": {
    "status": "charged",
    "amount_usd": 29
  },
  "human": "AI delivers every job.",
  "stage": "review",
  "steps": [
    {
      "id": "stp_1",
      "object": "step",
      "step": "draft",
      "by": "ai",
      "status": "committed",
      "hash": "sha256:427ad824e2a596a2509ffc82f0a8fbfdde55469f6377e9c13a26aa68c7f3fbd2"
    },
    {
      "id": "stp_2",
      "object": "step",
      "step": "review",
      "by": "ai",
      "review": "adversarial",
      "verdict": "pass",
      "status": "committed",
      "hash": "sha256:95851b48d6d0adf87f5c3d1210a3157976f66081111d2367176e5f8c92508cb2"
    }
  ],
  "next": [
    {
      "do": "accept",
      "arguments": {
        "id": "job_7Hv5"
      },
      "tool": "accept_job",
      "http": "POST http://localhost:8787/jobs/job_7Hv5/accept"
    },
    {
      "do": "send_back",
      "arguments": {
        "id": "job_7Hv5",
        "note": ""
      },
      "tool": "send_back_job",
      "http": "POST http://localhost:8787/jobs/job_7Hv5/send_back"
    }
  ],
  "status": "delivered",
  "output": {
    "listing": {
      "url": "data:text/plain,Simulated%20Store%20Listing%3A%20listing",
      "name": "listing.txt"
    }
  },
  "final_at": "2026-11-01T14:01:18.000Z"
}
```

### 402 OFFER

```json
{
  "type": "OFFER",
  "object": "offer",
  "service": "store-listing",
  "title": "Store Listing",
  "price": {
    "usd": 29,
    "sentence": "$29 per job, within 48 hours, charged on delivery."
  },
  "eta": "48h",
  "terms": "Charged on delivery. Cancel at $0 until it ships. Send it back with a note and the AI redoes it, or you pay $0. Final 7 days after delivery.",
  "next": {
    "do": "order",
    "service": "store-listing",
    "arguments": {
      "app": "a budgeting app for couples",
      "languages": [
        "fr",
        "de",
        "ja"
      ],
      "tone": "plain",
      "max_usd": 29,
      "key": "store-listing-1",
      "service": "store-listing"
    },
    "tool": "order_job",
    "http": "POST http://localhost:8787/jobs {\"service\":\"store-listing\"}"
  },
  "simulated": true
}
```

### 422 input_invalid

```json
{
  "type": "BLOCKED",
  "category": "invalid_request",
  "code": "input_invalid",
  "reason": "Missing tone.",
  "param": "tone",
  "next": {
    "do": "order",
    "service": "store-listing",
    "arguments": {
      "app": "a budgeting app for couples",
      "languages": [
        "fr",
        "de",
        "ja"
      ],
      "max_usd": 29,
      "key": "store-listing-1-short",
      "tone": null,
      "service": "store-listing"
    },
    "fill": [
      "tone"
    ],
    "tool": "order_job",
    "http": "POST http://localhost:8787/jobs {\"service\":\"store-listing\"}"
  },
  "doc_url": "http://localhost:8787/docs/errors/input_invalid",
  "request_id": "req_hoUr9B",
  "simulated": true
}
```

### 409 key_reused

```json
{
  "type": "BLOCKED",
  "category": "conflict",
  "code": "key_reused",
  "reason": "That key was already sent with a different body.",
  "param": "key",
  "next": {
    "do": "order",
    "service": "store-listing",
    "arguments": {
      "app": "other",
      "languages": [
        "fr",
        "de",
        "ja"
      ],
      "tone": "plain",
      "max_usd": 29,
      "key": "order-ab042982",
      "service": "store-listing"
    },
    "tool": "order_job",
    "http": "POST http://localhost:8787/jobs {\"service\":\"store-listing\"}"
  },
  "doc_url": "http://localhost:8787/docs/errors/key_reused",
  "request_id": "req_KfUK6y",
  "simulated": true
}
```
