Overview
IndyWriters works on a simple principle - if a newsletter sends a reader to a cross-promotion partner,
then that newsletter should receive a new reader in return.
Ordinarily this restricts newsletters to cross-promoting with similar sized peers, greatly reducing the pool
of potential partners. IndyWriters solves this problem by allowing newsletters to aggregate their
cross-promotion.
Instead of only linking to one cross-promotion partner, newsletters can link to a list of several. Each
partner in this list is scored for its likely relevance to the referring newsletter's readers, and
the list is calibrated so that partners who contribute the most also receive the most.
Authentication
Authentication requires your Username and API-Key to be included in HTTP requests, as in the curl example
below:
curl -X GET https://indywriters.com/api/newsletters/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me"
Endpoints
Create a new newsletter
Although newsletter writers do not hold user accounts, it is necessary for newsletters to be created as
objects in the IndyWriters database. These can be created and deleted by member platforms at will.
Upon creation, new newsletters will be reviewed to ensure that they are appropriate - i.e. are not
grossly offensive, disreputable, etc.
Newsletters have six fields:
- title is mandatory and must be 75 characters or less.
- tagline is mandatory and must be 255 characters or less.
- url is mandatory and must be unique.
- logo is mandatory and must be a URL to an image resource.
- topic_list is technically optional but highly recommended. It helps IndyWriters to
score cross-promotion relevance right away - i.e. before the newsletter has generated enough
cross-promotion data to utilize. This must be given as a single comma-separated string.
- external_id is an optional field for your use in matching the object to your
database.
To create a new newsletter object in IndyWriters use the curl below:
curl -X POST https://indywriters.com/api/newsletters/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me" \
-F "title=Newsletter Title" \
-F "tagline=An awesome newsletter that everybody will love reading" \
-F "url=https://awesomenewsletter.blog" \
-F "logo=URL to an image resource" \
-F "topic_list=tech, ai" \
-F "external_id=1754"
If the newsletter is sucessfully created, then the following response will be given:
{
"message": "Newsletter created and pending review.",
"newsletter":{
"external_id":"your internal id for the newsletter",
"reference":"1AUqWb4",
"cross_promotion_link": "https://indywriters.com/links/list/1AUqWb4/",
"title":"Newsletter Title",
"tagline":"An awesome newsletter that everybody will love reading.",
"url":"https://awesomenewsletter.blog",
"logo":"URL given to an image resource",
"topics":["tech", "ai"],
"active":false,
"created":"2025-07-14T21:33:22.994548Z"
}
}
Three of these return values should be noted:
- reference: is the public id for the newsletter and will be used for reading, updating
and deleting.
- cross_promotion_link: is the link that newsletters must include in their posts to use
the system.
- active: flags if the newsletter is approved and eligible to receive cross-promotions
from others. The newsletter may use its cross_promotion_link immediately (and should so that it will be
owed clicks).
Delete a newsletter
Newsletter objects that you create on IndyWriters are administered by you. Only in exceptional
circumstances - such as abuse of the system - will IndyWriters get involved. As such, you may delete
newsletters at will.
Deletion is permanent, unrecoverable, and cascades - data associated with the newsletter will also be
deleted.
curl -X DELETE https://indywriters.com/api/newsletters/{reference}/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me"
Read newsletters
You can read all newsletters that you manage with basic GET requests. Just include a newsletter's
reference to be specific.
curl -X GET https://indywriters.com/api/newsletters/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me"
Read a specific newsletter
curl -X GET https://indywriters.com/api/newsletters/{reference}/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me"
Update a newsletter
All updates are subject to the same review as new objects - a manual check to ensure the system is safe
for all users. As such edits are made to a staging model - note the api/newsletter-edits route.
Updating is done via PATCH requests, and all six fields can be edited.
curl -X PATCH https://indywriters.com/api/newsletter-edits/[reference]/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me" \
-F "title=New Title" \
-F "tagline=I just had to change the tagline" \
-F "url=https://awesomenewsletter.blog" \
-F "logo=URL to an image resource" \
-F "topic_list=tech, ai, online culture" \
-F "external_id=1754"
Read newsletter click data
Newsletter writers will probably like to see evidence that their cross-promotions are working. UTM
params are in place to show that referrals have come from IndyWriters and your platform, but it's
useful for you to be able to present data to your users.
The currency of IndyWriters is clicks - i.e. readers of one newsletter clicking through to see that of a
cross-promotion partner. You can read click data using the following curl, where the "days" param
indicates how many days before present the data should include (default=30):
You can also see clicks for all newsletters your platform manages by removing the reference.
curl -X GET https://indywriters.com/api/clicks/{reference}/?days=20/ \
-H "Username: AwesomeYou" \
-H "API-Key: UR70776441awe50me"
The expected response will look like the below, where origin is the newsletter that referred and
destination is the newsletter that received. References for origin and destination will only be given
if the newsletter is administered by one of your users, othewise they are set to null to prevent data leakage between platforms:
[
{
"origin_reference":null,
"origin_url":"https://origin_url.com",
"destination_reference":"kDpaqSC",
"destination_url":"https://destination_url.com",
"created":"2025-07-15T09:55:59.633994Z"
}
{
"origin_reference":"JryiRe",
"origin_url":"https://origin_url.com",
"destination_reference":"kDpaqSC",
"destination_url":"https://destination_url.com",
"created":"2025-07-15T09:55:59.633994Z"
}
]
Cross-promo banner
Honestly, you can present your writers with any style of cross-promotion link that you deem fit (plus,
it's just HTML - users can edit it, if they choose). The important thing is that the href follows this
format:
https://indywriters.com/links/list/{reference}/
This link will have been given to you for each newsletter that you've created (and you can retrieve it
with a GET request if needed).
So long as writers include that link, and some eye-catching copy, in their articles, the
cross-promotion will take care of itself. The banner below is something that we think works:
<div style="background-color: #04160b; text-align: center; padding: 60px;">
<div style="width: 400px; margin: auto; color: #ffffff; font-family: Fira Sans, Lucida Sans Unicode, Lucida Grande, sans-serif; line-height: 1.2; text-align: center;">
<h1 style="color: #ffffff; font-size: 44px; font-weight: 700; margin-bottom: 10px; margin-top: 0;">Find Other Great Newsletters</h1>
<p style="margin-bottom: 30px;">Brilliant writing should be easy to find</p>
<a href="https://indywriters.com/links/list/{reference}/" target="_blank" style="display: inline-block; color:#1e3004; text-decoration: none; background-color: #bffb3f; color: #1e3004; font-size: 16px; font-weight: 400; padding: 20px; text-align: center; width: auto; word-break: keep-all;">View cross-promos</a>
</div>
</div>
Find Other Great Newsletters
Brilliant writing should be easy to find
View cross-promos