Install any skill in seconds. Free to start, no credit card required.
Get Started Free →ledgerhq/card-endpoint-shape
Read this before adding or editing an endpoint in `domain/api/card-management/src/api.ts`.
Passed 19 of 22 test cases with the skill, and 10 of 22 without it.
and 19 more in the full report
10 fixed9 passed either way2 still failing1 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 10 test cases the skill fixed. Same model, same prompt, with and without the skill.
What `extraOptions` configuration must be supplied for an OAuth grant endpoint to prevent automatic Bearer token injection and infinite 401 refresh loops?
| Checked | Without skill | With skill |
|---|---|---|
| Configures extraOptions with authenticated set to false. | Missed | Passed |
The instructions your model reads when the skill loads.
Every endpoint is a declaration. Four keys, always in this order:
someEndpoint: build.query<Canonical, Request>({
query: (request) => ({
url: "/v1/some/path",
method: "GET",
}),
rawResponseSchema: SomeWireSchema, // the wire shape
transformResponse: transformSome, // wire -> canonical
responseSchema: SomeSchema, // what callers receive
});
| Key | Answers | Lives in |
|---|---|---|
query | What we send | api.ts |
rawResponseSchema | What the backend promised | schema.ts |
transformResponse | How it becomes ours | transforms.ts |
responseSchema | What the caller gets | schema.ts |
Drop the keys you do not need. An endpoint whose wire shape is already canonical declares
responseSchema alone — logout and getUser both do.
Return the wire contract, nothing more. A field the backend never sent does not belong on the answer. If a caller needs one of its own request values afterwards, it already has it.
queryFnqueryFn is the escape hatch for endpoints that are not one HTTP call. None here is, and it costs
more than it looks:
transformResponse for a queryFn endpoint. getTransformCallbackForEndpoint
in buildThunks is guarded by endpointDefinition.query &&. The mapper is silently ignored, so the
mapping moves inside the function, by hand.baseQuery result is unknown, so the body needs a cast or a manual safeParse.if (response.error) return { error: response.error }.test cases passed, vs 10 / 22 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.