Meow!

Meow! ProductHunters

Signup today for a Starter, Growth or Pro plan and get 2 months for FREE.
Exclusive offer for the Product Hunt Community.

Algolia is the most reliable platform for building search into your business.

Free trial - no credit card required

One search engine, infinite possibilities

SaaS

Search that scales with you, your customers, and their data.

Ecommerce

Delight your shoppers with an experience they’ll love.

Media

Connect your audience with the content that matters most to them.

Learn more

Market leaders choose Algolia

Algolia allows us to provide our users with lightning-fast, typo-tolerant search no matter where our users are.

Fast and reliable search is a critical component to Strava's mission. Algolia has been a valuable partner in providing us with the tools to connect Strava athletes.

Our goal at 8Tracks is to push the barrier on what's possible in terms of music discovery. That wouldn't be possible without Algolia's API.

Every day, Stripe users around the world get fast and relevant answers to their questions when they search our developer documentation. Algolia's analytics provide us with useful insights that help continually improve our developer experience.

Martin Balas

Co-Founder & COO, Birchbox

Alex Macintosh

PM Growth at Strava

Rémi Gabillet

Co-Founder & CTO

Romain Huet

Developer Relations Lead

Code with confidence

Algolia obsesses over developer experience. Extensive documentation &
guides, an active community & 24/7 support make it a pleasure to work with Algolia.

Read the docs

Push your data

Ruby
my_index = Algolia::Index.new('contacts')
my_index.add_object :firstname => "Jimmie",
                    :lastname => "Barninger",
                    :company => "California Paint"
class Contact < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch do
    attribute :firstname, :lastname, :company
  end
end
myIndex = apiClient.init_index("contacts")
myIndex.add_object({"firstname": "Jimmie",
                    "lastname": "Barninger",
                    "company": "California Paint"})
from django.contrib.algoliasearch import AlgoliaIndex

class YourModelIndex(AlgoliaIndex):
    fields = ('firstname', 'lastname', 'company')
$myIndex = $apiClient->initIndex("contacts");
$myIndex->addObject([
    "firstname" => "Jimmie",
    "lastname" => "Barninger",
    "company" => "California Paint",
]);
/**
 *
 * @ORM\Entity
 *
 * @Algolia\Index()
 *
 */
class Contact
{
    /**
     * @var string
     *
     * @ORM\Column(name="firstname", type="string")
     * @Algolia\Attribute
     */
    protected $firstname;
}
const myIndex = apiClient.initIndex('contacts');
myIndex
  .addObject({
    firstname: 'Jimmie',
    lastname: 'Barninger',
    company: 'California Paint',
  })
  .then(content => console.log(content))
  .catch(err => console.error(err));
Index<Contact> index = client.initIndex("contacts", Contact.class);
index.addObject(
  new Contact()
    .setFirstname("Jimmie")
    .setLastname("Barninger")
    .setCompany("California Paint")
);
//For the DSL
import algolia.AlgoliaDsl._

//For basic Future support, you might want to change this by your own ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global

//case class of your objects
case class Contact(firstname: String,
                   lastname: String,
                   compagny: String)

val indexing: Future[Indexing] = client.execute {
  index into "contacts" `object` Contact("Jimmie", "Barninger", "California Paint")
}
object := algoliasearch.Object{
    "firstname": "Jimmie",
    "lastname":  "Barninger",
}
res, err = index.AddObject(object)
Index myIndex = apiClient.InitIndex("contacts");
        var jsonObject = new JObject();
        jsonObject.Add("firstname", "Jimmie");
        jsonObject.Add("lastname", "Barninger");
        jsonObject.Add("company", "California Paint");
        myIndex.AddObject(jsonObject);
let myIndex = apiClient.getIndex("contacts")
let n = [
    "firstname": "Jimmie",
    "lastname": "Barninger",
    "company": "California Paint"
]
myIndex.addObject(n)
Index myIndex = apiClient.initIndex("contacts");
    JSONObject jsonObject = new JSONObject()
            .put("firstname", "Jimmie")
            .put("lastname", "Barninger")
            .put("company", "California Paint");
    myIndex.addObjectAsync(jsonObject, null);

Back-end

Build search UX

Javascript
<div id="searchbox"></div>
<div id="hits"></div>

<script>
  const { searchBox, hits } = instantsearch.widgets;
  search.addWidget(searchBox({ container: "#searchbox" }));
  search.addWidget(hits({ container: '#hits' }));
  search.start();
</script>
const App = (
  <Search>
    <SearchBox />
    <Results />
    <Pagination />
    <RefinementList
      attributeName="company"
    />
  </Search>
);
<RelativeLayout
    xmlns:algolia="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.algolia.instantsearch.ui.views.SearchBox
        android:id="@+id/search_box"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  
    <com.algolia.instantsearch.ui.views.Stats
        android:id="@+id/search_box"
        android:layout_width="match_parent"
        android:layout_height="<wrap_co></wrap_co>ntent"/>

    <com.algolia.instantsearch.ui.views.Hits
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        algolia:itemLayout="@layout/hits_item"/>
</RelativeLayout>
<ais-index>
  <ais-search-box />
  <ais-results>
    <template scope="{ result }">
      <h2>{{ result.name }}</h2>
      <p>{{ result.description }}</p>
    </template>
  </ais-results>
  <ais-refinement-list attributeName="company" />
  <ais-pagination />
</ais-index>
@Component({
  selector: 'search-ui',
  template: `
    <input type="search" (input)="search()">
    <div *ngFor="let result of results">{{result.title.highlighted}}</div>
    `
})
export algolia(App);
import InstantSearch

override func viewDidLoad() {
    super.viewDidLoad()

    let searchBar = SearchBarWidget(frame: ...)
    let statsWidget = StatsLabelWidget(frame: ...)
    self.view.addSubview(searchBar)
    self.view.addSubview(statsWidget)

    // Add all widgets in view to InstantSearch
    InstantSearch.shared.registerAllWidgets(in: self.view)
}

Front-end