@meterapp/car-image-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/client.d.ts +113 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +400 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +52 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +98 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +265 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +404 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/params.d.ts +12 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +87 -0
- package/dist/params.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +33 -0
- package/dist/retry.js.map +1 -0
- package/dist/types.d.ts +353 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +71 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Meter
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# @meterapp/car-image-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for the **Car Image API** by Meter — studio-quality, transparent-background renders of any vehicle in the open [`@meterapp/vehicle-db`](https://github.com/MeterApp/vehicle-db) catalog (1,145 makes, 14,841 models, model years 1990–2026).
|
|
4
|
+
|
|
5
|
+
- Zero runtime dependencies. Works in Node 20+, Vercel/Cloudflare edge runtimes, Deno, Bun and browsers.
|
|
6
|
+
- Typed parameters and responses for every endpoint.
|
|
7
|
+
- `CarImageError` carries `status`, `title`, `detail`, `requestId` and the raw RFC 9457 problem.
|
|
8
|
+
- Automatic retries with full jitter on `429`/`503` (honoring `Retry-After`); never retries `402`.
|
|
9
|
+
- Shared MCP tool definitions (`@meterapp/car-image-sdk/mcp`) used by both the stdio and the remote MCP servers.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @meterapp/car-image-sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Pricing in one line
|
|
16
|
+
|
|
17
|
+
Every delivered image costs **1 credit** whether it comes from cache or is freshly generated. **$1 = 1,000 credits**, every account starts with **100 free credits**, there is no subscription. Signed delivery URLs cost 1 credit when created; loading them is free.
|
|
18
|
+
|
|
19
|
+
Get a key at <https://car-imgs.vercel.app/dashboard> or run `npx @meterapp/car-image login`.
|
|
20
|
+
|
|
21
|
+
## Quickstart (Node)
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { CarImageClient } from "@meterapp/car-image-sdk";
|
|
25
|
+
import { writeFile } from "node:fs/promises";
|
|
26
|
+
|
|
27
|
+
const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });
|
|
28
|
+
|
|
29
|
+
const image = await client.getImage({
|
|
30
|
+
make: "Porsche",
|
|
31
|
+
model: "911",
|
|
32
|
+
year: 2024,
|
|
33
|
+
view: "front-3-4", // front | front-3-4 | side | side-right | rear | rear-3-4
|
|
34
|
+
color: "red", // 15 presets: white black gray silver blue red green brown beige tan orange yellow gold burgundy purple
|
|
35
|
+
size: "medium", // thumb=256 small=512 medium=768 large=1024 (or width/height up to 1024)
|
|
36
|
+
format: "png", // png | webp | jpg
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await writeFile("porsche-911.png", image.bytes);
|
|
40
|
+
console.log(image.source, image.creditsCharged, image.creditsRemaining, image.requestId);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`apiKey` and `baseUrl` fall back to `CAR_IMAGE_API_KEY` / `CAR_IMAGE_API_URL` when running on a server.
|
|
44
|
+
|
|
45
|
+
## Next.js route handler
|
|
46
|
+
|
|
47
|
+
Keep the key on the server; hand the browser signed URLs.
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
// app/api/car-image/route.ts
|
|
51
|
+
import { CarImageClient, CarImageError } from "@meterapp/car-image-sdk";
|
|
52
|
+
|
|
53
|
+
const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });
|
|
54
|
+
|
|
55
|
+
export async function POST(request: Request) {
|
|
56
|
+
const { make, model, year } = await request.json();
|
|
57
|
+
try {
|
|
58
|
+
const { data } = await client.createImageUrls([{ make, model, year, view: "side" }], {
|
|
59
|
+
ttlSeconds: 24 * 60 * 60, // 1 minute to 7 days
|
|
60
|
+
maxUses: 0, // 0 = unlimited redemptions until expiry
|
|
61
|
+
});
|
|
62
|
+
return Response.json({ url: data[0].url, expiresAt: data[0].expires_at });
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error instanceof CarImageError) {
|
|
65
|
+
return Response.json({ error: error.detail, requestId: error.requestId }, { status: error.status });
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Browser
|
|
73
|
+
|
|
74
|
+
Never ship the API key to a browser. Create signed URLs server-side (above) and use them like any image:
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<img src="https://car-imgs.vercel.app/api/v1/delivery/…" alt="2024 Porsche 911, side view" />
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The SDK itself is browser-safe (no Node APIs), which is useful for public endpoints such as `options()`, `vehicles()` and `searchVehicles()` that need no key.
|
|
81
|
+
|
|
82
|
+
## Everything else
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
await client.getImageUrl(params); // 1 credit, returns a signed URL instead of bytes
|
|
86
|
+
await client.options(); // views, colors, sizes, formats, pricing, catalog coverage
|
|
87
|
+
await client.resolve("red 2024 porsche 911 side view"); // free text -> { make, model, year, view, color } + candidates
|
|
88
|
+
await client.vehicles(); // years
|
|
89
|
+
await client.vehicles({ year: 2024 }); // makes for a year
|
|
90
|
+
await client.vehicles({ year: 2024, makeId: 7 }); // models for a year + make
|
|
91
|
+
await client.searchVehicles("porshe 911", { limit: 5 }); // fuzzy catalog search
|
|
92
|
+
await client.feedback({ requestId, verdict: "good" }); // or { make, model, year, rating: 4, reason }
|
|
93
|
+
await client.account(); // credits, auto-reload, usage_30d, key scopes
|
|
94
|
+
await client.createCheckout(5000); // hosted Stripe Checkout URL (scope billing:write)
|
|
95
|
+
await client.billingPortal(); // Stripe Customer Portal URL
|
|
96
|
+
await client.health(); // { status: "ok" | "degraded", checks }
|
|
97
|
+
await client.openapi(); // the OpenAPI 3.1 document
|
|
98
|
+
await client.fetch("/api/v1/account"); // authenticated raw fetch (same-origin only)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Error handling
|
|
102
|
+
|
|
103
|
+
All failures throw `CarImageError`:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { CarImageError } from "@meterapp/car-image-sdk";
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
await client.getImage({ make: "Porsche", model: "911", year: 2024 });
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (error instanceof CarImageError) {
|
|
112
|
+
error.status; // 400 | 401 | 402 | 404 | 429 | 502 | 0 (network)
|
|
113
|
+
error.title; // "Insufficient credits"
|
|
114
|
+
error.detail; // "This request needs 1 credit; balance is 0"
|
|
115
|
+
error.requestId; // "0d1e…" — quote this when contacting support
|
|
116
|
+
error.problem; // the raw application/problem+json body (402 includes balance, required_credits)
|
|
117
|
+
error.retryAfterSeconds; // set on 429
|
|
118
|
+
if (error.isInsufficientCredits) {
|
|
119
|
+
// Send a human to https://car-imgs.vercel.app/billing — never buy credits automatically.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Retries: `429` and `503` are retried up to `maxRetries` (default 2) with full-jitter exponential backoff, honoring `Retry-After`. Network failures are retried for `GET` only, so a `POST` is never duplicated. Configure with `new CarImageClient({ maxRetries, retryBaseDelayMs, maxRetryDelayMs, timeoutMs })` or per call via `{ retries }`.
|
|
126
|
+
|
|
127
|
+
## MCP tool definitions
|
|
128
|
+
|
|
129
|
+
`@meterapp/car-image-sdk/mcp` exports the tool names, zod input schemas, descriptions, annotations and the server instructions shared by the `car-image mcp` stdio server and the remote server at `https://car-imgs.vercel.app/api/mcp`. It needs `zod` (an optional peer dependency); the main entry point does not.
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
import { MCP_TOOLS, MCP_INSTRUCTIONS, formatApiReference } from "@meterapp/car-image-sdk/mcp";
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Types
|
|
136
|
+
|
|
137
|
+
`View`, `Color`, `Size`, `Format`, `ImageParams`, `ImageResult`, `CreateImageUrlsResponse`, `OptionsResponse`, `ResolveResponse`, `VehicleSearchResponse`, `AccountResponse`, … plus the constant arrays `VIEWS`, `COLORS`, `SIZES`, `FORMATS`.
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT © Meter
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type AccountResponse, type CheckoutResponse, type CreateImageUrlsOptions, type CreateImageUrlsResponse, type DeviceCodeResponse, type DeviceTokenResult, type FeedbackInput, type FeedbackResponse, type FetchLike, type HealthResponse, type ImageParams, type ImageResult, type ImageUrlResponse, type OpenApiDocument, type OptionsResponse, type PortalResponse, type ResolveResponse, type TelemetryEvent, type VehicleMakesResponse, type VehicleModelsResponse, type VehicleSearchResponse, type VehicleYearsResponse } from "./types.js";
|
|
2
|
+
export interface CarImageClientOptions {
|
|
3
|
+
/** `cimg_…` key. Falls back to `process.env.CAR_IMAGE_API_KEY` when running on a server. */
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
/** API origin; defaults to `process.env.CAR_IMAGE_API_URL` or https://car-imgs.vercel.app. */
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
/** Custom fetch (tests, polyfills, instrumentation). Defaults to `globalThis.fetch`. */
|
|
8
|
+
fetch?: FetchLike;
|
|
9
|
+
/** Sent as `User-Agent` (ignored by browsers). Defaults to `car-image-sdk/<version>`. */
|
|
10
|
+
userAgent?: string;
|
|
11
|
+
/** Retries on 429/503 (and network failures for GET). Default 2; 0 disables. */
|
|
12
|
+
maxRetries?: number;
|
|
13
|
+
/** Base for exponential backoff with full jitter. Default 500 ms. */
|
|
14
|
+
retryBaseDelayMs?: number;
|
|
15
|
+
/** Upper bound for any single wait, including `Retry-After`. Default 30 000 ms. */
|
|
16
|
+
maxRetryDelayMs?: number;
|
|
17
|
+
/** Per-attempt timeout. Unset by default. */
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
/** Sleep implementation; injectable for tests. */
|
|
20
|
+
sleep?: (ms: number) => Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface RequestOptions {
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
/** Overrides the client-wide `maxRetries` for this call. */
|
|
25
|
+
retries?: number;
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Client for the Car Image API. Safe for Node 20+, edge runtimes and browsers
|
|
31
|
+
* (in browsers, prefer signed delivery URLs created server-side so the API key
|
|
32
|
+
* never ships to the client).
|
|
33
|
+
*/
|
|
34
|
+
export declare class CarImageClient {
|
|
35
|
+
readonly baseUrl: string;
|
|
36
|
+
readonly userAgent: string;
|
|
37
|
+
readonly maxRetries: number;
|
|
38
|
+
readonly retryBaseDelayMs: number;
|
|
39
|
+
readonly maxRetryDelayMs: number;
|
|
40
|
+
readonly timeoutMs: number | undefined;
|
|
41
|
+
private readonly apiKey;
|
|
42
|
+
private readonly fetchImpl;
|
|
43
|
+
private readonly sleep;
|
|
44
|
+
constructor(options?: CarImageClientOptions);
|
|
45
|
+
/** Whether a key is configured; the key itself is never exposed. */
|
|
46
|
+
get hasApiKey(): boolean;
|
|
47
|
+
/** Display form such as `cimg_A1b2…9zY`; never logs the full key. */
|
|
48
|
+
maskedApiKey(): string | null;
|
|
49
|
+
/** Keeps the key out of `JSON.stringify(client)`, logs and error reports. */
|
|
50
|
+
toJSON(): Record<string, unknown>;
|
|
51
|
+
/** GET /api/v1/images/car — 1 credit; returns the bytes plus billing headers. */
|
|
52
|
+
getImage(params: ImageParams, options?: RequestOptions): Promise<ImageResult>;
|
|
53
|
+
/** GET /api/v1/images/car with `Accept: application/json` — 1 credit; returns a signed URL. */
|
|
54
|
+
getImageUrl(params: ImageParams, options?: RequestOptions): Promise<ImageUrlResponse>;
|
|
55
|
+
/**
|
|
56
|
+
* POST /api/v1/image-urls — 1 credit per URL, charged at creation. Up to 50
|
|
57
|
+
* images per call. Redemptions are free within the TTL.
|
|
58
|
+
*/
|
|
59
|
+
createImageUrls(images: ImageParams | ImageParams[], options?: CreateImageUrlsOptions & RequestOptions): Promise<CreateImageUrlsResponse>;
|
|
60
|
+
/** GET /api/v1/images/options — public; views, colors, sizes, formats, pricing, catalog. */
|
|
61
|
+
options(options?: RequestOptions): Promise<OptionsResponse>;
|
|
62
|
+
/** POST /api/v1/images/resolve — free; turns "red 2024 porsche 911 side view" into parameters. */
|
|
63
|
+
resolve(query: string, options?: RequestOptions): Promise<ResolveResponse>;
|
|
64
|
+
/** GET /api/v1/vehicles — public. No filter: years; `year`: makes; `year`+`makeId`: models. */
|
|
65
|
+
vehicles(filter?: Record<string, never>, options?: RequestOptions): Promise<VehicleYearsResponse>;
|
|
66
|
+
vehicles(filter: {
|
|
67
|
+
year: number;
|
|
68
|
+
}, options?: RequestOptions): Promise<VehicleMakesResponse>;
|
|
69
|
+
vehicles(filter: {
|
|
70
|
+
year: number;
|
|
71
|
+
makeId: number;
|
|
72
|
+
}, options?: RequestOptions): Promise<VehicleModelsResponse>;
|
|
73
|
+
/** GET /api/v1/vehicles?q= — public fuzzy search across makes and models. */
|
|
74
|
+
searchVehicles(query: string, options?: {
|
|
75
|
+
limit?: number;
|
|
76
|
+
year?: number;
|
|
77
|
+
} & RequestOptions): Promise<VehicleSearchResponse>;
|
|
78
|
+
/** POST /api/v1/feedback — free; rate a delivered image by request id or by vehicle. */
|
|
79
|
+
feedback(input: FeedbackInput, options?: RequestOptions): Promise<FeedbackResponse>;
|
|
80
|
+
/** GET /api/v1/account — credits, auto-reload, 30-day usage, key scopes. */
|
|
81
|
+
account(options?: RequestOptions): Promise<AccountResponse>;
|
|
82
|
+
/** POST /api/v1/billing/checkout — hosted Stripe Checkout URL (scope billing:write). */
|
|
83
|
+
createCheckout(credits: number, options?: RequestOptions): Promise<CheckoutResponse>;
|
|
84
|
+
/** POST /api/v1/billing/portal — Stripe Customer Portal URL (scope billing:write). */
|
|
85
|
+
billingPortal(options?: RequestOptions): Promise<PortalResponse>;
|
|
86
|
+
/** GET /api/health — public. */
|
|
87
|
+
health(options?: RequestOptions): Promise<HealthResponse>;
|
|
88
|
+
/** GET /openapi.json — public machine-readable contract. */
|
|
89
|
+
openapi(options?: RequestOptions): Promise<OpenApiDocument>;
|
|
90
|
+
/** POST /api/auth/device/code — start browser-assisted login (public). */
|
|
91
|
+
startDeviceLogin(input?: {
|
|
92
|
+
clientName?: string;
|
|
93
|
+
}, options?: RequestOptions): Promise<DeviceCodeResponse>;
|
|
94
|
+
/** POST /api/auth/device/token — one poll; returns pending/expired/approved without throwing. */
|
|
95
|
+
pollDeviceLogin(deviceCode: string, options?: RequestOptions): Promise<DeviceTokenResult>;
|
|
96
|
+
/** POST /api/v1/events — anonymous telemetry; public, never retried. */
|
|
97
|
+
trackEvents(events: TelemetryEvent[], options?: RequestOptions): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Authenticated raw fetch for anything not covered above. No retries, no
|
|
100
|
+
* throwing on HTTP errors. The `Authorization` header is only attached when
|
|
101
|
+
* the target shares the client's origin, so a foreign URL never sees the key.
|
|
102
|
+
*/
|
|
103
|
+
fetch(pathOrUrl: string, init?: RequestInit): Promise<Response>;
|
|
104
|
+
private url;
|
|
105
|
+
private sameOrigin;
|
|
106
|
+
private json;
|
|
107
|
+
private signalFor;
|
|
108
|
+
/** Sends and throws `CarImageError` on any non-2xx response. */
|
|
109
|
+
private send;
|
|
110
|
+
/** Sends with retries but returns the final response, whatever its status. */
|
|
111
|
+
private rawSend;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|