API reference
Face reading
AI readings of a face photo, from the tradition of Samudrika Shastra. Photos are not stored.
- 24 endpoints
- POST JSON body
- Bearer key
24 endpoints. Every endpoint is POST with a JSON body and your key in the Authorization header. Request schemas and examples come from the OpenAPI document; each example response was captured from the live engine, and each endpoint says where its data fields come from: a hand-written contract, a schema measured from several real answers, or the one example.
Face: Outline Traced
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-outline-imageThe outline of the face and its features traced on a photo, with an SVG overlay to lay over your copy, and scores for how the face looks in that photo. It never names anyone. The photo is not stored or sent back.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
outlines· array of objectoverlay_svg· stringcoordinate_space· objectnotice· stringtier· stringexpression· objectexpression_note· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-outline-image \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-outline-image", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceOutlineImage({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-outline-image",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_outline_image({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-outline-image');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-outline-image", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"outlines": [
{
"name": "face",
"points": [
[
300,
200
],
[
700,
200
],
[
760,
560
],
[
500,
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Whole Face Reading
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-readingEvery section of a face reading from one photo, for the price of one call. It never names anyone, or infers race, religion or health conditions.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-reading \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-reading", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceReading({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-reading",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_reading({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-reading');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-reading", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"personality": {
"observed": [
"An example observation about personality."
],
"reading": "An example reading of personality, based on what the photo shows.",
"advice": "One practical sentence."
},
"career": {
"observed": [
"An example observation about career."
],
"reading": "An example reading of career, based on what the photo shows.",
"advice": "One practical sentence."
},
"love": {
"observed": [
"An example observation about love."
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Face Shape
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-shapeThe face shape and the balance of its zones. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-shape \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-shape", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceShape({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-shape",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_shape({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-shape');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-shape", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"shape": {
"observed": [
"An example observation about shape."
],
"reading": "An example reading of shape, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Eyes
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-eyesEye shape, spacing and brows. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-eyes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-eyes", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceEyes({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-eyes",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_eyes({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-eyes');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-eyes", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"eyes": {
"observed": [
"An example observation about eyes."
],
"reading": "An example reading of eyes, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Nose
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-noseBridge, tip and nostrils. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-nose \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-nose", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceNose({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-nose",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_nose({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-nose');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-nose", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"nose": {
"observed": [
"An example observation about nose."
],
"reading": "An example reading of nose, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Cheeks
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-cheeksCheeks and cheekbones. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-cheeks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-cheeks", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceCheeks({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-cheeks",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_cheeks({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-cheeks');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-cheeks", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"cheeks": {
"observed": [
"An example observation about cheeks."
],
"reading": "An example reading of cheeks, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Mouth
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-mouthLips and mouth shape. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-mouth \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-mouth", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceMouth({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-mouth",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_mouth({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-mouth');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-mouth", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"mouth": {
"observed": [
"An example observation about mouth."
],
"reading": "An example reading of mouth, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Chin and Jaw
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-chin-jawChin and jawline. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-chin-jaw \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-chin-jaw", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceChinJaw({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-chin-jaw",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_chin_jaw({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-chin-jaw');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-chin-jaw", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"chin_jaw": {
"observed": [
"An example observation about chin jaw."
],
"reading": "An example reading of chin jaw, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Ears
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-earsEars, if visible. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-ears \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-ears", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceEars({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-ears",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_ears({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-ears');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-ears", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"ears": {
"observed": [
"An example observation about ears."
],
"reading": "An example reading of ears, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Skin Clarity
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-skinClarity and radiance, never colour. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-skin \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-skin", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceSkin({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-skin",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_skin({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-skin');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-skin", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"skin": {
"observed": [
"An example observation about skin."
],
"reading": "An example reading of skin, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Symmetry
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-symmetryHow symmetrical the features are. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-symmetry \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-symmetry", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceSymmetry({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-symmetry",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_symmetry({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-symmetry');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-symmetry", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"symmetry": {
"observed": [
"An example observation about symmetry."
],
"reading": "An example reading of symmetry, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Proportions
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-proportionsForehead, nose and chin in proportion. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-proportions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-proportions", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceProportions({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-proportions",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_proportions({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-proportions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-proportions", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"proportions": {
"observed": [
"An example observation about proportions."
],
"reading": "An example reading of proportions, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Facial Hair
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-facial-hairBeard or moustache, if relevant. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-facial-hair \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-facial-hair", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceFacialHair({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-facial-hair",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_facial_hair({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-facial-hair');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-facial-hair", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"facial_hair": {
"observed": [
"An example observation about facial hair."
],
"reading": "An example reading of facial hair, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Outline
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-outlineForehead, hairline and outline. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-outline \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-outline", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceOutline({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-outline",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_outline({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-outline');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-outline", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"outline": {
"observed": [
"An example observation about outline."
],
"reading": "An example reading of outline, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Personality
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-personalityCharacter and temperament. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-personality \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-personality", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.facePersonality({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-personality",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_personality({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-personality');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-personality", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"personality": {
"observed": [
"An example observation about personality."
],
"reading": "An example reading of personality, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Career
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-careerWork and calling. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-career \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-career", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceCareer({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-career",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_career({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-career');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-career", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"career": {
"observed": [
"An example observation about career."
],
"reading": "An example reading of career, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Wealth
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-wealthMoney and how it is handled. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-wealth \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-wealth", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceWealth({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-wealth",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_wealth({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-wealth');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-wealth", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"wealth": {
"observed": [
"An example observation about wealth."
],
"reading": "An example reading of wealth, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Love
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-loveLove and affection. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-love \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-love", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceLove({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-love",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_love({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-love');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-love", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"love": {
"observed": [
"An example observation about love."
],
"reading": "An example reading of love, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Marriage
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-marriageMarriage and long partnership. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-marriage \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-marriage", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceMarriage({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-marriage",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_marriage({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-marriage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-marriage", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"marriage": {
"observed": [
"An example observation about marriage."
],
"reading": "An example reading of marriage, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Family
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-familyFamily life. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-family \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-family", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceFamily({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-family",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_family({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-family');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-family", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"family": {
"observed": [
"An example observation about family."
],
"reading": "An example reading of family, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Vitality
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-healthGeneral vitality and habits, never a diagnosis. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-health \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-health", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceHealth({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-health",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_health({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-health');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-health", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"health": {
"observed": [
"An example observation about health."
],
"reading": "An example reading of health, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Wisdom
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-wisdomJudgement and learning. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-wisdom \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-wisdom", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceWisdom({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-wisdom",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_wisdom({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-wisdom');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-wisdom", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"wisdom": {
"observed": [
"An example observation about wisdom."
],
"reading": "An example reading of wisdom, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Luck
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-luckFortune and timing. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-luck \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-luck", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceLuck({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-luck",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_luck({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-luck');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-luck", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"luck": {
"observed": [
"An example observation about luck."
],
"reading": "An example reading of luck, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Face: Challenges
POSTAvailable
https://api.96astroapi.com/v1/face-reading/face-challengesDifficulties to prepare for. Read from one photo of the face by a vision model; the photo is not stored.
- Credits
- Metered, from 15 credits
- Input
- A photo
- Output
- JSON
- Delivery
- Direct response
- Languages
- 26 languages; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
image_base64stringRequired | The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side. Limits: 1 to 5400000 characters Example: |
mime_typestring | nullOptional | The image's type. Required unless image_base64 is a data: URI; must match the file. Default: Allowed values: image/pngimage/jpegimage/webp Example: |
tierstringOptional | fast (Claude Haiku) or balanced (Sonnet). Sets the price range. Default: Allowed values: fastbalanced Example: |
consentbooleanRequired | Must be true: the person in the photo agreed to this reading, and is an adult or has a guardian's agreement. Allowed value: true Example: |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
The response contract: required fields are always present.
sections· objectnotice· stringtier· stringlanguage· string
Example request
curl -X POST https://api.96astroapi.com/v1/face-reading/face-challenges \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}'const response = await fetch("https://api.96astroapi.com/v1/face-reading/face-challenges", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.faceReading.faceChallenges({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
});
console.log(data);import requests
response = requests.post(
"https://api.96astroapi.com/v1/face-reading/face-challenges",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.face_reading.face_challenges({
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": True,
"tier": "fast",
})
print(res.data)<?php
$ch = curl_init('https://api.96astroapi.com/v1/face-reading/face-challenges');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_base64' => 'iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==',
'mime_type' => 'image/png',
'consent' => true,
'tier' => 'fast',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==",
"mime_type": "image/png",
"consent": true,
"tier": "fast"
}`)
req, err := http.NewRequest("POST", "https://api.96astroapi.com/v1/face-reading/face-challenges", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response (illustrative)
{
"data": {
"sections": {
"challenges": {
"observed": [
"An example observation about challenges."
],
"reading": "An example reading of challenges, based on what the photo shows.",
"advice": "One practical sentence."
}
},
"notice": "For reflection, not fact. This reading is not medical, legal or financial advice.",
"tier": "fast",
"language": "en"
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
…Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended, plan_upgrade_required, plan_family_not_included, key_scope_denied, ip_not_allowed, origin_not_allowed, publishable_key_not_allowed
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable, maintenance, temporarily_unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.


