{"openapi":"3.1.0","info":{"title":"PennyForYours API","version":"0.1.0","summary":"Ask verified real people quick questions and get signed answers.","description":"Ask verified real people quick questions about an image or a short text, and get structured answers with a signed receipt for each. Sandbox only during early access: keys start pfy_test_, questions are answered by synthetic members and nothing is charged. Priced per answer by answer type (launch example: a quick take from 30p a person plus 50p a question); free during early access. Every call needs an operator API key; keyless access is not available. Not for regulated advice, collecting personal data, or writing reviews. The same operations are available as MCP tools at /mcp. Rules for agents: https://pennyforyours.com/agents/. Which checks run on answers: https://pennyforyours.com/developers/human-proof/."},"servers":[{"url":"https://pennyforyours.com/v1"}],"security":[{"apiKey":[]}],"paths":{"/health":{"get":{"operationId":"health","security":[],"summary":"Liveness","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"const":"ok"},"version":{"type":"string"}}}}}}}}},"/openapi.json":{"get":{"operationId":"openApi","security":[],"summary":"This document","responses":{"200":{"description":"OpenAPI 3.1 document"}}}},"/jwks.json":{"get":{"operationId":"receiptKeys","security":[],"summary":"Public keys for receipt verification (JWKS, also at /.well-known/jwks.json)","responses":{"200":{"description":"JSON Web Key Set (public keys only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Jwks"}}}}}}},"/sandbox/jwks.json":{"get":{"operationId":"sandboxReceiptKeys","security":[],"summary":"Public keys for sandbox receipts only (kid starts sbx-)","description":"Sandbox receipts are signed with a separate key that is not in the production JWKS, so they can never pass as proof of a real person. Use this set only to test your verification code.","responses":{"200":{"description":"JSON Web Key Set (public keys only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Jwks"}}}}}}},"/question-types":{"get":{"operationId":"listQuestionTypes","summary":"Question types you can ask","responses":{"200":{"description":"Catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionTypes"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/topics":{"get":{"operationId":"listTopics","summary":"Topic codes you can tag a question with","description":"Members choose which questions to answer from a board they can filter and sort by pay, time, topic and answer type. Tag your question with up to 3 of these so people who like the subject find it.","responses":{"200":{"description":"Topic catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topics"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/quotes":{"post":{"operationId":"createQuote","summary":"Price and time estimate for a question","description":"Free during early access: charge_minor is 0 and launch_example_total_minor shows what it would cost later.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionSpec"}}}},"responses":{"201":{"description":"Quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/uploads":{"post":{"operationId":"uploadAsset","summary":"Upload an image (PNG, JPEG or WebP) or a sound clip (MP3, M4A, AAC, Ogg Opus or Vorbis, WAV)","description":"Send the raw bytes as the body. The limit is 4 MB, which keeps it under the hosting platform cap on binary request bodies (about 4.5 MB). Images: metadata (EXIF, XMP, text chunks) is stripped before hashing. Sound clips: up to 90 seconds, read from the file itself; the type is checked by content, not by name; tags (ID3, MP4 and Ogg comments, RIFF INFO) are removed before hashing; a person listens to every clip before members hear it. The returned sha256 is the ah value receipts will carry. Links are not accepted: URL questions are disabled.","requestBody":{"required":true,"content":{"image/png":{},"image/jpeg":{},"image/webp":{},"audio/mpeg":{},"audio/mp4":{},"audio/aac":{},"audio/ogg":{},"audio/wav":{}}},"parameters":[{"name":"X-Asset-Alt","in":"header","required":false,"schema":{"type":"string"},"description":"Images: a description for screen-reader users. Sound clips (required): one sentence, 10 to 200 characters, saying what the clip is, percent-encoded UTF-8."},{"name":"X-Asset-Transcript","in":"header","required":false,"schema":{"type":"string"},"description":"Sound clips: an optional transcript, up to 1,000 characters, percent-encoded UTF-8. Shown to members beside the player."},{"name":"X-Asset-Rights","in":"header","required":false,"schema":{"const":"confirmed"},"description":"Sound clips (required): \"confirmed\" means you own the audio or have permission to use it. Without it the upload is refused (422 rights-not-confirmed)."}],"responses":{"201":{"description":"Uploaded; screened before use","content":{"application/json":{"schema":{"type":"object","properties":{"upload_id":{"type":"string"},"sha256":{"type":"string"},"screening_state":{"type":"string"},"kind":{"const":"audio","description":"Sound clips only."},"duration_ms":{"type":"integer","description":"Sound clips only: playing time read from the file."}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"413":{"$ref":"#/components/responses/Problem"},"415":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/questions":{"post":{"operationId":"askHumans","summary":"Ask a question","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":100}},{"name":"X-Agent-Name","in":"header","required":false,"schema":{"type":"string"},"description":"Shown to members as \"asked through an AI tool\"."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionSpec"}}}},"responses":{"200":{"description":"Idempotent replay"},"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Results"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/questions/{id}":{"get":{"operationId":"getResults","summary":"State and results, with optional long-polling","description":"Returns the full results snapshot. To wait for news, pass the cursor from your last response and wait_seconds (up to 25): the call returns as soon as anything changes (an answer, a state change or a summary) or when the wait runs out, with changed set accordingly. Without wait_seconds, poll every poll_after_seconds.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Question ID"},{"name":"cursor","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"The cursor from an earlier response."},{"name":"wait_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":25},"description":"Long-poll: wait up to this long for something newer than cursor."}],"responses":{"200":{"description":"Results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Results"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/questions/{id}/events":{"get":{"operationId":"streamEvents","summary":"Server-Sent Events stream of answers and state changes (up to 50 s, resumable)","description":"Streams answer, state, summary and heartbeat events. Each event id is the question event sequence; reconnect with Last-Event-ID (or last_event_id) to resume without missing anything. The stream closes after at most 50 seconds with a retry hint, and ends after the summary once the question finishes. A finished question with nothing new returns 204. Limited to about five open streams per key.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Question ID"},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"type":"string"}},{"name":"last_event_id","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"For clients that cannot set headers."},{"name":"max_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"description":"Event stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"204":{"description":"Finished, nothing new"},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/questions/{id}/ratings":{"post":{"operationId":"rateAnswers","summary":"Rate answers and record your final choice","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Question ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ratings":{"type":"array","items":{"type":"object","required":["answer_id","value"],"properties":{"answer_id":{"type":"string"},"value":{"enum":["up","down"]},"most_useful":{"type":"boolean"}}}},"final_choice":{"type":"integer","minimum":1,"maximum":3}}}}}},"responses":{"204":{"description":"Recorded"},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/questions/{id}/cancel":{"post":{"operationId":"cancelQuestion","summary":"Cancel before the first answer","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Question ID"}],"responses":{"200":{"description":"Cancelled; final snapshot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Results"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/receipts/{id}":{"get":{"operationId":"getReceipt","summary":"Signed receipt for an answer (JWS, ES256)","description":"Verify live receipts with the keys at /.well-known/jwks.json. Sandbox receipts are signed with a separate key (kid starts sbx-, published at /v1/sandbox/jwks.json), carry sbx: true and chk: [\"synthetic\"], and never verify against the production keys. Claims: qh (question hash), ah (SHA-256 of the asset shown), ans (answer hash), asg (assignment nonce), st (accepted, held or void).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Answer ID"}],"responses":{"200":{"description":"Receipt","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receipt"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/receipts/verify":{"post":{"operationId":"verifyReceipt","summary":"Check any receipt against the published keys","description":"Verifies the ES256 signature against /.well-known/jwks.json and, if you send expected values, checks them against the signed claims. You can do the same offline with any JOSE library and the JWKS. A sandbox receipt returns valid: false and sandbox: true, with signature and claim checks still reported.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jws"],"properties":{"jws":{"type":"string","description":"Compact JWS receipt."},"expected":{"type":"object","properties":{"asset_sha256":{"type":"string","description":"SHA-256 (hex) of the exact image you uploaded, compared with ah."},"assignment_nonce":{"type":"string","description":"Compared with asg."},"answer_hash":{"type":"string","description":"Compared with ans."},"question_hash":{"type":"string","description":"Compared with qh."}}}}}}}},"responses":{"200":{"description":"Verification result (valid is false when the signature or a supplied value does not match)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/balance":{"get":{"operationId":"getBalance","summary":"Balance, caps and limits (sandbox: nothing is charged)","responses":{"200":{"description":"Balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/usage":{"get":{"operationId":"getUsage","summary":"Daily usage for a month","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"},"description":"Month as YYYY-MM (UTC). Defaults to the current month."}],"responses":{"200":{"description":"Usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"pfy_test_xxxxxxxx_…"}},"responses":{"Problem":{"description":"RFC 9457 problem","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}},"schemas":{"QuestionSpec":{"type":"object","required":["type","prompt","pool"],"additionalProperties":false,"properties":{"type":{"type":"string","description":"Question type code from GET /v1/question-types, e.g. quick_pick.","examples":["quick_pick"]},"prompt":{"type":"string","minLength":3,"maxLength":280,"description":"The question. Links are refused: questions with URLs are not accepted yet. Upload a screenshot instead."},"options":{"type":"array","items":{"type":"string","maxLength":80},"maxItems":3,"description":"2–3 options for quick_pick; none for other types."},"asset_id":{"type":["string","null"],"description":"An upload_id from POST /v1/uploads: an image, or one sound clip."},"pool":{"type":"integer","minimum":5,"maximum":50,"description":"How many verified people should answer."},"deadline_hours":{"type":"integer","minimum":1,"maximum":168},"quote_id":{"type":["string","null"]},"offer_pence":{"type":"integer","minimum":1,"maximum":2000,"description":"Your offer per answer in pence. Every person who answers is paid it; our fee goes on top. Default: the launch example pay for the type. Refused (422 offer-below-floor) below the fair pay floor."},"required_tier":{"type":"integer","minimum":1,"maximum":4,"description":"Lowest member tier to ask: 1 everyday (default), 2 proven, 3 qualified (offers from £1). 4 is the marketplace lane and is not open (409 marketplace-lane-closed). Long answer types raise it to their own minimum (In-depth: 2)."},"topics":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to 3 topic codes from GET /v1/topics. Members choose which questions to answer from a board they can filter by topic, so tags help the right people find yours.","examples":[["design","food_drink"]]},"expected_minutes":{"type":"integer","minimum":1,"maximum":60,"description":"Long answer types only (In-depth: 10–20). How long you expect each answer to take; it sets the fair pay floor (min_offer_pence) and the time members see before they choose."},"option_asset_ids":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":2,"description":"Which sounds better: two upload_ids of sound clips, one per option, with type quick_pick and exactly two options. Leave out asset_id."}}},"Quote":{"type":"object","properties":{"quote_id":{"type":"string"},"offer_pence":{"type":"integer","description":"What each person who answers is paid. Members keep the full offer; the platform fee is added on top."},"min_offer_pence":{"type":"integer","description":"The lowest offer allowed for this type and tier (the fair pay floor)."},"fee_per_answer_minor":{"type":"integer","description":"Our fee per answer, on top of the offer."},"holiday_pay_per_answer_minor":{"type":"integer","description":"Holiday pay we add for the member on each answer (our cost, not yours)."},"required_tier":{"type":"integer"},"topics":{"type":"array","items":{"type":"string"}},"expected_minutes":{"type":["integer","null"]},"pricing_mode":{"enum":["launch_default","offer"]},"eligible_pool":{"type":"object","properties":{"share":{"enum":["all","most","some","few","none"]},"note":{"type":"string"}}},"price_per_answer_minor":{"type":"integer"},"request_fee_minor":{"type":"integer"},"launch_example_total_minor":{"type":"integer"},"charge_minor":{"type":"integer"},"free_mode":{"type":"boolean"},"currency":{"const":"GBP"},"eta":{"type":"object","properties":{"p50_seconds":{"type":"integer"},"p90_seconds":{"type":"integer"}}},"expires_at":{"type":"string","format":"date-time"}}},"Results":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"prompt":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"label":{"type":"string"}}}},"topics":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}}}},"expected_minutes":{"type":["integer","null"]},"required_tier":{"type":"integer"},"cursor":{"type":"integer","description":"Pass back to wait for anything newer."},"changed":{"type":"boolean","description":"Only on long-poll responses: whether anything changed since cursor."},"state":{"enum":["draft","screening","awaiting_payment","open","suspended","closed","cancelled","rejected"]},"pool":{"type":"integer"},"accepted":{"type":"integer"},"held_for_review":{"type":"integer"},"counts":{"type":"object","additionalProperties":{"type":"integer"}},"summary":{"type":["object","null"]},"answers":{"type":"array","items":{"type":"object"}},"poll_after_seconds":{"type":["integer","null"]},"sandbox":{"type":"boolean"},"audio_clips":{"type":"array","description":"Only on questions with sound clips: each clip with its description, transcript, sha256 and, for which-sounds-better, the option it stands for.","items":{"type":"object","properties":{"asset_id":{"type":"string"},"content_type":{"type":"string"},"duration_ms":{"type":"integer"},"description":{"type":"string"},"transcript":{"type":["string","null"]},"sha256":{"type":"string"},"option_position":{"type":["integer","null"]},"label":{"type":["string","null"]}}}}}},"QuestionTypes":{"type":"object","properties":{"types":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"},"answer_kind":{"type":"string"},"min_options":{"type":"integer"},"max_options":{"type":"integer"},"asset_kinds":{"type":"array","items":{"type":"string"}},"launch_price_per_answer_minor":{"type":"integer"},"name":{"type":"string","description":"Plain name: Quick take, In-depth, …"},"min_tier":{"type":"integer","description":"Lowest member tier that answers this type (In-depth: 2, Proven)."},"expected_minutes":{"type":["object","null"],"properties":{"min":{"type":"integer"},"max":{"type":"integer"}}},"fields":{"type":["array","null"],"items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"max_chars":{"type":"integer"}}}}}}}}},"Topics":{"type":"object","properties":{"topics":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}}}}}},"Receipt":{"type":"object","properties":{"answer_id":{"type":"string"},"receipt_id":{"type":"string"},"version":{"type":"integer"},"status":{"enum":["accepted","held","void"]},"jws":{"type":"string"},"kid":{"type":"string"},"jwks_url":{"type":"string"},"claims":{"$ref":"#/components/schemas/ReceiptClaims"},"anchor":{"type":"null"}}},"ReceiptClaims":{"type":"object","description":"Signed claims. Hashes are lowercase hex SHA-256.","properties":{"iss":{"type":"string"},"sub":{"type":"string","description":"Answer ID"},"iat":{"type":"integer"},"v":{"type":"integer"},"qh":{"type":"string","description":"Canonical hash of question text, options, audience, catalogue version and policy version"},"ah":{"type":"string","description":"SHA-256 of the exact image (after metadata stripping) or rendered text shown"},"ans":{"type":"string","description":"Hash of the answer content"},"asg":{"type":"string","description":"Assignment nonce"},"st":{"enum":["accepted","held","void"]},"lvl":{"type":"string","description":"Personhood level at answer time"},"chk":{"type":"array","items":{"type":"string"},"description":"Checks recorded: passkey, no_paste (reported by the answering browser), time_recorded (the server clock saw at least the minimum time from claim to submit, and the time the browser reported fits inside it), gold; synthetic for sandbox answers"},"fv":{"type":"boolean","description":"First view of this asset by this member"},"t":{"type":"object","properties":{"submitted":{"type":"string"},"accepted":{"type":["string","null"]}}},"m":{"type":"string","description":"Member pseudonym, salted per asker"},"sbx":{"type":"boolean"}}},"Verification":{"type":"object","properties":{"valid":{"type":"boolean","description":"True only for a live receipt whose signature and supplied values check out. Always false for sandbox receipts."},"signature_valid":{"type":"boolean"},"sandbox":{"type":"boolean","description":"True for sandbox receipts (synthetic members, sandbox key). Never proof of a real person."},"claims":{"oneOf":[{"$ref":"#/components/schemas/ReceiptClaims"},{"type":"null"}]},"mismatches":{"type":"array","items":{"type":"string"}},"reason":{"type":["string","null"]},"jwks_url":{"type":"string"}}},"Balance":{"type":"object","properties":{"mode":{"enum":["test","live"]},"sandbox":{"type":"boolean"},"currency":{"const":"GBP"},"free_mode":{"type":"boolean"},"balance_minor":{"type":"integer"},"charged_this_month_minor":{"type":"integer"},"launch_example_value_this_month_minor":{"type":"integer"},"questions_this_month":{"type":"integer"},"answers_this_month":{"type":"integer"},"caps":{"type":"object"},"limits":{"type":"object"},"note":{"type":"string"}}},"Usage":{"type":"object","properties":{"period":{"type":"string"},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"mode":{"type":"string"},"currency":{"const":"GBP"},"charged_minor":{"type":"integer"},"totals":{"type":"object","properties":{"questions":{"type":"integer"},"answers":{"type":"integer"},"launch_example_value_minor":{"type":"integer"}}},"rows":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string","format":"date"},"questions":{"type":"integer"},"answers":{"type":"integer"},"launch_example_value_minor":{"type":"integer"}}}}}},"Jwks":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"kty":{"const":"EC"},"crv":{"const":"P-256"},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string"},"alg":{"const":"ES256"},"use":{"const":"sig"}}}}}}}}}