Give your customer a short, finished reading with an “Unlock the full report” button at the end. When they pay, send the longer version, with everything they already read carried over word for word.
A real, finished, branded reading - just a short one. It covers the opening sections and stops there, with an “Unlock the full report” button at the end.
It takes them to your site - your checkout, your pricing page, wherever you want them to land. You take the payment; we are not involved in it.
The longer version of the same reading. Everything they already read stays exactly as it was, word for word, and the remaining sections are added underneath.
Same customer, same reading, twice. The second report continues from the first instead of starting over - so nothing they have already read changes, and the full report feels like the rest of the same book rather than a different one.
A normal report is one sale. This is two: a cheap one that gets the customer to buy at all, and a bigger one they choose themselves once they have read the first.
The teaser is not a sample or a blurred page - it is a real, finished, branded report. That is the whole reason it works. The customer gets something genuinely worth reading, so they trust that the rest is worth paying for.
Both work, and most astrology businesses pick one of the two.
Give the teaser away free. This is the common play - plenty of astrology companies offer a “free reading” to bring people in. You pay the 50 credits yourself and treat it as the cost of winning a customer. In return you get their birth details and their email, and someone who has already read your writing and liked it. That is a far warmer lead than a visitor who only saw a sales page.
Or charge a very small amount. A token price covers your credit cost and filters out people who were never going to buy. You will hand out fewer teasers this way, but a higher share of them go on to buy the full report.
The rule of thumb: give it away when you want volume and email addresses, charge a little when you want fewer but more serious buyers. Either way the money is in the upgrade, not the teaser.
Each report you generate costs you credits, and the upgrade is charged in full - it is not discounted just because it reuses sections. So a Snapshot teaser followed by a Comprehensive upgrade costs you:
| What you generate | Credits |
|---|---|
| Snapshot teaser | 50 |
| Comprehensive upgrade | 200 |
| Total for that customer | 250 |
Four decisions, all business ones. Settle these before anyone writes code - they are what your developer will ask you for.
Every Western report uses one endpoint:
POST /api/v1/western/reports/generate
And every request needs these headers:
Content-Type: application/json
Authorization: Bearer {api_acc_token} // identifies your account
x-api-key: {api_key} // LIVE key, or test_api_key for test mode
Your live key deducts from remaining_credits; your test key deducts from remaining_test_credits.
Charged in full, every time you generate.
| Tier | tier value | Credits |
|---|---|---|
| Snapshot | snapshot | 50 |
| Insight | insight | 100 |
| Advanced | advanced | 150 |
| Comprehensive | comprehensive | 200 |
The same for both steps: you send the request and get URLs back immediately with status: "processing". The report finishes in the background in roughly 10–30 seconds. Poll the returned statusUrl until status: "completed", then the HTML and PDF URLs are ready.
Pick a small tier - snapshot, insight or advanced - and set locked: true. Send the person’s full birth details and your branding, exactly like any normal report.
The branding fields set how the PDF looks. To choose your colours, fonts and cover layout visually and preview them on real report pages, use the Report Studio.
locked: true with the comprehensive tier is rejected with a 422. Lock a smaller tier instead.curl -X POST https://pdf.divineapi.com/api/v1/western/reports/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_ACC_TOKEN" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"report_type": "western-inner-moon",
"tier": "snapshot",
"locked": true,
"full_name": "Alex Rivera",
"day": 14, "month": 6, "year": 1990,
"hour": 10, "min": 25, "sec": 0,
"gender": "male",
"place": "New York, USA",
"lat": 40.7128, "lon": -74.006, "tzone": -4,
"lan": "en",
"company_name": "Astro Insights",
"company_url": "https://astroinsights.co",
"company_email": "hello@astroinsights.co",
"footer_text": "© 2026 Astro Insights",
"logo_url": "https://astroinsights.co/logo.png"
}'
The response comes back immediately:
{
"reportId": "e6eba5d8-2e27-4406-b9a1-706087fdbb0d",
"htmlUrl": "https://pdf.divineapi.com/reports/html/….html?token=…",
"pdfUrl": "https://pdf.divineapi.com/reports/pdfs/….pdf?token=…",
"statusUrl":"https://pdf.divineapi.com/api/v1/reports/…/status?token=…",
"status": "processing"
}
reportId. You need it in step 2. Give the customer the htmlUrl or pdfUrl once the status reads completed.The teaser looks like a normal report but with fewer sections, and ends with a CTA block: a heading, a short paragraph, and an “Unlock the full report →” button. By default that button points at your company_url and opens in a new tab. You can change all of it - see section 5.
After the customer pays on your site, make a second call for a higher tier and add source_report_id set to the teaser’s reportId. Send all the same inputs again - same person, same branding - just change the tier and drop locked.
curl -X POST https://pdf.divineapi.com/api/v1/western/reports/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_ACC_TOKEN" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"report_type": "western-inner-moon",
"tier": "comprehensive",
"source_report_id": "e6eba5d8-2e27-4406-b9a1-706087fdbb0d",
// same birth data and branding as the teaser
"full_name": "Alex Rivera",
"day": 14, "month": 6, "year": 1990,
"lat": 40.7128, "lon": -74.006, "tzone": -4,
"company_name": "Astro Insights"
}'
You get back a brand-new report with a new reportId and new URLs. In it:
locked.The teaser is not touched. The full report is a separate file, and both stay available.
Four optional parameters change the locked CTA. Each is independent - set only what you want, and anything you omit keeps its default. They apply only when locked: true, and they appear in both the HTML and the PDF.
| Parameter | Controls | Default if omitted |
|---|---|---|
unlock_heading | The heading | “This is a preview of your full report” |
unlock_message | The paragraph | “You’re seeing a taste of what the stars reveal. Unlock the complete reading to get every section in full detail.” |
unlock_button_label | The button text | “Unlock the full report →” |
unlock_button_url | Where the button goes | Your company_url |
Added to the step 1 body:
"locked": true,
"unlock_heading": "You've unlocked a glimpse ✨",
"unlock_message": "This is the first chapter of your Inner Moon reading. Get all 21 sections in the full report.",
"unlock_button_label": "Get my full reading →",
"unlock_button_url": "https://astroinsights.co/checkout?report=inner-moon"
The button opens in a new tab. If unlock_button_url isn’t a valid http(s) link and company_url isn’t either, the box still renders - the button just isn’t clickable.
Read these once and you will avoid every common error. Pricing is covered in section 2.
snapshot, insight and advanced can be locked. comprehensive cannot - it is the full report, so use a smaller tier as the teaser.
When you send source_report_id, the new report must be the same report family as the source (Inner Moon to Inner Moon, not Inner Moon to Career) and a strictly higher tier. You may skip tiers - snapshot straight to comprehensive is fine. You cannot downgrade, and you cannot re-make the same tier.
The source and the new report must have identical birth details - name, date, time, place, latitude and longitude - and belong to the same account. For Monthly and Yearly Horoscopes the period must match too (horoscope_month / horoscope_year). This is what stops one customer’s content being reused for someone else.
The upgrade call needs all the same inputs as a normal report - birth data plus branding - in addition to source_report_id. Sending only source_report_id is not enough.
| HTTP | Message contains | Cause → fix |
|---|---|---|
422 | Comprehensive reports cannot be locked | You set locked: true on comprehensive → lock snapshot, insight or advanced instead. |
400 | source_report_id not found | Wrong or mistyped id → use the reportId from the teaser response. |
400 | belongs to a different client | The source was made on another account → use the same account. |
400 | different birth chart | Birth details don’t match the source → send the exact same person. |
400 | different report family | Upgrading across families → keep the same report_type family. |
400 | higher tier … no downgrade or same-tier | Target tier is at or below the source → target a higher tier. |
400 | different horoscope period | Period differs from the source → match horoscope_month / horoscope_year. |
402 | insufficient credits | Not enough credits for the tier → top up, or use your test key. |
No. You can jump from any lower tier to any higher one - snapshot straight to comprehensive, for example. You just can’t go down.
Yes. Point source_report_id at whichever report the customer currently has; each step reuses everything below it. Each step is billed at that tier’s full price.
Yes, reused verbatim. Only the new sections are generated fresh.
No. The full report is a separate new report; the teaser stays exactly as it was.
Yes, in both the HTML and the PDF. In the PDF the button opens in the reader’s browser.
No - and you wouldn’t want to. It would hand over the entire report with a pointless unlock button while charging full price. Use a smaller tier as the teaser.
locked: trueunlock_* overridesreportIdreport_type family, a higher tiersource_report_id is the teaser’s reportIdlockedstatusUrl until completed, then deliver the new URLs