openapi: 3.2.0 info: title: Namegender Gender API version: 1.0.0 contact: url: https://namegender.com/docs description: 'Operations tagged Gender across 2 of this provider''s published API definitions: namegender-api-openapi.json, openapi.json. Each path carries the servers of the definition it was published in.' servers: - url: https://namegender.com description: Production security: - bearerAuth: [] - apiKeyHeader: [] tags: - name: Gender description: Name, email and username lookups. paths: /api/v1/gender: get: tags: - Gender summary: Gender from a name description: Pass a full name or a first name. Titles, punctuation and surnames are stripped before lookup; `name` in the response shows what was actually looked up. operationId: getName parameters: - name: name in: query required: true schema: type: string maxLength: 200 description: The value to resolve. example: Ayşe Yılmaz - name: country in: query required: false schema: type: string minLength: 2 maxLength: 2 description: 'ISO-3166 alpha-2 code. Narrows the lookup to one country, which matters for names that flip gender across borders: Andrea is male in Italy and female in Germany. Omit it and the answer is the worldwide aggregate.' example: TR - name: locale in: query required: false schema: type: string maxLength: 35 description: 'A language tag such as `de-DE`, `en_US` or `pt_BR.UTF-8`, typically the browser''s `navigator.language` or the `Accept-Language` header of your sign-up form. Its region becomes the country when `country` is not sent. A tag without a region (`en`, `de`) sets no country: a language alone does not say which country it is spoken in. `country_source` in the response tells you which one was used.' example: it-IT - name: ip in: query required: false schema: type: string maxLength: 45 description: The end user's IP address (IPv4 or IPv6), for example from your sign-up request. Its country is used when neither `country` nor a `locale` with a region is sent. Private and reserved ranges are ignored. The address is used for this lookup only and is not stored. IP geolocation by DB-IP (db-ip.com), CC BY 4.0. example: 93.42.0.1 - name: ai_fallback in: query required: false schema: type: boolean default: false description: 'Ask a language model when the dataset has no answer. Slower and less certain; the response reports `source: "llm"` so you can tell these apart. Requires AI lookups to be enabled in account settings; otherwise the call fails with `ai_consent_required`.' - name: best_guess in: query required: false schema: type: boolean default: false description: Return the most likely gender even below the confidence threshold, instead of null. Check `probability` before trusting the result. responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' post: tags: - Gender summary: Gender from a name description: Pass a full name or a first name. Titles, punctuation and surnames are stripped before lookup; `name` in the response shows what was actually looked up. operationId: postName requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string maxLength: 200 country: type: string minLength: 2 maxLength: 2 locale: type: string maxLength: 35 ip: type: string maxLength: 45 ai_fallback: type: boolean default: false best_guess: type: boolean default: false responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' servers: - url: https://namegender.com description: Production /api/v1/gender/bulk: post: tags: - Gender summary: Resolve many names in one request description: 'Exists so that 100 names do not cost 100 HTTP round trips. Names are resolved in a single batch lookup. Credits are checked for the whole batch up front: either every name is processed or none is.' operationId: bulkGender requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BulkRequest' responses: '200': description: Every name resolved. Results are returned in the order they were sent. content: application/json: schema: $ref: '#/components/schemas/BulkResponse' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' servers: - url: https://namegender.com description: Production /api/v1/gender/countries: get: tags: - Gender summary: Which countries a name is recorded in description: 'This is not a "country of origin" lookup, and it is deliberately not named like one: the data cannot support that claim, and the difference is measurable. Counted birth-registration statistics exist for seven countries only: the US, UK, France, Canada, Spain, Ireland and Norway. Everything else is presence data — it says a name occurs in a country, not how many people carry it. So a query for `Mehmet` ranks France first at 59%, and Turkey does not appear in the ranking at all, because Turkey publishes no counts. The response therefore keeps the two apart. `registrations` is measured volume and is comparable, but only among the counting countries. `attested_in` is presence, and that is where Turkey, Japan and India show up. Neither field is a claim about any person''s origin or ethnicity. **Credits.** One credit per request. `ai_fallback` and `best_guess` do not apply here and are ignored.' operationId: getCountries parameters: - name: name in: query required: true description: The first name to look up. schema: type: string maxLength: 200 example: Mehmet - name: limit in: query required: false description: How many counted countries to list in `registrations`. Shares and `basis.counted_countries` are not affected, and `attested_in` is never cut. schema: type: integer minimum: 1 maximum: 100 default: 25 responses: '200': description: Country distribution, with the basis of the numbers stated in the response itself. content: application/json: schema: $ref: '#/components/schemas/CountriesResponse' example: credits_charged: 1 credits_remaining: 49999 data_version: '2026.08' request_id: req_6b2d90e14fa37c58 took_ms: 3 name: Mehmet basis: counted_sources: - ssa - ons - insee - statcan - ine - cso - ssb counted_countries: 5 attested_countries: 14 note: Shares are calculated only across countries that publish counted birth registration statistics… registrations: - country: FR count: 3775 share: 58.97 gender: male probability: 99 source: insee - country: GB count: 1130 share: 17.65 gender: male probability: 99 source: ons attested_in: - AL - AU - BE - CA - CH - ES - FR - GB - MK - 'NO' - SE - TR - US '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' post: tags: - Gender summary: Which countries a name is recorded in description: 'This is not a "country of origin" lookup, and it is deliberately not named like one: the data cannot support that claim, and the difference is measurable. Counted birth-registration statistics exist for seven countries only: the US, UK, France, Canada, Spain, Ireland and Norway. Everything else is presence data — it says a name occurs in a country, not how many people carry it. So a query for `Mehmet` ranks France first at 59%, and Turkey does not appear in the ranking at all, because Turkey publishes no counts. The response therefore keeps the two apart. `registrations` is measured volume and is comparable, but only among the counting countries. `attested_in` is presence, and that is where Turkey, Japan and India show up. Neither field is a claim about any person''s origin or ethnicity. **Credits.** One credit per request. `ai_fallback` and `best_guess` do not apply here and are ignored.' operationId: postCountries requestBody: required: true content: application/json: schema: type: object required: - name properties: name: type: string maxLength: 200 example: Mehmet description: The first name to look up. limit: type: integer minimum: 1 maximum: 100 default: 25 description: How many counted countries to list in `registrations`. Shares and `basis.counted_countries` are not affected, and `attested_in` is never cut. responses: '200': description: Country distribution, with the basis of the numbers stated in the response itself. content: application/json: schema: $ref: '#/components/schemas/CountriesResponse' example: credits_charged: 1 credits_remaining: 49999 data_version: '2026.08' request_id: req_6b2d90e14fa37c58 took_ms: 3 name: Mehmet basis: counted_sources: - ssa - ons - insee - statcan - ine - cso - ssb counted_countries: 5 attested_countries: 14 note: Shares are calculated only across countries that publish counted birth registration statistics… registrations: - country: FR count: 3775 share: 58.97 gender: male probability: 99 source: insee - country: GB count: 1130 share: 17.65 gender: male probability: 99 source: ons attested_in: - AL - AU - BE - CA - CH - ES - FR - GB - MK - 'NO' - SE - TR - US '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' servers: - url: https://namegender.com description: Production /api/v1/gender/email: get: tags: - Gender summary: Gender from an email address description: The local part is split on separators and digits, then resolved as a name. `john.doe@example.com` resolves as "John". operationId: getEmail parameters: - name: email in: query required: true schema: type: string maxLength: 200 description: The value to resolve. example: john.doe@example.com - name: country in: query required: false schema: type: string minLength: 2 maxLength: 2 description: 'ISO-3166 alpha-2 code. Narrows the lookup to one country, which matters for names that flip gender across borders: Andrea is male in Italy and female in Germany. Omit it and the answer is the worldwide aggregate.' example: TR - name: locale in: query required: false schema: type: string maxLength: 35 description: 'A language tag such as `de-DE`, `en_US` or `pt_BR.UTF-8`, typically the browser''s `navigator.language` or the `Accept-Language` header of your sign-up form. Its region becomes the country when `country` is not sent. A tag without a region (`en`, `de`) sets no country: a language alone does not say which country it is spoken in. `country_source` in the response tells you which one was used.' example: it-IT - name: ip in: query required: false schema: type: string maxLength: 45 description: The end user's IP address (IPv4 or IPv6), for example from your sign-up request. Its country is used when neither `country` nor a `locale` with a region is sent. Private and reserved ranges are ignored. The address is used for this lookup only and is not stored. IP geolocation by DB-IP (db-ip.com), CC BY 4.0. example: 93.42.0.1 - name: ai_fallback in: query required: false schema: type: boolean default: false description: 'Ask a language model when the dataset has no answer. Slower and less certain; the response reports `source: "llm"` so you can tell these apart. Requires AI lookups to be enabled in account settings; otherwise the call fails with `ai_consent_required`.' - name: best_guess in: query required: false schema: type: boolean default: false description: 'Applied to the first name extracted from the email: return its most likely gender even below the confidence threshold, instead of null. Check `probability` before trusting the result.' responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' post: tags: - Gender summary: Gender from an email address description: The local part is split on separators and digits, then resolved as a name. `john.doe@example.com` resolves as "John". operationId: postEmail requestBody: required: true content: application/json: schema: type: object required: - email properties: email: type: string maxLength: 200 country: type: string minLength: 2 maxLength: 2 locale: type: string maxLength: 35 ip: type: string maxLength: 45 ai_fallback: type: boolean default: false best_guess: type: boolean default: false responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' servers: - url: https://namegender.com description: Production /api/v1/gender/username: get: tags: - Gender summary: Gender from a username description: Digits, separators and common suffixes are stripped before lookup. operationId: getUsername parameters: - name: username in: query required: true schema: type: string maxLength: 200 description: The value to resolve. example: jane_doe_92 - name: country in: query required: false schema: type: string minLength: 2 maxLength: 2 description: 'ISO-3166 alpha-2 code. Narrows the lookup to one country, which matters for names that flip gender across borders: Andrea is male in Italy and female in Germany. Omit it and the answer is the worldwide aggregate.' example: TR - name: locale in: query required: false schema: type: string maxLength: 35 description: 'A language tag such as `de-DE`, `en_US` or `pt_BR.UTF-8`, typically the browser''s `navigator.language` or the `Accept-Language` header of your sign-up form. Its region becomes the country when `country` is not sent. A tag without a region (`en`, `de`) sets no country: a language alone does not say which country it is spoken in. `country_source` in the response tells you which one was used.' example: it-IT - name: ip in: query required: false schema: type: string maxLength: 45 description: The end user's IP address (IPv4 or IPv6), for example from your sign-up request. Its country is used when neither `country` nor a `locale` with a region is sent. Private and reserved ranges are ignored. The address is used for this lookup only and is not stored. IP geolocation by DB-IP (db-ip.com), CC BY 4.0. example: 93.42.0.1 - name: ai_fallback in: query required: false schema: type: boolean default: false description: 'Ask a language model when the dataset has no answer. Slower and less certain; the response reports `source: "llm"` so you can tell these apart. Requires AI lookups to be enabled in account settings; otherwise the call fails with `ai_consent_required`.' - name: best_guess in: query required: false schema: type: boolean default: false description: 'Applied to the first name extracted from the username: return its most likely gender even below the confidence threshold, instead of null. Check `probability` before trusting the result.' responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' post: tags: - Gender summary: Gender from a username description: Digits, separators and common suffixes are stripped before lookup. operationId: postUsername requestBody: required: true content: application/json: schema: type: object required: - username properties: username: type: string maxLength: 200 country: type: string minLength: 2 maxLength: 2 locale: type: string maxLength: 35 ip: type: string maxLength: 45 ai_fallback: type: boolean default: false best_guess: type: boolean default: false responses: '200': description: Resolved. `gender` is null when the name is not recognised — that is a successful answer of "we do not know", not an error, and it still costs one credit. content: application/json: schema: $ref: '#/components/schemas/SingleResponse' examples: known: $ref: '#/components/examples/known' unknown: $ref: '#/components/examples/unknown' fuzzy: $ref: '#/components/examples/fuzzy' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '402': $ref: '#/components/responses/402' '422': $ref: '#/components/responses/422' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' servers: - url: https://namegender.com description: Production components: examples: known: summary: Recognised name value: credits_charged: 1 credits_remaining: 4821 data_version: '2026.08' request_id: req_9c1f5b2a7e0d4a13 query: Ayşe Yılmaz name: Ayşe first_name: Ayşe middle_name: null last_name: Yılmaz name_type: personal gender: female country: null sample_size: 655 probability: 99 took_ms: 1 source: db confidence: high matched_as: null fuzzy: summary: Resolved by closest spelling — note the capped probability value: credits_charged: 1 credits_remaining: 4819 data_version: '2026.08' request_id: req_44a0be71c3925fd8 query: Micheal name: Micheal first_name: Micheal middle_name: null last_name: null name_type: personal gender: male country: null sample_size: 152388 probability: 86 took_ms: 2 source: fuzzy confidence: high matched_as: michael unknown: summary: Name not in the dataset — a successful "we do not know" value: credits_charged: 1 credits_remaining: 4820 data_version: '2026.08' request_id: req_1d7e3c9048ba52f6 query: Qzzxvv name: Qzzxvv first_name: Qzzxvv middle_name: null last_name: null name_type: personal gender: null country: null sample_size: 0 probability: 0 took_ms: 1 source: none confidence: unknown matched_as: null responses: '500': description: Unexpected server error. Nothing was charged. Quote `request_id` if it persists. content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: 'Rate limit exceeded, or too many file jobs running at once. Wait `retry_after` seconds. Codes: `rate_limited`, `too_many_batches`.' headers: Retry-After: schema: type: integer description: Seconds to wait. content: application/json: schema: $ref: '#/components/schemas/Error' '402': description: Out of credits. Buy more, or wait for the daily free quota to reset at midnight UTC. content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: 'No usable API key. Codes: `missing_key`, `invalid_key`, `revoked_key`.' content: application/json: schema: $ref: '#/components/schemas/Error' '422': description: 'Input failed validation. `errors` names the offending fields. Codes: `invalid_input`, `too_many_items`, `ai_consent_required`.' content: application/json: schema: $ref: '#/components/schemas/Error' '400': description: 'Bad request. Codes: `missing_input`.' content: application/json: schema: $ref: '#/components/schemas/Error' schemas: BulkResponse: allOf: - $ref: '#/components/schemas/Envelope' - type: object required: - results - summary properties: took_ms: type: integer example: 12 description: Whole milliseconds spent resolving the batch on our side, network time excluded. country_source: type: - string - 'null' enum: - country - locale - ip - null description: 'Where the country came from: the `country` parameter, the region of `locale`, the `ip` address, or none of them (null, worldwide answer).' summary: type: object description: Counts for the whole batch. properties: total: type: integer description: Values sent. identified: type: integer description: Values with a non-null `gender`. unknown: type: integer description: 'Values with `gender: null`.' match_rate: type: number description: Percentage identified. results: type: array description: Same order as the names you sent. items: $ref: '#/components/schemas/GenderResult' BulkRequest: type: object required: - names properties: names: type: array minItems: 1 maxItems: 100 items: type: string maxLength: 200 description: The values to resolve, each at most 200 characters. Each one costs one credit. country: type: string minLength: 2 maxLength: 2 description: ISO-3166 alpha-2 code applied to every value in the batch. locale: type: string maxLength: 35 description: Language tag whose region becomes the batch country when `country` is not sent, for example `it-IT`. A tag without a region sets no country. ip: type: string maxLength: 45 description: End user IP address whose country becomes the batch country when neither `country` nor a regional `locale` is sent. Not stored. IP geolocation by DB-IP (db-ip.com), CC BY 4.0. type: type: string enum: - name - email - username default: name description: How to read the values in `names`. ai_fallback: type: boolean default: false description: Ask a language model for values the dataset cannot answer. Requires AI lookups to be enabled in account settings; otherwise the batch fails with `ai_consent_required`. best_guess: type: boolean default: false description: Return the most likely gender even below the confidence threshold, instead of null. For `email` and `username` batches it applies to the extracted first name. example: names: - Ayşe - Mehmet - Andrea country: TR Envelope: type: object required: - credits_charged - credits_remaining properties: credits_charged: type: integer description: 'How many credits this call took from the balance: one per value resolved.' credits_remaining: type: integer description: 'Balance once this call is paid for: purchased credits plus whatever is left of today''s free quota.' data_version: type: - string - 'null' example: '2026.08' description: Name-dataset snapshot that produced the answer. request_id: type: - string - 'null' description: Identifier of this call, also sent as the `X-Request-Id` header. Quote it in support requests. CountriesResponse: type: object description: Two lists, deliberately not merged. `registrations` is measured volume and is comparable only among countries that publish counts. `attested_in` is presence, with no weight attached — a country appears there whether or not anyone counted it. properties: credits_charged: type: integer description: 'How many credits this call took from the balance: always 1.' credits_remaining: type: integer description: Balance once this call is paid for. data_version: type: string nullable: true description: Name-dataset snapshot that produced the answer. request_id: type: - string - 'null' description: Identifier of this call, also sent as the `X-Request-Id` header. Quote it in support requests. took_ms: type: integer example: 3 description: Whole milliseconds spent building the distribution on our side, network time excluded. name: type: string description: The name that was looked up. basis: type: object description: What the numbers rest on. Carried in the response rather than left to the documentation, because the person reading a percentage is not reading the docs. properties: counted_sources: type: array items: type: string description: The statistical offices that publish observation counts. counted_countries: type: integer description: Countries with counted registrations for this name, before `limit` is applied. Can be larger than the length of `registrations`. attested_countries: type: integer description: Countries in `attested_in`, which `limit` never cuts. note: type: string description: Plain-language caveat. Show it next to the percentages. registrations: type: array description: Countries with counted registrations, most first, cut to `limit`. Shares are calculated across every counted country before the cut, so they sum to 100 only when nothing is cut. items: type: object properties: country: type: string description: ISO 3166-1 alpha-2. count: type: integer description: Observed registrations. share: type: number format: float description: This country's percentage of the name's registrations across all counting countries, including any that `limit` cut from the list. gender: type: string nullable: true description: Majority gender for the name in this country. probability: type: integer description: Share, 0–100, carrying that gender in this country. source: type: string description: Statistical office the count comes from. attested_in: type: array items: type: string description: Every country the name occurs in, counted or not, alphabetically. Error: type: object description: The one error shape. Returned by every endpoint at every failing status code. required: - error - message - docs properties: error: type: string description: Machine-readable and stable. **Branch on this.** New codes may be added over time, so treat an unrecognised value as a generic failure rather than crashing. enum: - missing_key - invalid_key - revoked_key - blocked - email_not_verified - ip_not_allowed - proxy_secret_required - forbidden - no_credits - missing_input - invalid_input - too_many_items - ai_consent_required - unknown_endpoint - method_not_allowed - payload_too_large - rate_limited - batch_not_found - batch_not_startable - batch_not_finished - batch_in_progress - result_gone - too_many_batches - not_ready - server_error message: type: string description: Human-readable, translated into the caller's language. Wording can change; never parse or compare it. request_id: type: - string - 'null' description: Quote this in support requests. example: req_9c1f5b2a7e0d4a13 docs: type: string format: uri description: Link to this error in the documentation. errors: type: object description: Field-level detail. Present on validation failures only. additionalProperties: type: array items: type: string retry_after: type: integer description: Seconds to wait. Present on 429 only, and mirrored in the `Retry-After` header. SingleResponse: allOf: - $ref: '#/components/schemas/Envelope' - type: object properties: country_source: type: - string - 'null' enum: - country - locale - ip - null description: 'Where the country came from: the `country` parameter, the region of `locale`, the `ip` address, or none of them (null, worldwide answer).' - $ref: '#/components/schemas/GenderResult' GenderResult: type: object required: - query - name - gender - probability - sample_size - source properties: query: type: string description: The input exactly as you sent it. name: type: - string - 'null' description: The first name actually looked up, after stripping titles and surnames. first_name: type: - string - 'null' description: Given name parsed from the input. Present even when `gender` is null, and not charged separately. Titles and initials are never returned. For Chinese, Korean and Japanese script the surname comes first in the input and is returned in `last_name`. middle_name: type: - string - 'null' description: Any further given names between the first name and the surname, for example "Fitzgerald" in "John Fitzgerald Kennedy". Initials are dropped. last_name: type: - string - 'null' description: Surname parsed from the input, including particles such as "van" or "de la". "Smith, John" is read as surname first. With a Spanish-speaking `country` the last two words are both surnames (Pérez García). Always null for usernames, where a surname cannot be told apart from any other word. name_type: type: - string - 'null' enum: - personal - organization - role - null description: '`organization` when the input carries a company marker (Acme LLC, Müller GmbH, Stanford University); `role` for shared mailboxes and placeholder accounts (info@, Customer Service, guest). Both return `gender: null` and no name parts. `personal` means no such marker was found; it does not confirm the input is a real name. null when the input is not a name at all.' gender: type: - string - 'null' enum: - male - female - null description: null means the dataset has no confident answer. This is not an error. probability: type: integer minimum: 0 maximum: 100 description: Share of people with this name who have the reported gender. 0 when unknown. Measured against held-out data, answers at 80+ come true about 95% of the time, so this number runs slightly conservative rather than optimistic. sample_size: type: integer description: How many real people the answer is based on. A probability of 100 from a sample of 3 is weaker than 85 from a sample of 90,000 — read the two fields together. 0 means the source recorded proportions rather than counts. country: type: - string - 'null' description: The country the answer came from, when narrowed. took_ms: type: integer example: 1 description: Whole milliseconds spent resolving this value on our side; network time is not included. source: type: string enum: - db - script - fuzzy - llm - cache - none description: How the answer was reached. `db` exact match; `script` matched after transliterating a non-Latin script; `fuzzy` closest spelling; `llm` language model; `none` no answer. Use it to decide how much to trust a row. confidence: type: string enum: - high - medium - low - unverified - unknown description: 'Sample size bucket: high ≥100 people, medium ≥25, low ≥1, unverified when the source gave proportions instead of counts.' matched_as: type: - string - 'null' description: For `fuzzy` and `script` sources, the dictionary entry that was actually matched. Always inspect this before accepting a fuzzy result. securitySchemes: bearerAuth: type: http scheme: bearer description: 'Recommended: `Authorization: Bearer `.' apiKeyHeader: type: apiKey in: header name: X-Api-Key description: Alternative header form, for clients that cannot set `Authorization`. Keys are never read from the query string or the request body. x-refined-from: - namegender-api-openapi.json - openapi.json